我正在使用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()
时,没有回复。
我哪里错了?
答案 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)