我是一个新的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?
发布于 2016-02-12 06:23:41
我也遇到了同样的问题,在查看了this article和this 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中有说明,请注意注意警告。
发布于 2012-06-26 09:51:37
exec_command()是非阻塞的,它只是将命令发送到服务器,然后Python将运行以下代码。
我认为你应该等待命令执行结束,然后再做剩下的工作。
"time.sleep(10)“可能会有帮助,这需要”导入时间“。一些例子表明,您可以从stdout ChannelFile对象读取,或者简单地使用stdout.readlines(),它似乎可以读取来自服务器的所有响应,我猜这可能会有所帮助。
您的代码,上面两行exec_command,它们实际上是在不同的exec会话中运行。我不确定这对你的情况有没有影响。
我建议你看看demos文件夹中的演示,他们使用了Channel类,它有更好的API来为外壳和exec做阻塞/非阻塞发送。
发布于 2014-12-31 19:28:15
您最好在运行命令之前加载bash_profile。否则你可能会得到一个“命令找不到”的异常。
例如,我编写命令command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql'的目的是转储Mysql表
然后,我必须在转储命令之前通过键入. ~/.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)https://stackoverflow.com/questions/7002878
复制相似问题