Запуск виведення `ssh-агента` у рибі; що робить `setenv`?


3

Коли я хочу запустити (або перезапустити) 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це функція риби з визначенням set -gx, тому я припускаю, що вона встановлює змінну як globalзмінну та експортує її. Я не дуже добре розумію область змінної, тож чи відповідна річ для ssh-agentзмінних?

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


На рибному підказці введітьtype setenv
glenn jackman

Дякую @glenn, я виявив, що з functions setenv, дивіться мою редагування. typeприємно, хоча. Здається, це якесь поєднання whichі functions.
askewchan

Відповіді:


3

Я писав це деякий час тому:

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-агента, а setenv створить глобальні змінні


Що таке kill -0? Я цього не бачу на сторінці man. І /procне існує в моїй системі (можливо, OS x не має її).
askewchan

kill -0 pidповертається успішно, якщо цей pid є запущеним процесом, помилка в іншому випадку. Я використовую, /procщоб перевірити, що запущений pid - це насправді процес ssh-агента: є й інші способи зробити це (pgrep, розбір виводу ps)
glenn jackman

Це працює на mac os x, якщо я зміню /proc/рядок на:and ps -p $SSH_AGENT_PID | grep -q 'ssh-agent'
askewchan

1
Я рекомендую змінити схему grep '[s]sh-agent'так, щоб ви випадково не відповідали самій команді grep у виході ps.
glenn jackman

Це працює на cygwin: P
Zardoz89

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-агент. Другий набір з -Ux задає змінні середовища для всіх інших терміналів.


1

Подумайте про використання

fish_ssh_agent

Функції утиліти, щоб запустити ваш 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.