Я думаю, что самое простое решение - использовать ssh-аутентификацию на основе ключа хоста в сочетании с фоновым ssh
с &
... это очень простая реализация, но вы можете улучшить ее, чтобы убить процесс после того, как вы готово ... также обратите внимание, что я добавил -n
к вашим ssh
аргументам, так как мы выполняем фоновый процесс.
import subprocess
USER = 'user'
HOST = 'server.com'
cmd = r"""ssh -CfNnL 0.0.0.0:3306:127.0.0.1:3306 %s@%s &""" % (USER, HOST)
subcmd = cmd.split(' ')
retval = subprocess.Popen(subcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stat = retval.poll()
while stat == None:
stat = retval.poll()
print "ssh in background"
Наконец, если у вас еще нет ServerAliveInterval
в вашем ssh_config
, рассмотрите возможность вызова ssh
как ssh -o ServerAliveInterval=30 <other_options_and_args>
, чтобы убедиться, что вы обнаружили потерю туннеля как можно скорее, и чтобы предотвратить его старение. из любых реализаций NAT в пути (во время бездействия).