Python SSH 连接不会在 Linux 机器上运行特定命令



我认为这对其他人很有用

我有一个python脚本,它应该在linux机器上运行一些.sh脚本,在那里我只能使用SSH进行连接
问题是,当我尝试运行.sh脚本时,python脚本会被卡住,但我可以运行多个其他命令,如:cd, rm, mv, cp, ls
下面的代码是我的第一次尝试:

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")}')

我也尝试了SSHLibrary,也在机器上尝试了不同的.sh脚本(甚至一些测试脚本只包含echo "test"(,但都不起作用

奇怪的是,使用Cygwin连接使用SSH,我可以手动运行这些脚本,而不会出现问题。

因此,经过一些研究,我发现运行.sh脚本需要密码,而我没有提供密码。在执行发送的命令后,需要提供的任何类型的输入都会出现相同的行为(如:y/npaths等(

因此,仍然有一件奇怪的事情,为什么它使用Python SSH连接而不在Cygwin中请求密码。看起来通过Cygwin连接会创建一个会话,该会话不需要某些操作的密码,但使用Python(SSHLibrary或Paramiko(会创建有点不同的会话,因此需要密码(取决于机器上的配置(-It人员的奇怪设置

因此,上面的代码变成了下面的代码,它工作得很好(请注意使用stdin.channel.shutdown_write()行。看起来如果你不关闭该通道,你使用write()发送的输入实际上不会被发送(:

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("yourAdditionalInfon") # 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")}')

相关内容

  • 没有找到相关文章

最新更新