如果我打开一个 gnome 终端并通过 SSH 连接到服务器,系统会通过终端中的文本提示而不是 GUI 要求我输入密码,更糟糕的是,这个密码不会在我的 Ubuntu 会话期间存储在内存中。
相反,我在 Thunderbird 中使用带有 Enigmail 的 PGP 密钥,并且每个会话只需使用 GUI 输入一次密码。
似乎我安装并运行了 3 个代理:seahorse-daemon、gpg-agent 和 ssh-agent,但它们似乎不能很好地协同工作。我还运行了一个 gnome-keyring。我不明白这些程序各自应该做什么。
我的系统运行 ssh-agent 时使用“/usr/bin/gpg-agent”作为第一个命令参数,我不明白这是什么意思。
我如何设置用于 ssh 密钥的代理?
答案1
我不使用“设置”->“密码和密钥”中的 GUI 实用程序
我已经安装了钥匙串。
sudo apt-get 安装钥匙串
如果您正在运行 bash,则需要向 .bash_profile 添加一些命令。如果您没有 .bash_profile,请在主文件夹中创建一个。添加以下几行:
### START-Keychain ###
# Let re-use ssh-agent and/or gpg-agent between logins
/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
### End-Keychain ###
在开始一天的工作时,我会登录。当我打开终端时,系统会提示我输入一次密码。对于所有其他新终端和连接,系统不会再次要求我输入密码。
答案2
在终端中运行ssh-add
,并在提示时输入密码。如果此操作有效,则在同一个 X 会话中运行的所有终端和应用程序中,每次访问 ssh 密钥时都无需任何提示即可正常进行。
答案3
我做了大量的测试和研究,发现大多数文档都已经过时了,这里有一个简单而有效的方法可以让它发挥作用。
在 .bashrc 文件底部输入以下内容:
# use a tty for gpg
# solves error: "gpg: signing failed: Inappropriate ioctl for device"
GPG_TTY=$(tty)
export GPG_TTY
# Start the gpg-agent if not already running
if ! pgrep -x -u "${USER}" gpg-agent >/dev/null 2>&1; then
gpg-connect-agent /bye >/dev/null 2>&1
gpg-connect-agent updatestartuptty /bye >/dev/null
fi
# Set SSH to use gpg-agent
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
export SSH_AUTH_SOCK="${HOME}/.gnupg/S.gpg-agent.ssh"
fi
# add alias for ssh to update the tty
alias ssh="gpg-connect-agent updatestartuptty /bye >/dev/null; ssh"
希望这可以让某些人免于审查旧文档的麻烦。