python-3.x - 通过本地 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
手动在服务器上运行,它运行没有任何问题。
有人可以建议:-修复我正在尝试做的事情的方法-实现上面写的最终结果的更好方法-一些调试方法来找出可能是什么问题提前谢谢你
解决方案
为了扩展我的评论 - 我还没有用 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”,然后将其用作第二个命令的输入。
推荐阅读
- gitlab - 使用 Gitlab CI 从 Master 扫描容器图像(带有标签的图像:最新)
- json - Flutter:http包-获取请求失败
- django - 在 postgreSQL 中一个表可以有多少个外键?
- java - 如何获取该元素在数组中的索引?
- git - git 有没有办法在主分支中有一个文件夹,其中包含所有以前版本的文件夹?
- kotlin - 如何在不创建新实例 Kotlin 的情况下获取变量
- android - 显示活动时Android会做一些事情
- angular - ngx-mat-file-input mat-form-field 必须包含一个 MatFormFieldControl
- reactjs - 在我的情况下(在课堂内)如何正确使用模态?
- printing - 可以使用 DDS 在打印文件中打印/绘制圆圈吗?