我的远程服务器上有一个长时间运行的程序,我想从Paramiko开始。
我知道如何在后台启动一个程序(例如nohup
),但我的程序首先需要一些用户输入。在正常的SSH会话中,我会通过终端交互地传递这些输入,然后分离(Ctrl+Z,bg
,detach
),但我不能用Paramiko这样做。
以下是我目前所做的尝试:
stdin, stdout, stderr = ssh.exec_command('MyCommand', get_pty=True)
stdin.channel.send(b'MyData\r')
stdin.channel.send(b'\x1A') # This is Ctrl+Z
ssh.exec_command('bg; disown')
ssh.close()
但是当SSH连接关闭时,远程程序也停止运行。2我如何将用户输入发送到一个我想在后台继续运行的程序?
1条答案
按热度按时间rhfm7lfc1#
您当前正在两个单独的shell示例中执行
MyCommand
和bg; disown
,这就是bg; disown
对MyCommand
没有影响的原因。如果你真的想用这种方式模拟交互式shell的特性,你需要在一个真正的shell示例中执行这两个命令,为此你需要使用
SSHClient.invoke_shell
而不是SSHClient.exec_command
。虽然一般来说,这不是一个好主意。
What is the difference between exec_command and send with invoke_shell() on Paramiko?
如果该程序是你的,修改它,以允许从命令行输入。
如果无法修改它,请使用壳构造提供输入,如下所示:
也许你需要在命令周围加上引号,我不确定,这里的“操作符优先级”是什么。