我正在运行eval `ssh-agent -s\`
我收到此错误
fish: Unknown command: `ssh-agent
答案1
您的问题分为两部分:
- 为什么尝试时会出现错误
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)
将工作
如何在 fish shell 中运行 ssh-agent?
不过,我建议使用keychain
以简化ssh-agent
Fish(和其他 shell)的使用。忽略网页中的内容(正如@Charliesneath 在评论中指出的那样),“目前,钥匙串与 Fish shell 不兼容。” 该网页已经有一段时间没有更新了。
Keychain 实际上确实具有对 Fish 的内置支持(于 2017 年添加),并且可以利用通用变量使您的密钥在多个 shell 会话中保持同步。
例如,如果您打开了两个 Fish shell 会话,并且在其中一个会话中运行ssh-agent
/ ssh-add
,您仍然需要在另一个会话中运行相同的命令,然后再次输入密码。在 shell 会话之间共享代理的方法,但 Keychain 会为您处理。
Keychain 可以直接从大多数发行版的存储库安装。例如,sudo apt install keychain
。
可以在 Fish 中使用以下命令启用它:
keychain --eval <keyfile> | source
我在 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
set -Ua SSH_KEYS_TO_AUTOLOAD ~/.ssh/id...
对于您想要使用的任何键。
差不多就是这样。当您启动登录 Fish shell 时,如果密钥未解锁,Keychain 将要求输入密码并将其添加到共享ssh-agent
。如果已解锁,则不会再次询问。
当然,您可以通过嵌入静态键名来简化脚本。我更喜欢使用通用变量来保持脚本的动态性。这样,即使我在不同系统上使用不同的键,也可以将单个脚本存储在我的 dotfiles 存储库中。
答案2
答案3
我使用fish_ssh_agent
来自 gihubhttps://github.com/ivakyb/fish_ssh_agent
该 repo 还在 SSH、SSH-agent、Fish-shell 主题上提供了一些有价值的提示。