python paramiko ssh

use*_*764 16 python ssh paramiko

我是python的新手.我写了一个脚本来连接到主机并执行一个命令

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=pw)

print 'running remote command'

stdin, stdout, stderr = ssh.exec_command(command)
stdin.close()

for line in stdout.read().splitlines():
    print '%s$: %s' % (host, line)
    if outfile != None:
        f_outfile.write("%s\n" %line)

for line in stderr.read().splitlines():
    print '%s$: %s' % (host, line + "\n")
    if outfile != None:
        f_outfile.write("%s\n" %line)

ssh.close()

if outfile != None:
    f_outfile.close()

print 'connection to %s closed' %host

except:
   e = sys.exc_info()[1]
   print '%s' %e
Run Code Online (Sandbox Code Playgroud)

当远程命令不需要tty时工作正常.我找到了一个与Paramiko 一起使用的invoke_shell示例嵌套SSH会话.我对这个解决方案不满意,因为如果服务器有一个未在我的脚本中指定的提示 - >无限循环或脚本中的指定提示是返回文本中的字符串 - >不会收到所有数据.是否有更好的解决方案,也许stdout和stderr像我的脚本一样发回?

The*_*One 20

您可以在http://docs.paramiko.org/en/stable/index.html找到大量的paramiko API文档

我使用以下方法在受密码保护的客户端上执行命令:

import paramiko
import sys

nbytes = 4096
hostname = 'hostname'
port = 22
username = 'username' 
password = 'password'
command = 'ls'

client = paramiko.Transport((hostname, port))
client.connect(username=username, password=password)

stdout_data = []
stderr_data = []
session = client.open_channel(kind='session')
session.exec_command(command)
while True:
    if session.recv_ready():
        stdout_data.append(session.recv(nbytes))
    if session.recv_stderr_ready():
        stderr_data.append(session.recv_stderr(nbytes))
    if session.exit_status_ready():
        break

print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)

session.close()
client.close()
Run Code Online (Sandbox Code Playgroud)


Rai*_*ore 18

接受的答案有问题,它有时(随机)从服务器带来剪辑的响应.我不知道为什么,我没有调查接受答案的错误原因,因为这段代码对我来说非常合适:

import paramiko

ip='server ip'
port=22
username='username'
password='password'

cmd='some useful command' 

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)

stdin,stdout,stderr=ssh.exec_command(cmd)
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

stdin,stdout,stderr=ssh.exec_command('some really useful command')
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)
Run Code Online (Sandbox Code Playgroud)

  • 以防万一有人希望使用上述方法捕获退出代码 - stdout.channel.recv_exit_status() (2认同)