如何向需输入的subprocess传参?Git Push场景下SSH密钥短语传递问询
解决方案
你的代码没法实现预期效果,核心原因是:git push启动的SSH进程不会直接继承Git进程的stdin管道,所以你往Git进程的stdin写入密钥短语,根本传不到SSH那里。
下面提供两种可行的实现方式,都是针对SSH进程的交互式输入处理:
方法一:使用pexpect库处理交互式输入
pexpect是专门用于控制交互式命令行程序的Python库,它能识别SSH的密码提示并自动输入密钥短语。
- 先安装pexpect:
pip install pexpect
- 编写Python脚本:
import pexpect # 启动git push命令,追踪其输出 child = pexpect.spawn('git push') # 匹配SSH的密钥短语提示(常见提示是"Enter passphrase for key...") child.expect('Enter passphrase for key') # 发送密钥短语,注意要加换行符 child.sendline('你的密钥短语') # 等待命令执行完成,获取输出 child.expect(pexpect.EOF) # 打印执行结果 print(child.before.decode('utf-8'))
方法二:用sshpass工具配合Git环境变量
sshpass是一个命令行工具,可以非交互式地向SSH提供密码。你可以通过设置GIT_SSH_COMMAND环境变量,让Git使用sshpass来传递密钥短语。
- 先安装sshpass(以Ubuntu为例):
sudo apt-get install sshpass
- Python脚本实现:
import subprocess import os # 设置环境变量,指定sshpass和密码 env = os.environ.copy() env['GIT_SSH_COMMAND'] = 'sshpass -p "你的密钥短语" ssh' # 执行git push process = subprocess.Popen( ['git', 'push'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env ) # 获取输出和错误信息 stdout, stderr = process.communicate() print(stdout.decode('utf-8')) print(stderr.decode('utf-8'))
注意:这种方式会把密钥短语明文暴露在环境变量/命令行中,生产环境绝对不要用,仅适合学习测试。
内容的提问来源于stack exchange,提问作者MikeG
相关产品推荐
相关产品推荐

