当我想启动(或重新启动)时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-agent
或ssh-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,为所有其他终端设置环境变量。