我试图从一个Linux机箱打开一个SSH管道,运行一些shell命令,然后关闭SSH。
我无法控制任何一个盒子上的包装,所以像fabric或paramiko这样的东西是不可能的。
我很幸运使用以下代码运行一个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>
基本上,如果你调用subprocess它创建一个本地子进程而不是远程进程,所以你应该与ssh进程交互。顺便提一下:但是请注意,如果你动态构建我的目录,它很容易被shell注入,那么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="")