我试图在单个ssh会话中运行几个命令,并将每个命令的输出保存在不同的文件中。
有效的代码(但它将所有输出保存在单个文件中)
conn = Popen(['ssh',host, "ls;uname -a;pwd"], stdin=PIPE, stdout = open ('/output.txt','w'))
mypassword = conn.communicate('password')
我正在尝试工作但不工作的代码...
cmd = ['ls', 'pwd', 'uname']
conn = Popen(['ssh',host, "{};{};{}".format(cmd[0],cmd[1],cmd[2])], stdin=PIPE, stdout = output.append('a'))
mypassword = conn.communicate('password')
print (output)
length = range(len(output))
print length
for i in output:
open("$i",'w')
和
cmd = ['ls', 'pwd', 'uname']
conn = Popen(['ssh',host, "{};{};{}".format(cmd[0],cmd[1],cmd[2])], stdin=PIPE, stdout = output())
mypassword = conn.communicate('password')
def output():
for i in cmd:
open(i,'w')
return
不确定这样做的最佳方法是什么。我应该将它保存在一个数组中,然后将每个项目保存在一个单独的文件中,还是应该调用一个能够执行此操作的函数? 请注意,我想要运行的命令没有像这里的示例中给出的那样小的输出(uname,pwd);它像tcpdump,lsof等一样大。
答案 0 :(得分:0)
单个ssh会话在远程主机上运行单个命令,例如/bin/bash
- 您可以将输入传递给该命令,以模拟在单个ssh会话中运行多个命令。 / p>
您的代码甚至不会运行一个命令。它有很多问题:
ssh
可以直接从终端读取密码(而不是其stdin流)。代码中的conn.communicate('password')
会写入ssh的stdin,因此ssh
无法获取密码。
有多种方法可以通过ssh进行身份验证,例如使用ssh密钥(无密码登录)。
stdout = output.append('a')
没有重定向ssh的标准输出,因为.append
列表方法返回None
。
它不会帮助您将多个命令的输出保存到不同的文件中。您可以将输出重定向到远程文件并稍后将其复制回来:ls >ls.out; uname -a >uname.out; pwd >pwd.out
。
(hacky)替代方案是使用内部流标记(echo <GUID>
)来区分不同命令的输出。如果输出可以是无限的;学习如何阅读子过程&#39;递增输出(不调用.communicate()
方法)。
for i in cmd: open(i,'w')
毫无意义。它打开(并立即关闭CPython)多个文件而不使用它们。
为了避免这些基本错误,请编写几个对本地文件进行操作的Python脚本。
答案 1 :(得分:0)
SYS_STATS={"Number of CPU Cores":"cat /proc/cpuinfo|grep -c 'processor'\n",
"CPU MHz":"cat /proc/cpuinfo|grep 'cpu MHz'|head -1|awk -F':' '{print $2}'\n",
"Memory Total":"cat /proc/meminfo|grep 'MemTotal'|awk -F':' '{print $2}'|sed 's/ //g'|grep -o '[0-9]*'\n",
"Swap Total":"cat /proc/meminfo|grep 'SwapTotal'|awk -F':' '{print $2}'|sed 's/ //g'|grep -o '[0-9]*'\n"}
def get_system_details(self,ipaddress,user,key):
_OutPut={}
values=[]
sshProcess = subprocess.Popen(['ssh','-T','-o StrictHostKeyChecking=no','-i','%s' % key,'%s@%s'%(user,ipaddress),"sudo","su"],
stdin=subprocess.PIPE, stdout = subprocess.PIPE, universal_newlines=True,bufsize=0)
for element in self.SYS_STATS1:
sshProcess.stdin.write("echo END\n")
sshProcess.stdin.write(element)
sshProcess.stdin.close()
for element in sshProcess.stdout:
if element.rstrip('\n')!="END":
values.append(element.rstrip('\n'))
mapObj={k: v for k, v in zip(self.SYS_STATS_KEYS, values)}
return mapObj