如何使用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()
所以我的问题是,如何执行多个命令并只读取这些命令的输出,而不是输入“输入”和输出?
提前感谢您的帮助和时间。
答案 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())