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

lil*_*ily 87 ssh git

我通过 ssh 连接到远程主机(linux、fedora),我想在那里进行 ssh 操作(git 和 bitbucket)。那台机器上正在运行 ssh-agent,

$ ps -e|grep sh-agent
 2203 ?        00:00:00 ssh-agent
Run Code Online (Sandbox Code Playgroud)

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

$ git pull
Enter passphrase for key '/user/wgong/home/.ssh/id_rsa': 
Run Code Online (Sandbox Code Playgroud)

注意:如果我在本地操作那台机器,它不会要求我输入密码

小智 142

我认为使用 ssh 的最佳方式

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

如果未启动则启动ssh-agent

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

使用ssh-add添加您的私钥

$ ssh-add ~/.ssh/id_rsa_key  
Enter passphrase for /home/user/.ssh/id_rsa_key:  
Identity added: /home/user/.ssh/id_rsa_key   
(/home/user/.ssh/id_rsa_key)  
Run Code Online (Sandbox Code Playgroud)

检查是否添加了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)
Run Code Online (Sandbox Code Playgroud)

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

$ ssh git.example.com
Run Code Online (Sandbox Code Playgroud)

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

其他方法

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

  • 我如何使这个持久化?简单地把它放到`.bashrc` 中? (8认同)
  • 仅供参考,需要“eval”,因为它输出导出所需环境变量(例如 SSH_AUTH_SOCK)的命令。 https://unix.stackexchange.com/questions/351725/why-eval-the-output-of-ssh-agent/351727 (3认同)
  • 这是对我有用的解决方案。 (2认同)

ams*_*ams 31

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

ssh-add ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

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


小智 11

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

ssh-keygen -p
Run Code Online (Sandbox Code Playgroud)

在第一个提示上,输入文件路径(或按回车使用默认值)
第二个提示,输入旧密码
下一个提示,只需按回车即可取消设置密码

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

  • 这绝对是最简单的方法。这将教我遵循 Raspberry Pi 的“操作方法”页面,无需经过深思熟虑...... (6认同)

小智 8

在 Mac 上,添加UseKeyChain~/.ssh/config

nano ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

并添加以下内容

Host *
    UseKeychain yes
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 5

询问密码的主要原因是您的密钥已加密,比较这两个:

  • 未加密

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----            
    AIIAogIBAAKCAQEAtOJQ0Z3ZbyzuknnHqn5oMCmNf8zGmERhW+g5Eftf9daZ5qvZ
    
    Run Code Online (Sandbox Code Playgroud)
  • 加密的

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

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

  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
    
    Run Code Online (Sandbox Code Playgroud)

故障排除:

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

    DISPLAY= SSH_ASKPASS=/bin/true ssh-add
    
    Run Code Online (Sandbox Code Playgroud)


Tho*_*key 4

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

以下是几个相关问题:

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

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

弱点是第二步:您仍然会收到输入密码的提示,除非您使用没有密码的密钥来削弱安全性。有些人这样做,大多数人反对。