Python2.7:ssh.exec_command没有执行任何命令

时间:2016-06-24 11:36:02

标签: python python-2.7 ssh paramiko

我正在使用SSH Channel向远程主机创建paramiko。但是,当我尝试使用ssh_object.exec_command执行任何命令时,该命令似乎无法执行。

此函数创建我的ssh处理程序:

def ssh_connect(ip,user,pwd):
    '''
    This function will make an ssh connection to the ip using the credentials passed and return the handler
    Args:
        ip: IP Address of the box into which ssh has to be done
        user: User name of the box to which ssh has to be done
        pass: password of the box to which ssh has to be done
    Returns:
        An ssh handler
    '''
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, username=user, password=pwd)  
    return ssh

这就是我使用处理程序的地方:

ssh_obj = ssh_connect(ip, username, password)
folder = "/var/xyz/images/" + build_number
command = "mkdir " + folder
ssh_stdin, ssh_stdout, ssh_stderr = ssh_obj.exec_command(command)

当我转到远程计算机时,文件夹尚未创建。同样,我也尝试读取ls命令的输出。当我ssh_stdout.read()时,没有回复。

我哪里错了?

2 个答案:

答案 0 :(得分:1)

我在使用paramiko 2.0.2的CentOS 7服务器上遇到了同样的问题。 paramiko github主页的例子起初并不适用于我:https://github.com/paramiko/paramiko#demo

import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=self.server['host'], username=self.server['username'], password=self.server['password'])
stdin, stdout, stderr = client.exec_command('ls')
for line in stdout:
    print '... ' + line.strip('\n')
client.close()

更新远程系统后,上面的示例开始工作。但不是我写的代码(类似于OP的代码)这提出了一个想法,我需要在执行后立即读取stdout缓冲区。所以我修改了代码来做它并且它有效。根据OP的代码,它看起来像

ssh_obj = ssh_connect(ip, username, password)
folder = "/var/xyz/images/" + build_number
command = "mkdir " + folder
ssh_stdin, ssh_stdout, ssh_stderr = ssh_obj.exec_command(command)
# Read the buffer right after the execution:
ssh_stdout.read()

有趣的是,稍后(在关闭客户端之后)读取缓冲区不会给你什么。

答案 1 :(得分:0)

ssh_exec_command行之后;添加以下条件。

仅在命令(shell)完全执行后,循环才会退出。

while int(stdout.channel.recv_exit_status()) != 0: time.sleep(1)