SSH命令立即退出,而不是作为python子进程保持活动状态

SSH命令立即退出,而不是作为python子进程保持活动状态,python,linux,ssh,subprocess,Python,Linux,Ssh,Subprocess,我正在尝试使用Python设置一个反向SSH隧道。一些以系统启动的软件将管理它并杀死它,或者根据它接收到的命令启动它 我编写了一个类来管理反向隧道,如下所示: # imports omitted for brevity class SshProcess(): def __init__(self): self.process = None def start(self, port): if self.process is not None:

我正在尝试使用Python设置一个反向SSH隧道。一些以系统启动的软件将管理它并杀死它,或者根据它接收到的命令启动它

我编写了一个类来管理反向隧道,如下所示:

# imports omitted for brevity
class SshProcess():
    def __init__(self):
        self.process = None

    def start(self, port):
        if self.process is not None:
            return None

        command = [
            # 'sudo',
            'ssh',
            '-R {port}:127.0.0.1:22'.format(port=port),
            '{username}@{host}'.format(username=config.USERNAME, host=config.HOST),
            '-o StrictHostKeyChecking=no'
        ]

        def threaded_popen():
            self.process = subprocess.Popen(
                (' '.join(command)), # command, # shlex.split(command),
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                shell=True
            )

            self.process.wait()

            logger.info('Reverse SSH to {username}@{host} has exited'.format(username=config.USERNAME, host=config.HOST))

        logger.debug('command raw: {command}'.format(command=command))
        logger.debug('command joined: {command}'.format(command=(' '.join(command))))

        self.thread = Thread(target=threaded_popen)

        self.thread.start()

    def stop(self):
        if self.process is not None:
            try:
                self.process.communicate(input="exit\n")
                self.process.terminate()
            except (ValueError, OSError) as e:
                logger.warning('Closing reverse SSH raised {error}'.format(error=e.__class__.__name__))
                logger.warning(e)

        self.process = None

        if self.thread is not None:
            self.thread.join()
现在,无论何时调用start,我都会收到以下日志语句:

2017-06-28 14:32:46,343 - module - DEBUG - command raw: ['ssh', '-R 4000:127.0.0.1:22', 'tich@192.168.0.88', '-o StrictHostKeyChecking=no']
2017-06-28 14:32:46,344 - module - DEBUG - command joined: ssh -R 4000:127.0.0.1:22 tich@192.168.0.88 -o StrictHostKeyChecking=no
2017-06-28 14:32:46,797 - module - INFO - Reverse SSH to tich@192.168.0.88 has exited
问题是ssh隧道在启动后几乎立即退出。在Linux中执行简单的
pidofsh
,不会产生任何输出,就好像该进程根本不存在一样

我还尝试在启动进程后使用
communicate()
,您可以看到它建立了连接并接收输出。但是,函数退出后不久,子流程也会退出

我已经为root用户和普通用户设置了RSA密钥对。将命令复制并粘贴到终端不会产生即时退出错误


目的是设置反向SSH会话,以便远程用户可以登录。但是我目前还没有找到一个提供此功能的现有打包解决方案。

您完成了一些奇怪的ssh连接。我的建议是使用paramiko一个很棒的ssh包。 另一方面,您只为linux commamd进行子处理,因此如果您喜欢,请使用: 安装sshpass(yum安装或apt-get) sshpass-p您的\u密码sshuser@hostname

并更改此设置,而不是u发送的标志: 更改ssh\u配置 vi/etc/ssh/ssh\u config 将下面的键从“询问”更改为“否”


StrictHostKeyChecking否

使用paramiko:考虑到paramiko,查看文档,它似乎没有在任何地方提供反转选项。这意味着目标服务器无法通过ssh返回到源服务器。该命令很奇怪,因为它设置了一个反向隧道,另一端可以使用
sshuser@127.0.0.1-p 19999
。这是SSH命令的主要功能。但是没有一个库提供我使用的选项。问题是,SSH命令不会保持活动状态,它在另一端做任何有用的事情之前就被杀死了。