![SSH 代理的这些使用方式有什么区别?](https://linux22.com/image/1513237/SSH%20%E4%BB%A3%E7%90%86%E7%9A%84%E8%BF%99%E4%BA%9B%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我对使用 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-agent
SSH_AUTH_SOCK=...
$(ssh-agent)
SSH_AUTH_SOCK=...
eval
eval SSH_AUTH_SOCK=...
ssh-agent
ssh-add
ssh-agent
exec ssh-agent bash
这会将您当前的 shell 替换为已包含 输出设置的 shell ssh-agent
。但是,这会破坏任何其他 shell 自定义设置,因为新 shell 将不包含它们。这是一种添加设置的好方法ssh-agent
,但仅当您不关心当前 shell 时才适用。
综上所述,ssh user@server
选项 2 和 3 之间的后续命令的工作方式应该没有区别。您所看到的任何差异(“有时”)不是由于ssh-agent
shell 设置,而是由于网络条件。
顺便说一句,ssh
如果不尝试使用密码验证来进行连接,请尝试以下方法之一:
ssh user@server -o BatchMode=true
ssh user@server -o PreferredAuthentications=publickey