处理Python中的提示符 - popen

3

这是我的Python示例代码

def gitClone():
    proc = subprocess.Popen(['git', 'clone', 'https://someuser@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'], stdout=subprocess.PIPE)
    stdout,stderr = proc.communicate('mypassword')
    print(stddata)
    print (stderr) 

每次执行都会提示输入密码。我想在 Python 中进行 git 克隆操作时,如何避免密码提示是最好的方法?
感谢您的专业建议。

我试过了。这是我的代码:proc = subprocess.Popen(['git', 'clone', 'https://spaclientdistqa@sailclientqa.scm.azurewebsites.net:443/sailclientqa.git'], stdin=subprocess.PIPE) proc.communicate('5pac1ientd15tqa')仍然没有成功。 - Krishnan Sriram
我无法为此情况设置SSH。这是一个用于部署的Azure临时GIT存储库。我也无法让https://user:pass/someurl/.git工作。 我唯一的解决方案是通过Python来解决它。 不确定这是重复的,因为原始问题是关于Git,而我想从Python的角度来解决这个问题。我确实能够从你的角度看到相似之处,但我的问题更具体,是从Python的角度来看的。 - Krishnan Sriram
1个回答

1

天真的方法是将 stdin=subprocess.PIPE 添加到你的命令中,这样你就可以提供密码输入。但是对于使用特殊方式获取键盘输入的密码输入来说,这并不简单。

另一方面,正如this answer 中所述,可以在命令行中传递密码(尽管不建议,因为密码会与命令行一起存储在 git 历史记录中!)。

我会修改你的代码如下:

  • 添加一个password参数。如果没有设置,则使用 python 的 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://someuser@sailclientqa.scm.azurewebsites.net:443/sailclientqa.gi')
    child.expect ('Password:')
    child.sendline (mypassword)

它有一个很好的优点,即不会在git命令历史记录中存储密码。

来源:如何将数据重定向到类似"getpass"的密码输入?


感谢您的回复。非常感谢您为我花费时间。我已经尝试了,但是即使我将正确的密码作为参数传递,仍然提示输入密码。 - Krishnan Sriram
1
我已经使用pexpect模块添加了一个有前途的线索。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接