如何在subprocess.Popen中链式执行ssh、cd和命令

2 投票
2 回答
3217 浏览
提问于 2025-04-17 04:46

我正在尝试运行以下代码,但它没有成功。

    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'

否则你就是在告诉本地的命令行去执行这个命令。

撰写回答