Мне нужно иметь функциональность, которая по существу эмулировала бы пользователя, создающего переадресацию портов с помощью ssh. Итак, по сути, это должно работать так:
- выполнить ssh -f -N -L 10000:gateway:11000 localhost
- если есть выход из этой команды, показать пользователю и ввести ответ пользователя в качестве ответа
- Конец
Код, который я придумал ниже, почти делает то, что мне нужно:
ssh_proc = Popen(['ssh', '-f', '-N', '-L', '10000:gateway:11000', 'localhost'], stdin=PIPE, stdout=PIPE)
stdoutdata, stderrdata = ssh_proc.communicate()
Но проблема в том, что он никогда не заканчивается. Я вижу, что команда выполнена, и туннель пересылки создан, но связь () все еще застряла. Я могу выйти из этого с помощью Ctrl + C и получить это:
^CTraceback (most recent call last):
File "sshman.py", line 278, in <module>
add(args.remote_host, args.remote_port, args.local_port, args.local_host)
File "sshman.py", line 125, in add
stdoutdata, stderrdata = ssh_proc.communicate()
File "/usr/lib64/python2.7/subprocess.py", line 740, in communicate
return self._communicate(input)
File "/usr/lib64/python2.7/subprocess.py", line 1256, in _communicate
stdout, stderr = self._communicate_with_poll(input)
File "/usr/lib64/python2.7/subprocess.py", line 1310, in _communicate_with_poll
ready = poller.poll()
KeyboardInterrupt
Так как я использую -f с командой ssh, она должна разветвить соединение. Есть ли способ прервать общаться (), когда это сделано, или есть более элегантное решение?
Заранее благодарю за любые советы / предложения / комментарии.