subprocess.Popen ssh tunnel запускает 2-ой процесс, который требует ответа на приглашение с помощью пин-кода - PullRequest
0 голосов
/ 10 октября 2018

Я создаю ssh-туннель, используя subprocess.Popen.Однако для успешного создания этого туннеля я использую Yubikey, которому требуется пин-код для освобождения ключей для успешной аутентификации, встроенный в конфигурацию ssh.Код ниже, насколько я могу получить.

def launch_tunnel(self):
    try:
        enterpin = getpass.getpass()
        bytepin = str.encode(enterpin)
        launchtunnel = subprocess.Popen('ssh tunnel command', 
                                        shell=True, 
                                        stdout=subprocess.PIPE, 
                                        stdin=subprocess.PIPE
                                        stderr=subprocess.PIPE).communicate(input=bytepin)
    except Exception as e:
        print(e)

Когда я запускаю его, я получаю следующие 2 подсказки.

Password:
Enter PIN for 'PIV_II (PIV Card Holder pin)':

Первый из них - getpass.getpass (), а второй - другой процесс, для которого требуется Пин Yubikey.Понятно, что .communicate () здесь не работает, и из того, что я могу сказать, это потому, что процесс ssh порождает другой процесс (запрос на вывод), для которого требуется пин-код для аутентификации ssh.

Есть ли способ установитьЗафиксируйте перед использованием чего-то вроде getpass и передайте это непосредственно второму процессу.В настоящее время этот 2-й процесс (вывод подсказки) прерывает работу остальной части моего приложения, поэтому я хотел бы контролировать его?

1 Ответ

0 голосов
/ 11 октября 2018

Я нашел часть решения.Использование connect () без чего-либо в () останавливает процесс в приглашении, поэтому мне не нужно реализовывать getpass перед запуском подпроцесса.Это дало мне еще одну проблему, но я перейду к новой теме.

launchtunnel = subprocess.Popen(checktunnelexists[1], shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
launchtunnel.communicate()[0]
...