gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:38 25 4
gpt4 key购买 nike

我正在尝试使用 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 中执行简单的 pidof ssh 没有输出,就好像该进程根本不存在一样。

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

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

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

最佳答案

你做了一些奇怪的 ssh 连接。我的建议是使用 paramiko 一个很棒的 ssh 包。另一方面,您只是为 linux commamd 进行子处理,所以如果您喜欢它,请使用:安装 sshpass(yum 安装或 apt-get)sshpass -p 你的密码 ssh 用户@主机名

并更改此设置而不是您发送的标志:更改 ssh_configvi/etc/ssh/ssh_config将下面的键从“询问”更改为“否”

StrictHostKeyChecking 否

关于python - SSH 命令立即退出,而不是作为 python 子进程保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44803058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com