shell 运行远程长运行命令与Paramiko,饲料与一些输入,并把它放在后台

velaa5lx  于 2023-01-13  发布在  Shell
关注(0)|答案(1)|浏览(109)

我的远程服务器上有一个长时间运行的程序,我想从Paramiko开始。
我知道如何在后台启动一个程序(例如nohup),但我的程序首先需要一些用户输入。在正常的SSH会话中,我会通过终端交互地传递这些输入,然后分离(Ctrl+Z,bgdetach),但我不能用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我如何将用户输入发送到一个我想在后台继续运行的程序?

rhfm7lfc

rhfm7lfc1#

您当前正在两个单独的shell示例中执行MyCommandbg; disown,这就是bg; disownMyCommand没有影响的原因。
如果你真的想用这种方式模拟交互式shell的特性,你需要在一个真正的shell示例中执行这两个命令,为此你需要使用SSHClient.invoke_shell而不是SSHClient.exec_command
虽然一般来说,这不是一个好主意。
What is the difference between exec_command and send with invoke_shell() on Paramiko?
如果该程序是你的,修改它,以允许从命令行输入。
如果无法修改它,请使用壳构造提供输入,如下所示:

ssh.exec_command('nohup echo MyData | MyCommand >/dev/null 2>&1 &')

也许你需要在命令周围加上引号,我不确定,这里的“操作符优先级”是什么。

相关问题