Ubuntu 22.04.1 LTS
当我git push REMOTE
重新启动后执行 a 操作时,几秒钟后会出现一个对话框:
+---------------------------------------------------------------+
| Please enter the passphrase to unlock the OpenPGP secret key: |
| "user" |
| 3072-bit RSA key, ID FF3B0094D97228, |
| created 2023-09-22 (main key ID 9BD967C9E4EC49). |
| |
| |
| Passphrase: _________________________________________________ |
| |
| <OK> <Cancel> |
+---------------------------------------------------------------+
如何通过脚本自动输入此密码,这样我就不必手动输入?
我尝试过这个不起作用:
git push REMOTE
sleep 10 # Waits 10 seconds.
KEY
谢谢!
答案1
首先:“期望”方式并不安全,我建议使用 gpg-agent。
如果您使用 gpg,则在尝试解密/加密文件时必须运行 gpg-agent(我不知道 git 推送时您到底想做什么,但我猜您使用 gpg 文件)
编辑~/.gnupg/gpg-agent.conf
一天的这些值:
default-cache-ttl 86400
max-cache-ttl 86400
这样做,您只需每天输入一次密钥(或者在第一次按下时就可以了)
来源: https://superuser.com/questions/624343/keep-gnupg-credentials-cached-for-entire-user-session
为了完整起见,您甚至可以在启动会话中放置文件解密、gpg show 或类似的内容,以便输入一次密钥并在当天剩余时间激活 gpg 代理。
答案2
这是一种缓存 gpg 密钥初始密码的方法。它可以适应自动化目的。我尝试使用expect
但gpg-agent
没有结果。
1号航站楼
- 设置
socat
创建伪 tty
socat -d -d pty,link=/tmp/socat1,raw,echo=0 pty,link=/tmp/socat2,raw,echo=0
# 2023/12/30 10:53:02 socat[1869865] N PTY is /dev/pts/33
# 2023/12/30 10:53:02 socat[1869865] N PTY is /dev/pts/34
# 2023/12/30 10:53:02 socat[1869865] N starting data transfer loop with FDs [5,5] and [7,7]
- 这是循环运行的。
2号航站楼
- 导出 tty
gpg
并运行生成密码提示的命令。这里我直接使用gpg
.在您的情况下git
正在生成提示。
export GPG_TTY=/tmp/socat1
gpg -d --homedir $HOME/.gnupg/ --quiet --yes --compress-algo=none --no-encrypt-to --batch --use-agent /path/to/gpgKey.gpg # command to elicit gpg prompt
- 该
gpg
命令正在等待读取标准输入。
终端 3(可选)
file /tmp/socat2
# /tmp/socat2: symbolic link to /dev/pts/34
file /dev/pts/34
# /dev/pts/34: character special (136/34)
cat /tmp/socat2
# Please enter the passphrase to unlock the OpenPGP secret key:
# "REDACTED"
# 4096-bit RSA key, ID REDACTED
# created REDACTED (main key ID REDACTED).
# Passphrase:
cat
被阻塞等待打印套接字内容/tmp/socat2
是一个链接,/dev/pts/34
它是一个字符设备,因此它的行为就像tail
打印内容后而不是退出。
4号航站楼
- 将您的密码发送到
gpg
之前运行的命令。
cat > /tmp/socat2
# Type your password.
- 不要使用回声。您的密码将缓存在您的 bash 历史记录中。
或者您可以在 python 中以编程方式完成此操作
import pathlib
with pathlib.Path('/tmp/socat2').open('w', encoding='utf8') as fp:
fp.write('password\n')
猫$HOME/.gnupg/gpg-agent.conf
default-cache-ttl 120
max-cache-ttl 999999999
no-allow-external-cache
no-grab
pinentry-timeout 25
pinentry-program /usr/bin/pinentry-tty