为什么可执行脚本的行为与手动运行命令时的行为不同?

为什么可执行脚本的行为与手动运行命令时的行为不同?

我正在尝试将私钥添加到我的 sshagent。运行命令

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa_personal

完成这项工作非常顺利,因此当我运行 时ssh-add -l,我会看到密钥已添加。即使eval根本没有运行该命令,情况也是如此(这也许会引出一个问题,为什么我需要运行它)。但是,如果我创建一个可执行文件add_key.sh(使用 shebang 和chmod +x)并向其中添加这些确切的命令,然后运行它,ssh-add -l则不会显示密钥,而是显示"The agent has no identities"

如果我注释掉eval脚本中的命令并运行它,则不会出现问题,并且它会正确地将密钥添加到代理。我的脚本中有什么问题导致添加密钥失败,为什么如果我从脚本中注释掉命令或只是手动运行命令ssh-add就不会出现问题?eval

答案1

ssh-agent -s开始新的代理;当你eval输出它时,你改变了 shell 环境,这样下面的内容ssh-add就会将身份添加到代理人。

如果您在脚本中执行此操作,那么当您返回父环境时,SSH_AUTH_SOCK/的新值SSH_AGENT_PID将丢失,因此(尽管新代理仍在运行)ssh-add -l无法连接到它。

当你刚跑ssh-agent -s 没有 eval,它启动一个新的代理,但只是将新环境打印到标准输出,因此ssh-add将新身份添加到父环境中已经运行的任何代理。

相关内容