подпроцесс python. Открытие и пересылка портов ssh - PullRequest
0 голосов
/ 12 февраля 2011

Мне нужно иметь функциональность, которая по существу эмулировала бы пользователя, создающего переадресацию портов с помощью 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, она должна разветвить соединение. Есть ли способ прервать общаться (), когда это сделано, или есть более элегантное решение?

Заранее благодарю за любые советы / предложения / комментарии.

1 Ответ

5 голосов
/ 12 февраля 2011

Я думаю, решение было довольно простым

ssh_proc = Popen(['ssh', '-f', '-N', '-L', '10000:gateway:11000', 'localhost'], stdin=PIPE, stdout=PIPE)
stat = ssh_proc.poll()
while stat == None:
    stat = ssh_proc.poll()
...