【问题标题】:(Python) Connecting subprocess pipes/Running command through a jump box(Python) 通过跳转框连接子进程管道/运行命令
【发布时间】:2013-03-24 06:10:18
【问题描述】:

所以我想使用 python 在服务器上运行命令,但要做到这一点,我必须通过另一个框。我通过子进程运行 ssh 连接到第一个盒子。但是,我不确定如何进入第二个框并通过该子进程对象运行命令。

我的子流程声明:

command = "ssh servername"
sshConnection = subprocess.Popen(command.split(),stderr=subprocess.PIPE
                                  ,stdout=subprocess.PIPE,stdin=subprocess.PIPE)

我能想到的唯一方法:

以某种方式连接两个子进程命令的管道? 先建立一个SSH隧道然后通过它运行命令? 还有其他想法吗?我是不是搞错了?

【问题讨论】:

    标签: python command subprocess


    【解决方案1】:

    由于您使用子进程执行大量 ssh,我建议您应该使用 Fabric

    【讨论】:

      【解决方案2】:

      怎么样:

      cmd = "mycmd myarg1 myarg2"
      ssh_command = "ssh servername %s" % cmd
      sshConnection = subprocess.Popen(ssh_command.split(),stderr=subprocess.PIPE
                                        ,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
      

      当然,如果命令包含特殊字符,您还需要对命令进行 shell 转义。

      我个人喜欢一个更简洁的替代方案,即使用plumbum。您可以嵌套远程 (ssh) 命令。

      【讨论】:

      • 谢谢!唯一的问题是我想保持 SSH 会话打开,这样我就可以继续发送命令。我担心每次我想运行命令时重新建立 SSH 会话的资源使用情况。另外,我不能为这个项目使用第三方模块:/
      【解决方案3】:

      如果“通过另一个盒子”是指“启动从跳转框到服务器的 ssh 连接”,请尝试:

      command = "ssh jumpbox ssh servername /bin/ls -l"
      sshConnection = subprocess.Popen(command.split(),stderr=subprocess.PIPE
                                    ,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
      

      【讨论】:

      • 执行后不关闭ssh连接,可以继续发送命令和抓取输出吗?
      猜你喜欢
      • 1970-01-01
      • 2016-03-19
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2015-07-18
      • 2011-12-22
      相关资源
      最近更新 更多