通过本地python脚本在服务器中运行命令

时间:2019-10-28 08:57:14

标签: python-3.x bash ssh server

我想通过本地计算机上的python3脚本在服务器外壳中运行一批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,它可以毫无问题地运行。

有人可以建议: -一种修复我正在尝试做的事情的方法 -获得上述最终结果的更好方法 -找出问题原因的一些调试方法 预先谢谢你

1 个答案:

答案 0 :(得分:0)

扩大我的评论-我还没有使用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”,然后将其用作第二个命令的输入。