subprocess.communicate()不会通过git向Popen调用ssh提供输入

时间:2018-11-05 17:02:00

标签: python git subprocess

我正在使用python 2.7,所以无法使用我认为可以使用的东西(带有输入参数的subprocess.check_ouput()),并且我试图将字符串“是”传递给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()输入没有被接收,并且我从git中收到了一个Host Key verification failed. fatal: Could not read from remote repository错误。

有人知道做这项工作的方法吗?是communication()阻塞了吗?我尝试在接受的响应中使用此处的线程示例Use subprocess.communicate() to pipe stdin without waiting for process,但这也不起作用。

1 个答案:

答案 0 :(得分:2)

这是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)