通过 Python 进行 SSH 连接无法运行 Shell 脚本

通过 Python 进行 SSH 连接无法运行 Shell 脚本

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 脚本,也是同样的问题

有两件奇怪的事情:

  1. 使用终端通过 SSH 连接并手动运行命令就可以正常工作(使用相同的凭据)
  2. 已设置 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")}')

相关内容