web-dev-qa-db-ja.com

Pythonサブプロセス-SSH経由で複数のシェルコマンドを実行します

あるLinuxボックスから別のLinuxボックスへのSSHパイプを開き、いくつかのシェルコマンドを実行してから、SSHを閉じようとしています。

私はどちらのボックスのパッケージも制御できないので、fabricやparamikoのようなものは問題外です。

次のコードを使用して1つのbashコマンド(この場合は「uptime」)を実行することができましたが、次々にコマンドを発行する方法がわかりません。私は次のようなものを期待しています:

sshProcess = subprocess.call('ssh ' + <remote client>, <subprocess stuff>)
lsProcess = subprocess.call('ls', <subprocess stuff>)
lsProcess.close()
uptimeProcess = subprocess.call('uptime', <subprocess stuff>)
uptimeProcess.close()
sshProcess.close()

サブプロセスモジュールのどの部分が欠落していますか?

ありがとう

pingtest = subprocess.call("ping -c 1 %s" % <remote client>,Shell=True,stdout=open('/dev/null', 'w'),stderr=subprocess.STDOUT)
if pingtest == 0:
  print '%s: is alive' % <remote client>
  # Uptime + CPU Load averages
  print 'Attempting to get uptime...'
  sshProcess = subprocess.Popen('ssh '+<remote client>, Shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  sshProcess,stderr = sshProcess.communicate()
  print sshProcess
  uptime = subprocess.Popen('uptime', Shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  uptimeProcess,stderr = uptimeProcess.communicate()
  uptimeProcess.close( )
  print 'Uptime         : ' + uptimeProcess.split('up ')[1].split(',')[0]
else:
  print "%s: did not respond" % <remote client>
7
user2978190

基本的に、サブプロセスを呼び出すと、リモートサブプロセスではなくローカルサブプロセスが作成されるため、sshプロセスを操作する必要があります。したがって、この行に沿った何か:しかし、動的にディレクトリを構築する場合、シェルインジェクションの影響を受けやすいことに注意してください。END行は一意の識別子である必要があります。END行の問題の一意性を回避するには、別のsshコマンドを使用するのが最も簡単な方法です。

from __future__ import print_function,unicode_literals
import subprocess

sshProcess = subprocess.Popen(['ssh', 
                               <remote client>],
                               stdin=subprocess.PIPE, 
                               stdout = subprocess.PIPE,
                               universal_newlines=True,
                               bufsize=0)
sshProcess.stdin.write("ls .\n")
sshProcess.stdin.write("echo END\n")
sshProcess.stdin.write("uptime\n")
sshProcess.stdin.write("logout\n")
sshProcess.stdin.close()


for line in sshProcess.stdout:
    if line == "END\n":
        break
    print(line,end="")

for line in sshProcess.stdout:
    if line == "END\n":
        break
    print(line,end="")
14
Xavier Combelle