我正在运行时eval `ssh-agent -s\`
收到此错误
fish: Unknown command: `ssh-agent
Run Code Online (Sandbox Code Playgroud)
您的问题有两个部分:
eval `ssh-agent -s` ?ssh-agent在 Fish shell 中启用首先,您正在寻找的功能称为“命令替换”。在 Bash/POSIX shell 中有两种方法可以做到这一点:
`command`),如您所使用$(command)强烈建议不要使用反引号形式,因此,如果您遇到使用它们的文档或博客,请意识到它已经严重过时(或不知道)。
正如您所发现的,在 Fish 中,(command)分组是执行命令替换的“最受支持”的方式。然而,从 Fish 3.4.0 开始,该$(command)表单也有效。所以使用:
eval (ssh-agent -c)或者eval $(ssh-agent -c)将工作但是,我建议使用keychain来简化ssh-agentFish(和其他 shell)中的使用。忽略网页上显示的部分(正如 @Charliesneath 在评论中指出的那样)“目前,钥匙串与 Fish shell 不兼容”。 只是网页已经有一段时间没有更新了。
Keychain 实际上确实内置了对 Fish 的支持(于 2017 年添加),并且可以利用通用变量来使密钥在多个 shell 会话之间保持同步。
例如,如果您打开了两个 Fish shell 会话,并且在其中一个会话中运行ssh-agent/ ssh-add,则仍然需要在另一个会话中运行相同的命令,并再次输入密码。有多种方法可以在 shell 会话之间共享代理,但 Keychain 会为您处理它。
钥匙串可以直接从大多数发行版的存储库安装。例如,sudo apt install keychain。
可以通过以下方式在 Fish 中启用它:
keychain --eval <keyfile> | source
Run Code Online (Sandbox Code Playgroud)
我在 Fish 中进行了如下设置。
在中创建以下脚本~/.config/fish/conf.d/keychain.fish
if status is-login
and status is-interactive
# To add a key, set -Ua SSH_KEYS_TO_AUTOLOAD keypath
# To remove a key, set -U --erase
SSH_KEYS_TO_AUTOLOAD[index_of_key]
keychain --eval $SSH_KEYS_TO_AUTOLOAD | source
end
Run Code Online (Sandbox Code Playgroud)
set -Ua SSH_KEYS_TO_AUTOLOAD ~/.ssh/id...对于您想使用的任何键。
差不多就这样了。当您启动登录 Fish shell 时,如果密钥未解锁,Keychain 将要求输入密码并将其添加到共享ssh-agent. 如果已经解锁,则不会再次询问。
当然,您可以通过嵌入静态键名来简化脚本。我更喜欢通用变量来保持脚本动态。即使我在不同的系统上使用不同的密钥,这也允许将单个脚本存储在我的 dotfiles 存储库中。
我得到这个解决方案
跑步
eval (ssh-agent -c)
Run Code Online (Sandbox Code Playgroud)
参考: https: //wiki.archlinux.org/title/Fish#Evaluate_ssh-agent