使用popen在单个ssh会话中运行多个命令,并将输出保存在单独的文件中

时间:2015-01-04 19:28:46

标签: python ssh popen

我试图在单个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等一样大。

2 个答案:

答案 0 :(得分:0)

单个ssh会话在远程主机上运行单个命令,例如/bin/bash - 您可以将输入传递给该命令,以模拟在单个ssh会话中运行多个命令。 / p>

您的代码甚至不会运行一个命令。它有很多问题:

  1. ssh可以直接从终端读取密码(而不是其stdin流)。代码中的conn.communicate('password')会写入ssh的stdin,因此ssh无法获取密码。

    有多种方法可以通过ssh进行身份验证,例如使用ssh密钥(无密码登录)。

  2. stdout = output.append('a')没有重定向ssh的标准输出,因为.append列表方法返回None

    它不会帮助您将多个命令的输出保存到不同的文件中。您可以将输出重定向到远程文件并稍后将其复制回来:ls >ls.out; uname -a >uname.out; pwd >pwd.out

    (hacky)替代方案是使用内部流标记(echo <GUID>)来区分不同命令的输出。如果输出可以是无限的;学习如何阅读子过程&#39;递增输出(不调用.communicate()方法)。

  3. 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