SSH 代理的这些使用方式有什么区别?

SSH 代理的这些使用方式有什么区别?

我对使用 SSH-Agent 的不同方式、含义和错误有疑问。

我在 Amazon Web Services 中使用 Ubuntu 14.04 LTS。

SSH-Agent 的不同使用方式有何区别?

这是第一个:

eval 'ssh-agent -s'
ssh-add id_rsa

为了检查此步骤是否起作用,我使用命令ssh localhost来检查连接是否不要求我输入密码。

但是,当我使用此命令时,其他时候我们会获得拒绝连接或连接要求我们输入密码。然后,为了解决这个问题,我找到了另一种方法:

eval "$(ssh-agent)"
ssh-add id_rsa

尽管如此,有时我们再次获得被拒绝的连接或连接要求我们输入密码,但我找到了解决问题的第三种方法:

exec ssh-agent bash
ssh-add id_rsa

问题是我不明白原因,因为有时我必须在同一个服务(AWS)中使用同一个发行版(Ubuntu 14.04 LTS)。它们之间有什么区别?

答案1

首先要遵循以下 2 条规则:

  • 除非您明确使用 TCSH 或类似程序,否则您将使用 Bash,因此该-s参数是多余的。

  • 在 Bash 中,eval不关心引用级别,这意味着eval "1 2"eval 1 2将执行完全相同的操作。但是,引号仍然会改变其中字符的解释:

    print_args () { while [ $# -gt 0 ]; do echo "$1"; shift; done; }
    eval "print_args 1 '2 3' 4"   # prints "1", "2 3", "4"
    eval print_args 1 '2 3' 4     # prints "1", "2", "3", "4"
    

考虑到这些,以下是它们的作用:

eval 'ssh-agent'
eval ssh-agent

使用其中任何一种,字符串ssh-agent都会被 shell (Bash) 解析为命令ssh-agent,并执行。此命令ssh-agent在后台启动,并将一些设置打印到 stdout,例如SSH_AUTH_SOCK=...。但是,这些设置不是您的 shell 无法解释,这反过来意味着 shell 不知道如何联系代理。事实上,该ssh-add命令可能会产生错误:Error connecting to agent: Connection refused。因此,此命令是绝不有用。也许您的意思是'用反引号替换单引号?(不幸的是,我不知道如何让反引号显示在内联代码片段中。)如果是这样,请继续阅读。

eval "$(ssh-agent)"
eval $(ssh-agent)
eval "`ssh-agent`"
eval `ssh-agent`

对于其中任何一个,Bash 首先执行命令替换。因此,它运行,这会在后台ssh-agent启动程序,并输出设置,如。现在替换开始,因此 Bash用其输出替换。其次,运行 ,但现在是那些中间命令:。这样, 输出的设置就会导入到正在运行的 shell 中,因此将知道如何找到该进程。通常,这就是您想要做的。ssh-agentSSH_AUTH_SOCK=...$(ssh-agent)SSH_AUTH_SOCK=...evaleval SSH_AUTH_SOCK=...ssh-agentssh-addssh-agent

exec ssh-agent bash

这会将您当前的 shell 替换为已包含 输出设置的 shell ssh-agent。但是,这会破坏任何其他 shell 自定义设置,因为新 shell 将不包含它们。这是一种添加设置的好方法ssh-agent,但仅当您不关心当前 shell 时才适用。

综上所述,ssh user@server选项 2 和 3 之间的后续命令的工作方式应该没有区别。您所看到的任何差异(“有时”)不是由于ssh-agentshell 设置,而是由于网络条件。

顺便说一句,ssh如果不尝试使用密码验证来进行连接,请尝试以下方法之一:

ssh user@server -o BatchMode=true
ssh user@server -o PreferredAuthentications=publickey

相关内容