如何通过ssh连接执行python或bash脚本并获取返回码

时间:2013-12-19 12:50:20

标签: linux bash python-2.7 ssh paramiko

我在\ tmp \ _的位置有一个python文件。这个文件打印出来并返回退出代码22.我能用putty完美地运行这个脚本但是不能用paramiko模块来运行。

这是我的执行代码

import paramiko    
def main():
    remote_ip = '172.xxx.xxx.xxx'
    remote_username = 'root'
    remote_password = 'xxxxxxx'
    remote_path = '/tmp/ab.py'
    sub_type = 'py' 
    commands = ['echo $?']
    ssh_client = paramiko.SSHClient()
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(remote_ip, username=remote_username,password=remote_password)
    i,o,e = ssh_client.exec_command('/usr/bin/python /tmp/ab.py') 
    print o.read(), e.read()
    i,o,e = ssh_client.exec_command('echo $?')
    print o.read(), e.read()


main()

这是我在远程机器上执行的python脚本

#!/usr/bin/python
import sys
print "hello world"
sys.exit(20)

我无法理解我的逻辑中究竟出了什么问题。另外当我做cd \ tmp然后ls时,我仍然会在根文件夹中。

2 个答案:

答案 0 :(得分:2)

以下示例通过ssh运行命令,然后获取命令stdout,stderr并返回代码:

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='hostname', username='username', password='password')

channel = client.get_transport().open_session()
command = "import sys; sys.stdout.write('stdout message'); sys.stderr.write(\'stderr message\'); sys.exit(22)"
channel.exec_command('/usr/bin/python -c "%s"' % command)
channel.shutdown_write()

stdout = channel.makefile().read()
stderr = channel.makefile_stderr().read()
exit_code = channel.recv_exit_status()

channel.close()
client.close()

print 'stdout:', stdout
print 'stderr:', stderr
print 'exit_code:', exit_code

希望有所帮助

答案 1 :(得分:0)

每次运行exec_command时,都会启动一个新的bash子进程。

这就是为什么当你运行类似的东西时:

exec_command("cd /tmp");
exec_command("mkdir hello");

dir“hello”是在dir中创建的,而不是在tmp中创建的。

尝试在同一个exec_command调用中运行多个命令。

另一种方法是使用python的os.chdir()