在远程主机上执行ssh操作时,如何避免被问到“输入密钥密码”?


43

我将ssh放入远程主机(linux,fedora)中,并且要在那里执行ssh操作(带有bitbucket的git)。该计算机上正在运行ssh-agent,

$ ps -e|grep sh-agent
 2203 ?        00:00:00 ssh-agent

但是当我想要git时,它要求我输入密码

$ git pull
Enter passphrase for key '/user/wgong/home/.ssh/id_rsa': 

注意:如果我在本地计算机上操作,它不会要求我输入密码


1
我没用过,但是有一个命令ssh-add,我认为它用于这种事情
barlop 2015年

Answers:


80

我认为使用ssh的最好方法

在使用Git之前,将密钥添加到 ssh-agent

如果尚未启动,请启动ssh-agent

$ eval `ssh-agent -s`

使用ssh-add添加您的私钥

$ ssh-add〜/ .ssh / id_rsa_key
输入/home/user/.ssh/id_rsa_key的密码:
添加的身份:/home/user/.ssh/id_rsa_key
(/home/user/.ssh/id_rsa_key)

检查是否添加了密钥(参数为小写L):

$ ssh-add -l
2048 55:96:1a:b1:31:f6:f0:6f:d8:a7:49:1a:e5:4c:94:6f
/home/user/.ssh/id_rsa_key(RSA)

尝试连接到您的Git服务器:

$ ssh git.example.com

现在,您无需额外的密码提示即可使用Git。

其他方法

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt


但是我已经用过Git将您的密钥添加到ssh-agent中,那怎么办?感谢
百合

@lily对不起,我不明白你的问题。
罗马

1
这是对我有用的解决方案。
Skatox '16

2
如何使它持久化?简单地放入其中.bashrc
oarfish

1
仅供参考,这eval是必需的,因为它输出的命令可以导出所需的环境变量,例如SSH_AUTH_SOCK。unix.stackexchange.com/questions/351725/...
wisbucky

21

如果您已经在ssh-agent运行,则可以添加密钥,并且必须输入一次密码,并且仅在该会话中输入一次。

ssh-add ~/.ssh/id_rsa

您没有说要使用什么操作系统,但是如果恰好是Linux&Gnome,则“密码和密钥”应用程序(CLI名称:)seahorse可以管理这些操作系统,因此在您登录时就可以解锁(无需密码) 。其他Linux桌面环境具有自己的管理器。我不确定其他操作系统在这里做什么。


3

要求密码短语的主要原因是您的密钥已加密,请比较这两个:

  • 未加密

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----            
    AIIAogIBAAKCAQEAtOJQ0Z3ZbyzuknnHqn5oMCmNf8zGmERhW+g5Eftf9daZ5qvZ
    
  • 加密的

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----    
    Proc-Type: 4,ENCRYPTED
    DEK-Info: AES-128-CBC,A95215C9E9FE00B8D73C58BE005DAD82
    
    ZAzLq/LbHSfOVkXtQz6M6U8yuAx2lIu9bH/k7ksgat92IDjZntRrT1XMpkYtjB+0
    

因此,您必须执行以下任一操作:

  1. 如果已加密,则可以尝试删除加密
  2. 您使用了错误的密钥。如果您想使用其他密钥,请指定其他文件或编辑您的文件~/.ssh/config并指定其他标识文件(IdentityFile)。
  3. 运行ssh-add -l以列出所有身份(然后与本地身份进行比较),并使用Stash仔细检查是否使用了正确的密钥(它们存在于Stash配置中)。
  4. 如果您知道密码短语并且想要使其自动化,请尝试以下解决方法:

    PS="my_passphrase"
    install -vm700 <(echo "echo $PS") $PWD/my_pass
    DISPLAY= SSH_ASKPASS=$PWD/my_pass ssh-add - && rm -v my_pass
    

故障排除:

  1. 仔细检查您的SSH代理是否正在运行(eval "$(ssh-agent -s)")。
  2. 通过:GIT_TRACE=1 git pullGIT_SSH_COMMAND="ssh -vv"(Git 2.3.0+)重新运行git 再次调试命令。
  3. 您可以尝试绕过询问密码(它将密码重定向到true),但我认为这不会有所帮助。如果它要求,那是有原因的,基本上是必需的。

    DISPLAY= SSH_ASKPASS=/bin/true ssh-add
    

2

ssh-add程序将启动一个代理,该代理可以保存(并提供)您的密码。远程使用它的方法是在交互式外壳程序的父级中(这样,代理不会停止)。

以下是一些相关的问题:

现在... 远程连接,通常您的命令不会这样登录,因此它不会启动ssh-add。您可以通过执行以下脚本来解决此问题:

  • 开始 ssh-agent
  • 开始 ssh-add
  • 添加您的密钥
  • 运行所需的命令。

弱点是第二步:除非使用不带密码短语的密钥削弱安全性,否则仍然会提示您输入密码短语。有些人这样做,大多数人建议不要这样做。


ssh-add不启动代理。它连接到已经运行的代理。
2015年

谢谢-我习惯于在单独的脚本中执行这些操作,而忽略了缺少的部分。
Thomas Dickey

0

您可以使用以下命令轻松删除密钥的密码短语

ssh-keygen -p

在第一个提示下,输入文件路径(或按Enter更改默认值)。在第二个提示下,输入旧密码。在下一个提示下,只需按Enter即可取消设置密码

看起来这是最简单的方法!


0

即使将私钥加载到私钥中,ssh-agent直到将相应的SSH公钥添加到remote之前,您仍然会看到密码提示以解密私钥~/.ssh/authorized_keys

复制:

# We are about to ssh to localhost, therefore, unauthorized everyone.
$ rm ~/.ssh/authorized_keys

$ eval $(ssh-agent)
# Agent pid 9290

$ ssh-add
# Enter passphrase for /home/uvsmtid/.ssh/id_rsa: 
# Identity added: /home/uvsmtid/.ssh/id_rsa (/home/uvsmtid/.ssh/id_rsa)

$ ssh localhost
# Enter passphrase for key '/home/uvsmtid/.ssh/id_rsa':
# uvsmtid@localhost's password:
  # NOTE: See password prompt for private key
  #       (and only then prompt for remote login).
  #       Why? Isn't the private key is already loaded by `ssh-add`?

$ ssh-copy-id localhost
$ ssh localhost
  # NOTE: No password for private key anymore.
  #       The key is served by `ssh-agent`.

令人困惑。在这种情况下,远程SSH登录密码就足够了。

我可以推测这会在不知道相应私钥的加密密码的情况下阻止添加您的公钥(与加密的私钥配对)。无论如何,这是一次远程登录过程。

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.