Python paramiko 模块是Python中用于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则提供了更高级的异步处理方式。选择哪种方式取决于具体的需求和应用场景。