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


217

我在本指南的帮助下设置了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
...

Answers:


337

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

$ ssh-add

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

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

Could not open a connection to your authentication agent.

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

eval $(ssh-agent)

然后重复该ssh-add命令。

值得一看ssh代理手册页


2
什么是的点eval可能你只需要输入ssh-agent
James McMahon

4
它显示了一些命令,这些命令使您可以使用它,而不会为您执行它们。eval进行谴责。
tshepang

与原始问题无关,但是如果您在GitHub,Bitbucket等上仍然遇到这些问题,请确保您使用的是git / ssh URL,而不是http,它将继续询问用户名和密码。
捷克学

而且,如果您没有默认密钥,或想添加多个密钥,请ssh-add /path/to/key
hoosierEE

46

解决此问题的一种方法是ssh-agentssh-add

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

此后,将为当前会话保存密码。不会再被问到。


7
大多数人根本不想为自己的密码短语感到烦恼。
connexo

26

我使用钥匙串来管理ssh密钥。它也可以在Debian和Ubuntu中使用

apt-get install keychain

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


2
//,这对我有用。它比ssh-agent更好,因为每次打开终端时都不需要输入ssh密钥密码。
弥敦道(Nathan Basanese)2015年

@NathanBasane您是说使用钥匙串不需要在每次打开终端时都输入ssh密钥密码吗?您如何配置?因为每次打开终端时,钥匙串都会不断询问密码,尽管这只是我在引导后第一次打开密码,但仍然如此。我不想每次都输入密码。
m4l490n

@ m4l490n否,如果您使用的是钥匙串,则无需在每次打开终端时都输入ssh密钥密码。但是,启动后确实需要输入一次。密码短语不会保存到磁盘-这样会很不安全。
Faheem Mitha

对我来说,每次我登录时都会询问(我在远程服务器上有一个git仓库+ ssh密钥,每次执行“ git pull”时都需要输入密码)
Martin Thoma

@MartinThoma看来错了。检查是否正确配置了.ssh。特别是您的外壳是否配置正确?如果仍然无法使用,并且您无法解决问题,则可以提出问题。
Faheem Mitha

13

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

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa

但是我为每种服务使用不同的密钥对……
connexo

@connexo,您可以将通配符星号替换为您的主机名,并将“ id_rsa”替换为对应的私钥
ness-EE

1
我需要在IgnoreUnknown AddKeysToAgent,UseKeychain上面添加UseKeychain yes
consideRatio

1
我收到此错误:“ UseKeychain yes”行上的“ Bad configuration option:usekeychain”。
m4l490n

@ m4l490n:该UseKeychain选项似乎是在OpenSSH 7.1p2(2016-02-28)中添加的。也许您有以前的版本。 openssh.com/txt/release-7.2
朱姓

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

...然后只是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

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


我如何在远程计算机上使用它?我修改了第二个脚本以检查$ SSH_CLIENT,如果存在,则不执行urxvtc,仅执行tmux。可以,但是问题是.bash_profile部分。当我第一次登录该框时,它显示“找不到服务器:连接被拒绝”,这是“ tmux ls”的输出。然后,当我执行第二个脚本时,tmux要么启动一个新会话,要么附加到现有会话,但是没有钥匙串提示。然后,当我退出会话时,钥匙串提示在那里等待。
jonyamo

如果没有会话,我已经更新了使tmux输出静音的答案。
jasonwryan'2

谢谢,但这仍然不能解决钥匙串问题。tmux创建新会话,但直接进入任何空提示。仅当我退出tmux会话时,我才能看到钥匙串提示询问我的密码短语。
jonyamo

我想我应该停止说钥匙串了,因为钥匙串只在.bash_profile中执行。问题出在执行ssh-add。虽然,如果我在创建tmux会话后手动运行ssh-add,它会起作用。
jonyamo

1
跳过第二个脚本,仅从此开始安全的tmux会话.profile-这样一来,您将在登录后立即提示输入密钥。
jasonwryan'2

0

您可以使用sshpass

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

您只需要在添加sshpass -p yourpassphrase常规ssh命令之前添加即可。


2
这听起来真是个愚蠢的主意。这样会不会在您的Shell历史记录中以明文形式显示您的密码?
connexo

确实如此,但是您不应该使用密码来保护会话吗?
belka

1
即使您这样做,您还有多少次同事坐在您旁边并帮助您/向您学习?
connexo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.