问题描述
我正在尝试打开从一个 Linux 机器到另一个机器的 SSH 管道,运行一些 shell 命令,然后关闭 SSH.
I am trying to open an SSH pipe from one Linux box to another, run a few shell commands, and then close the SSH.
我无法控制任何一个盒子上的包裹,所以像 fabric 或 paramiko 这样的东西是不可能的.
I don't have control over the packages on either box, so something like fabric or paramiko is out of the question.
我很幸运地使用以下代码运行了一个 bash 命令,在本例中为正常运行时间",但我不确定如何一个接一个地发出命令.我期待这样的事情:
I have had luck using the following code to run one bash command, in this case "uptime", but am not sure how to issue one command after another. I'm expecting something like:
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()
我缺少子流程模块的哪一部分?
What part of the subprocess module am I missing?
谢谢
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命令
basically if you call subprocess it creates a local subprocess not a remote oneso you should interact with the ssh process. so something along this lines:but be aware that if you dynamically construct my directory it is suceptible of shell injection then END line should be a unique identifierTo avoid the uniqueness of END line problem, an easiest way would be to use different ssh command
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="")
这篇关于Python 子进程 - 通过 SSH 运行多个 shell 命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!