优草派  >   Python

解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题

张鹏            来源:优草派

Python paramiko 模块是Python中用于ssh连接的一个模块,常用于远程执行命令等。但是在使用nohup命令时有可能会出现不生效的问题。本文将从多个角度分析这个问题。

解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题

问题分析:

在使用paramiko模块远程执行ssh命令时,在命令前加上nohup,希望让命令在后台执行,但是实际执行中发现nohup命令并不生效,命令在远程主机执行后会随着连接的关闭而结束。这个问题的主要原因是ssh连接的session结束后,nohup命令中使用的管道(STDIN、STDOUT、STDERR)会被自动关闭,导致命令无法正常执行。那么如何解决这个问题呢?

解决方案:

1. 将命令放到脚本中执行。通过将命令放到脚本中,再通过nohup命令执行脚本,可以避免管道被关闭的问题。

2. 使用popen运行nohup命令。通过使用subprocess.Popen()方法运行nohup命令,可以创建一个与当前程序完全独立的子进程环境,避免管道被关闭的问题,代码示例:

```python

import paramiko

import subprocess

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname='hostname', port=22, username='username', password='password')

command = 'nohup ls -l / > /tmp/test.out &'

ssh.exec_command(command)

stdin, stdout, stderr = ssh.exec_command('cat /tmp/test.out')

for line in stdout:

print('line:', line)

ssh.close()

# run command with popen

popen_command = ['nohup', 'ls', '-l', '/', '>', '/tmp/test.out', '&']

subprocess.Popen(popen_command)

```

3. 使用asyncssh或paramiko-channel解决。paramiko-channel提供了一个类ssh的交互式远程连接方法,可以实现在ssh连接后设置keepalive的机制。而asyncssh则提供了一个高级的异步ssh库,支持高度自定义的异步事件处理。

总结:

通过以上三种解决方案,可以解决Python paramiko模块远程执行ssh命令nohup不生效的问题。其中脚本和popen运行命令的方式比较简单易用,而asyncssh则提供了更高级的异步处理方式。选择哪种方式取决于具体的需求和应用场景。

【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。
TOP 10
  • 周排行
  • 月排行