我认为这对其他人很有用
我有一个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/n
、paths
等(
因此,仍然有一件奇怪的事情,为什么它使用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")}')