首页 > 解决方案 > 通过本地 python 脚本在服务器中运行命令

问题描述

我想通过本地机器上的 python3 脚本在服务器 shell 中运行一批 bash 命令(全部一起)。我不在笔记本电脑上运行 python3 脚本的原因是我无法在服务器上创建相同的环境,并且我想在执行脚本时保留我机器上的设置。我想做的是:-在本地运行python命令-在服务器上的某个点运行这些命令-等待服务器执行结束-继续运行python脚本(这将在循环中完成)

我正在尝试将所有命令放在 bash 脚本中ssh_commands.sh并使用以下命令:

subprocess.call('cat ssh_commands.sh | ssh -T -S {} -p {} {}'.format(socket, port, user_host).split(),shell=True)

但是当脚本的执行到达该行时,会卡住直到subprocess.call超时。无论如何,脚本的执行不会花费那么多。之前停止脚本的唯一方法是通过Ctrl+C

我也尝试在~/.ssh/config文件中设置 ssh 连接,但我得到了相同的结果。

我知道 ssh 连接工作正常,如果我ssh_commands.sh手动在服务器上运行,它运行没有任何问题。

有人可以建议:-修复我正在尝试做的事情的方法-实现上面写的最终结果的更好方法-一些调试方法来找出可能是什么问题提前谢谢你

标签: python-3.xbashsshserver

解决方案


为了扩展我的评论 - 我还没有用 ssh 测试你的具体情况,可能还有其他并发症)。在我已经知道可行的情况下,这实际上是从我自己的代码中复制/粘贴的。

from subprocess import Popen, PIPE, DEVNULL
from shlex import split as sh_split

proc1 = Popen(sh_split(file_cmd1), stdout=PIPE)
proc2 = Popen(file_cmd2, shell=True, stdin=proc1.stdout, stdout=PIPE)
proc1.stdout.close()

我有一个特定的理由在第二个中使用,但我猜shell=True你应该也可以在那里使用。shlex.split

基本上,您正在运行一个命令,输出到“PIPE”,然后将其用作第二个命令的输入。


推荐阅读