fish_ssh_agent

fish_ssh_agent

当我想启动(或重新启动)时ssh-agent,它会给我一些命令,我​​应该通过执行来运行这些命令eval $(ssh-agent)。当然,这对 fish 来说失败了,因为它给出了 bash 或 csh 的语法。

命令如下:

SSH_AUTH_SOCK=/var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-L95xhmGl9FZo/agent.36846; export SSH_AUTH_SOCK;
SSH_AGENT_PID=36847; export SSH_AGENT_PID;
echo Agent pid 36847;

或者对于 csh:

setenv SSH_AUTH_SOCK /var/folders/v4/c116f_790t7g58lh3jbr7_vm0000gq/T//ssh-Tf8etHZfP9k3/agent.36873;
setenv SSH_AGENT_PID 36874;
echo Agent pid 36874;

当我执行 时,csh 版本运行无任何异常eval (ssh-agent -c),然后echo $SSH_AGENT_PID $SSH_AUTH_SOCK给出预期的输出。但是,新 shell 不会保留这些变量。这是什么setenv意思?显然它set以某种方式保留了变量,但文档中却没有提到。如果我启动一个新终端,变量就会丢失,所以我不确定它们是否被导出了?

我刚刚发现这setenv是一个带有定义的 fish 函数set -gx,所以我猜想它将变量设置为global变量并将其导出。我对变量范围不太了解,那么这对ssh-agent变量来说是合适的吗?

就上下文而言,我是根据指示这样做的在 github。多年来,我一直在为 github 使用 ssh 密钥,但从未执行过ssh-agentssh-add操作,但我在新计算机上设置时注意到了这一点。似乎 os x 也在自行运行 ssh-agent(或我很久以前设置的其他东西),因为它$SSH_AUTH_SOCK已经存在。所以也许运行这个并不重要?ssh-add即使没有运行,它也会毫无怨言地运行ssh-agent

答案1

我之前写过这个:

function ssh_agent --description 'launch the ssh-agent and add the id_rsa identity'
    if begin
            set -q SSH_AGENT_PID
            and kill -0 $SSH_AGENT_PID
            and grep -q '^ssh-agent' /proc/$SSH_AGENT_PID/cmdline
    end
        echo "ssh-agent running on pid $SSH_AGENT_PID"
    else
        eval (command ssh-agent -c | sed 's/^setenv/set -Ux/')
    end
    set -l identity $HOME/.ssh/id_rsa
    set -l fingerprint (ssh-keygen -lf $identity | awk '{print $2}')
    ssh-add -l | grep -q $fingerprint
        or ssh-add $identity
end

为了强调,我使用创建 普遍的ssh-agent 输出中的变量,setenv 将创建全球的变量

答案2

考虑使用

fish_ssh_agent

使用 fish shell 时启动 ssh 代理的实用函数。您只需运行 ssh-add 并输入一次密码,之后运行 ssh_agent 即可为您完成工作。只需运行一次,环境变量在会话之间共享。

安装
wget https://gitlab.com/kyb/fish_ssh_agent/raw/master/functions/fish_ssh_agent.fish -P ~/.config/fish/functions/
用法
fish_ssh_agent

来源

把这个放到~/.config/fish/functions/fish_ssh_agent.fish

function __ssh_agent_is_started -d "check if ssh agent is already started"
   if begin; test -f $SSH_ENV; and test -z "$SSH_AGENT_PID"; end
      source $SSH_ENV > /dev/null
   end

   if test -z "$SSH_AGENT_PID"
      return 1
   end

   ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep -q ssh-agent
   #pgrep ssh-agent
   return $status
end


function __ssh_agent_start -d "start a new ssh agent"
   ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
   chmod 600 $SSH_ENV
   source $SSH_ENV > /dev/null
   true  # suppress errors from setenv, i.e. set -gx
end


function fish_ssh_agent --description "Start ssh-agent if not started yet, or uses already started ssh-agent."
   if test -z "$SSH_ENV"
      set -xg SSH_ENV $HOME/.ssh/environment
   end

   if not __ssh_agent_is_started
      __ssh_agent_start
   end
end

答案3

这在 FreeBSD 10.2 上对我有用。将以下内容添加到 ~/.config/fish/config.fish:

if begin; test -z (command pgrep ssh-agent); and not test -S $SSH_AUTH_SOCK; end
    eval (command ssh-agent -c | sed -E 's/^setenv (.+);$/set \1; set -Ux \1;/')
end

第一组不带 -Ux,为启动 ssh-agent 的第一个终端设置环境变量。第二组带 -Ux,为所有其他终端设置环境变量。

相关内容