2017-02-07 7 views
1

Вот мой пример кода Pythonручки подсказки в Python - POPEN

def gitClone(): 
    proc = subprocess.Popen(['git', 'clone', 'https://[email protected]:443/sailclientqa.git'], stdout=subprocess.PIPE) 
    stdout,stderr = proc.communicate('mypassword') 
    print(stddata) 
    print (stderr) 

Каждые результаты выполнения в командной строке для пароля. Каков наилучший способ сделать этот git-клон из python без подсказки пароля.

Я ценю ваш опыт/советы

+0

Я пробовал это. Вот мой код 'proc = subprocess.Popen (['git', 'clone', 'https: //[email protected]: 443/sailclientqa.git'], stdin = subprocess.PIPE) proc.communicate ('5pac1ientd15tqa') ' По-прежнему не работает –

+0

Я не могу настроить SSH для этого случая. Это временный репозиторий GIT для Azure для развертывания. Я не могу получить https: // user: pass/someurl/.git. Единственное решение, которое у меня есть, - это выяснить его через python. Не знаете, как это дубликат, когда исходный вопрос касается git, где я хочу, чтобы это было адресовано python. Я вижу сходство с вашей точки зрения, хотя мой вопрос более специфичен с точки зрения python. –

ответ

0

Наивный подход можно было бы добавить stdin=subprocess.PIPE к вашей команде, так что вы можете кормить его ввода пароля. Но это не так просто с вводами пароля, которые используют специальные способы ввода клавиатуры.

С другой стороны, как указано в this answer, в командной строке можно передать пароль (хотя не рекомендуется, так как пароль хранится в истории команд git с помощью командной строки!).

Я хотел бы изменить код следующим образом:

  • добавить параметр password. Если он не установлен, использование питона getpass модуль для запроса пароля (возможно, вам это не нужно)
  • если пароль установлен правильно, передать его в модифицированном командной строке

мое предложение:

import getpass 

def gitClone(password=None): 
    if password is None: 
     password = getpass.getpass() 
    proc = subprocess.Popen(['git', 'clone', 'https://someuser:{}@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'.format(password)], stdout=subprocess.PIPE) 
    stdout,stderr = proc.communicate() 
    print(stddata) 
    print (stderr) 

альтернатива, если вышеупомянутое решение не работает, и если вы не можете ключи SSH настройки, чтобы использовать pexpect модуль, который обрабатывает специальный пароль входных потоков:

def gitClone(mypassword): 
    child = pexpect.spawn('git clone https://[email protected]:443/sailclientqa.gi') 
    child.expect ('Password:') 
    child.sendline (mypassword) 

Имеет хорошее преимущество не хранение пароля в истории команд git.

источник: How to redirect data to a "getpass" like password input?

+0

Спасибо за ваш ответ. Цените, что у вас есть время для меня. Пробовал. Все еще запрашивает пароль, даже если я передаю правильный пароль в качестве параметра –

+0

Я добавил многообещающее руководство с модулем 'pexpect'. –

Смежные вопросы