如何在subprocess.Popen中链式执行ssh、cd和命令
我正在尝试运行以下代码,但它没有成功。
p = subprocess.Popen("ssh root@IP cd /opt/msys/pe2/bin;./perlscript.pl; -a file.csv",
shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
OR:
p = subprocess.Popen("ssh root@IP /opt/msys/pe2/bin/perlscript.pl; -a file.csv",
shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
第一个问题是,我似乎无法在ssh之后连接多个命令。第二个问题是,如果我直接调用文件,-a这个参数找不到那个文件,因为我不在那个目录里。我本来希望能用Popen的cwd参数,但因为我没有通过ssh连接到服务器,所以这也失败了。
2 个回答
2
使用子进程(Subprocess)并不是处理这种情况的最佳选择。所有的进程监控选项,比如 wait() 和 terminate(),都是针对本地进程(也就是你的ssh会话),而不是远程脚本(比如perl脚本)正在发生的事情。
我使用 fabric 来处理运行远程脚本的任务。这样使用起来比用 subprocess 把命令拼在一起要简单得多。
4
试着把发送给ssh的命令用引号括起来:
subprocess.Popen('ssh root@IP "cd /opt/msys/pe2/bin;./perlscript.pl;" -a file.csv'
否则你就是在告诉本地的命令行去执行这个命令。