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

Nez*_*aii 3 ssh bash scripts

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

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa_personal
Run Code Online (Sandbox Code Playgroud)

工作做得很好,所以当我运行时ssh-add -l,我看到密钥已被添加。即使根本不运行该命令也是如此eval(这可能引出了为什么我需要运行它的问题)。但是,如果我创建一个可执行文件add_key.sh(使用 shebang 和chmod +x)并向其中添加这些确切的命令然后运行它,则ssh-add -l不会显示密钥而是显示"The agent has no identities"

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

ste*_*ver 5

ssh-agent -s开始一个新的代理;当您eval输出它时,您可以更改 shell 环境,以便以下内容ssh-add将身份添加到代理。

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

当您在ssh-agent -s 没有 的情况 eval下运行时,它会启动一个新代理,但仅将新环境打印到标准输出,因此ssh-add将新标识添加到父环境中已运行的任何代理中。