1

Когда я хочу запустить (или перезапустить) ssh-agent , он дает мне несколько команд, которые я должен выполнить, выполнив eval $(ssh-agent) . Конечно, это не работает для рыбы, поскольку дает синтаксис для 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 дает ожидаемый результат. Однако новые оболочки не сохраняют эти переменные. Что делает setenv ? Ясно, что он как-то set переменные, но это нигде в документации. Если я запускаю новый терминал, переменные теряются, поэтому я не уверен, что они экспортируются?

Я только что обнаружил, что setenv - это функция fish с определением set -gx , поэтому я предполагаю, что она устанавливает переменную как global переменную и экспортирует ее. Я плохо разбираюсь в области действия переменных, так что же подходит для переменных ssh-agent ?

Для контекста я делаю это на основе инструкций в github. Я использовал ssh-ключ для github в течение многих лет и никогда не делал ssh-agent или ssh-add , но я заметил это при установке на новый компьютер. Также кажется, что os x запускает ssh-agent самостоятельно (или что-то еще, что я давно настраивал), потому что уже существует $SSH_AUTH_SOCK . Так, может, бегать это не важно? ssh-add работает без жалоб даже без запуска ssh-agent .

2 ответа2

2

Я написал это некоторое время назад:

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

Чтобы подчеркнуть, я использую create универсальные переменные из вывода ssh-agent, а setenv создаст глобальные переменные

1

Это работает для меня на 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, устанавливает переменные окружения для всех других терминалов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .