如何使用paramiko执行多行并只读取它们的输出

时间:2015-06-17 22:03:49

标签: python paramiko

如何使用Paramiko执行多个命令并将输出读回我的python脚本?

这个问题在理论上是在这里回答How do you execute multiple commands in a single session in Paramiko? (Python),但在我看来答案是不正确的。

问题在于,当您阅读标准输出时,它会读取终端的全部内容,包括您“键入”到终端中的程序。

试试吧(这基本上是上面一个帖子的复制粘贴):

import paramiko  
machine = "you machine ip"
username = "you username"
password = "password"
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(machine, username = username, password = password)
channel = client.invoke_shell()
stdin = channel.makefile('wb')
stdout = channel.makefile('rb')
stdin.write('''
cd tmp
ls
exit
''')
print stdout.read()
stdout.close()
stdin.close()
client.close()

所以我的问题是,如何执行多个命令并只读取这些命令的输出,而不是输入“输入”和输出?

提前感谢您的帮助和时间。

3 个答案:

答案 0 :(得分:2)

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
target_host = 'x.x.x.x'
target_port = 22  
target_port = 22
pwd = ':)'
un = 'root'
ssh.connect( hostname = target_host , username = un, password =pwd)
#Now exeute multiple commands seperated by semicolon
stdin, stdout, stderr = ssh.exec_command('cd mydir;ls')
print stdout.readlines()

答案 1 :(得分:0)

您正在查看键入的命令,因为shell会回显它们。您可以通过运行

关闭此功能
stty -echo

在你的其他命令之前。

另一种方法是不调用交互式shell,而只是直接运行命令,除非您特别需要交互式shell的其他原因。比如你可以说

client.exec_command('/bin/sh -c "cd /tmp && ls")

如果你想要一个shell而没有pty,你可以试试

client.exec_command('/bin/sh')

我认为这也会抑制回声。

答案 2 :(得分:0)

这应该有效:

# Explicitly provide key, ip address and username
from paramiko import SSHClient, AutoAddPolicy

result = []

def ssh_conn():
    client = SSHClient()
    client.load_system_host_keys()
    client.set_missing_host_key_policy(AutoAddPolicy())

    client.connect('<host_IP_address>', username='<your_host_username>', key_filename='<private_key_location>')

    stdin, stdout, stderr = client.exec_command('ls -la')

    for each_line in stdout:
        result.append(each_line.strip('\n'))
    
    client.close()

ssh_conn()


for each_line in result:
    print(each_line.strip())