基本的paramiko exec_command帮助

时间:2011-08-09 20:57:09

标签: python paramiko

我是一名新的paramiko用户,并且在使用paramiko在远程服务器上运行命令时遇到困难。我想导出一个路径,并在后台运行一个名为tophat的程序。我可以使用paramiko.sshclient()正常登录,但我的代码exec_command没有结果。

stdin, stdout, sterr = ssh.exec_command('export PATH=$PATH:/proj/genome/programs
/tophat-1.3.0/bin:/proj/genome/programs/cufflinks-1.0.3/bin:/proj/genome/programs/
bowtie-0.12.7:/proj/genome/programs/samtools-0.1.16')

stdin, stdout, sterr = ssh.exec_command('nohup tophat -o /output/path/directory -I 
10000 -p 8 --microexon-search -r 50 /proj/genome/programs/bowtie-0.12.7/indexes
/ce9 /input/path/1 /input/path/2 &')

没有nohup.out文件,python只是转到下一行,没有错误消息。我也试过没有nohup,结果是一样的。我试图关注this paramiko tutorial

我错误地使用exec_command吗?

3 个答案:

答案 0 :(得分:8)

我也遇到了同样的问题,在查看this articlethis answer后,我发现解决方法是调用频道的recv_exit_status()方法。这是我的代码:

import paramiko
import time

cli = paramiko.client.SSHClient()
cli.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
cli.connect(hostname="10.66.171.100", username="mapping")
stdin_, stdout_, stderr_ = cli.exec_command("ls -l ~")
# time.sleep(2)    # Previously, I had to sleep for some time.
stdout_.channel.recv_exit_status()
lines = stdout_.readlines()
for line in lines:
    print line

cli.close()

现在我的代码将被阻止,直到远程命令完成。这个方法解释为here,请注意警告。

答案 1 :(得分:7)

exec_command()是非阻塞的,它只是将命令发送到服务器,然后Python将运行以下代码。

我认为你应该等待命令执行结束,然后继续工作。

“time.sleep(10)”可能会有所帮助,这需要“导入时间”。 一些示例显示您可以从stdout ChannelFile 对象中读取,或者只是使用 stdout.readlines(),它似乎从服务器读取所有响应,猜测这可能帮助

您的代码,上面两行 exec_command ,它们实际上是在不同的exec会话中运行的。我不确定这对你的情况是否有影响。

我建议你看一下demos文件夹中的演示,他们正在使用Channel类,它有更好的API来为shell和exec执行阻塞/非阻塞发送。

答案 2 :(得分:-2)

最好在运行命令之前加载bash_profile。否则,您可能会收到一个未找到的命令'异常。

例如,我为了转储Mysql表而编写命令command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql'

然后我必须通过键入. ~/.profile; .~/.bash_profile;在该转储命令之前手动加载bash_profile。

实施例

my_command  = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql;'

pre_command = """
. ~/.profile;
. ~/.bash_profile;
"""

command = pre_command + my_command

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