每次推送到 Bitbucket 时如何避免被询问密码

tsh*_*ang 271 ssh key-authentication

我在本指南的帮助下设置了我的 ssh 东西,它曾经运行良好(我可以在hg push没有被要求输入密码的情况下运行)。考虑到我仍在使用相同的主目录,从那时到现在可能会发生什么。

$ cat .hg/hgrc 
[paths]
default = ssh://hg@bitbucket.org/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://hg@bitbucket.org/tshepang/bloog
searching for changes
...
Run Code Online (Sandbox Code Playgroud)

jmt*_*mtd 413

您需要使用 ssh 代理。简答:试试

$ ssh-add
Run Code Online (Sandbox Code Playgroud)

在推之前。询问时提供您的密码。

如果您尚未运行 ssh 代理,您将收到以下消息:

Could not open a connection to your authentication agent.
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以启动一个并设置您的环境

eval $(ssh-agent)
Run Code Online (Sandbox Code Playgroud)

然后重复该ssh-add命令。

值得一看ssh 代理联机帮助页

  • 它显示一些允许您使用它的命令,但不会为您执行它们;`eval` 执行。 (7认同)
  • 你能输入`ssh-agent` 的`eval` 有什么意义吗? (3认同)
  • 与原始问题无关,但如果您在 GitHub、Bitbucket 等上一直遇到这些问题,请确保您使用的是 git/ssh URL,而不是 http,它会不断询问用户名+密码。 (2认同)

小智 53

解决这个问题的一种方法是使用ssh-agentssh-add

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 
Run Code Online (Sandbox Code Playgroud)

在此之后,将保存当前会话的密码。并且不会再被问到。

  • 大多数人根本不想因为他们的密码短语而被窃听。 (11认同)
  • @connexo 密码短语的全部要点是不要将其保留到私钥所在的位置...... (3认同)

Fah*_*tha 36

我使用钥匙串来管理 ssh 密钥。它也可以在 Debian 中使用,因此大概是 Ubuntu

apt-get install keychain
Run Code Online (Sandbox Code Playgroud)

这是Debian 钥匙串包页面。如您所见,该项目不是很活跃,但对我有用。我也在此处的另一个答案中对此发表了一些评论

  • // ,这对我有用。它比 ssh-agent 好得多,因为我不需要每次打开终端时都输入我的 ssh 密钥密码_。 (3认同)

小智 29

创建(或编辑,如果存在)以下 ~/.ssh/config 文件:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (5认同)
  • 我需要在 `UseKeychain yes` 上方添加 `IgnoreUnknown AddKeysToAgent,UseKeychain`。 (3认同)
  • 我收到此错误:“使用钥匙串是”行上的“错误配置选项:使用钥匙串”。 (2认同)
  • 除了 consideRatio 评论中的选项之外,它还起作用。@m4l490n 你也可以尝试使用该选项,如果没有该选项,我也有相同的错误消息。 (2认同)
  • 我想补充一点,这让我对 Git LFS 保持了理智,否则它会要求您为推送中的每个 LFS 文件输入 SSH 密钥密码。 (2认同)

jas*_*yan 6

为方便起见,最优方法是结合jmtdFaheem的答案。

ssh-agent单独使用意味着ssh-agent需要为您打开的每个新终端创建一个新实例。keychain初始化时将询问私钥的密码并存储它。这样您的私钥就受到密码保护,但您不必一遍又一遍地输入密码。

拱维基建议初始化从钥匙圈/etc/profile.d/或您的壳轮廓,如.bash_profile.bashrc。这有一个缺点,因为它会在您打开终端后立即初始化您的钥匙串。

更灵活的方法是结合keychain特定tmux会话。所以,在.bash_profile

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi
Run Code Online (Sandbox Code Playgroud)

...然后它只是tmux在需要时启动安全会话的情况(从键绑定启动):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add
Run Code Online (Sandbox Code Playgroud)

现在,当您启动该特定tmux会话时,您的钥匙串只会被初始化一次。只要该会话持续存在,您就可以访问这些ssh密钥并推送到您的远程存储库。