我Shell
在一台Linux
机器上有一个必须执行的脚本。我唯一能建立的连接是结束SSH
,但它不会运行该脚本。
所以我有一个应用程序实际上必须执行此操作,所以下面是我的代码:
client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")
stdin, stdout, stderr = client.exec_command("/test.sh -h")
print(f'STDOUT: {stdout.read().decode("utf8")}')
print(f'STDERR: {stderr.read().decode("utf8")}')
上面的代码成功建立了连接并发送了命令。问题是没有发生任何事情,它卡住了。我也尝试了一些测试 Shell 脚本,也是同样的问题
有两件奇怪的事情:
- 使用终端通过 SSH 连接并手动运行命令就可以正常工作(使用相同的凭据)
- 已设置 2 个连接节点。第二个节点没有我尝试执行的服务,但它可以运行 Shell 脚本(我已尝试使用一些测试脚本)。
什么可能是导致这种情况发生的提示或问题?有一个团队负责处理这些问题,但我不知道该让他们检查什么。
到目前为止我尝试过的事情:
- 使用不同的库(SSHLibrary、Paramiko)
- 试图逃跑
/test.sh -h
- 试图逃跑
sh /test.sh -h
- 试图逃跑
cd / && test.sh -h
- 试图逃跑
cd / && sh test.sh -h
- 试图逃跑
/usr/bin/sh test.sh -h
- 试图逃跑
cd / && /usr/bin/sh test.sh -h
- 尝试上述所有不同的 Shell 脚本(仅用于测试)它们的行为都相同,没有结果,没有操作。
- 尝试运行一个简单的命令,如
cd /etc && ls
-> 这有效
再次,在终端工作,并且脚本在测试sh
脚本上的另一个连接节点上运行良好(但那里我没有这项服务,而且我也无法在那里进行设置)。
答案1
找到问题了。
每当我尝试运行脚本时,它都会要求我输入密码(IT 团队的奇怪设置)。所以我的脚本无法运行脚本的命令(但它能够运行不需要密码或额外确认的其他命令。因此,这适用于您想要执行的任何需要用户在命令后输入的操作(例如 y/n 或密码或提供路径等)
因此,如果您遇到此问题,请尝试查看日志(在我的情况下,日志显示未提供密码)
而解决方案是使用脚本来发送附加命令(任何特定操作所需的输入,如:密码、y/n 等)
client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect("myHost", username="myUsername", key_filename="SSH_Key_Location")
stdin, stdout, stderr = client.exec_command("/test.sh -h")
stdin.write("yourAdditionalInfo\n") # Don't forget about the \n; This line can be used multiple times, to send multiple lines
stdin.flush()
stdin.channel.shutdown_write() #! This is really important. Without closing the write channel, the lines sent with **write** will not have effect
print(f'STDOUT: {stdout.read().decode("utf8")}')
print(f'STDERR: {stderr.read().decode("utf8")}')