subprocess.communicate () не будет предоставлять ввод для Попена, вызывающего ssh через git - PullRequest
0 голосов
/ 05 ноября 2018

Я использую python 2.7, поэтому я не могу использовать то, что, по моему мнению, будет работать (subprocess.check_ouput () с входным аргументом), и я пытаюсь передать строку 'yes' объекту Popen. Вот мой код

def clone(ssh_url):
    sub_list = ['git', 'clone', ssh_url]
    cmd = subprocess.Popen(sub_list, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
                           universal_newlines=True)
    output, err = cmd.communicate(input='yes')
        print output
        if err is not None:
            print err

ssh_url = 'git@gitlab.com:User1/test-work.git'
clone(ssh_url)

Итак, я пытаюсь клонировать проект gitlab. Я не использовал ключ ssh на этом компьютере ранее, поэтому я получаю сообщение о том, каково значение отпечатка ключа ECDSA и хочу ли я продолжать подключение (да / нет). Я хочу передать «да» этому выбору, когда он представлен, однако введенный мною ввод communicate() не получен, и я получаю ошибку Host Key verification failed. fatal: Could not read from remote repository от git.

Кто-нибудь знает, как сделать эту работу? Связь () блокируется? Я попытался использовать пример с потоками здесь: Используйте subprocess.communicate () для передачи stdin без ожидания процесса в принятом ответе, но это тоже не сработало.

1 Ответ

0 голосов
/ 05 ноября 2018

Это намеренное, желаемое поведение от SSH. Это не то, что вы делаете неправильно в своем Python - скорее, SSH намеренно не использует stdin для сбора ответов на запросы, связанные с безопасностью (что гарантирует, что его stdin передается удаленной команде, а не используется самим SSH ).

git_env = os.environ.copy()
git_env['GIT_SSH_COMMAND'] = 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
cmd = subprocess.Popen(sub_list,
  stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
  universal_newlines=True, env=git_env)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...