如何在fish shell中运行ssh-agent?

Shr*_*hri 5 ssh fish

我正在运行时eval `ssh-agent -s\` 收到此错误

fish: Unknown command: `ssh-agent
Run Code Online (Sandbox Code Playgroud)

Not*_*1ds 8

您的问题有两个部分:

  • 为什么尝试时会出现错误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-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 存储库中。


Shr*_*hri 4

我得到这个解决方案

跑步

eval (ssh-agent -c)
Run Code Online (Sandbox Code Playgroud)

参考: https: //wiki.archlinux.org/title/Fish#Evaluate_ssh-agent