You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向需输入的subprocess传参?Git Push场景下SSH密钥短语传递问询

解决方案

你的代码没法实现预期效果,核心原因是:git push启动的SSH进程不会直接继承Git进程的stdin管道,所以你往Git进程的stdin写入密钥短语,根本传不到SSH那里。

下面提供两种可行的实现方式,都是针对SSH进程的交互式输入处理:

方法一:使用pexpect库处理交互式输入

pexpect是专门用于控制交互式命令行程序的Python库,它能识别SSH的密码提示并自动输入密钥短语。

  1. 先安装pexpect:
pip install pexpect
  1. 编写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来传递密钥短语。

  1. 先安装sshpass(以Ubuntu为例):
sudo apt-get install sshpass
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:25:27