Как может я работать ssh-добавить автоматически, без подсказки пароля?

Jason Huggins сделал фантастический доклад в PyCon 2012, который описал, в мельчайших подробностях, робот, который мог играть "Angry Birds" по телефону:

robot playing angrybirds on iphone

Стоящий наблюдения разговор, это было очень интересно. Самое главное планы относительно аппаратного и программного обеспечения базового инструментария, BitBeam, онлайн в GitHub repo. Я уверен, что это дало бы Вам большой запуск.

259
08.01.2019, 06:31
18 ответов

ssh-agent различные разблокированные ssh-ключи кэшей, таким образом, можно было защитить ssh-ключи пароли, но не имея необходимость вводить их каждый раз.

Для кэширования разблокированных ключей это, очевидно, должно разблокировать те ключи. Для разблокирования ключей, которые заблокированы с паролем, он, очевидно, должен знать эти пароли.

Любой метод, который не требует авторизации от человека (например, "вводящий в пароле") не только сделает Вашу систему небезопасной; это также представит всю цель бессмысленного ssh-агента.

Сказав все это, можно просто использовать ssh-ключи, которые не защищены паролем (хит Входят при просьбе относительно пароля во время генерации ключей). С тех пор нет никакого пароля, ssh-agent не должны просить Вы тот для (не) кэширования его.

7
27.01.2020, 19:27
  • 1
    , я соглашаюсь, пока ключи правильно user-only-permissioned, существует мало преимущества для ssh-агента по ключам без разрешения. мне нравится к ssh в сервер входа в систему, и затем, тот сервер имеет набор permssionless ключей, каждый из которых может только использоваться для разблокирования еще одного сервера. сервер входа в систему не делает ничего иного, таким образом, намного более трудно взламывать/имитировать, и т.д.... другие серверы не имеют никакого доступа пароля, только для ключа. –  Erik Aronesty 26.07.2016, 23:34

Это - типичный пример компромисса между безопасностью и удобством. К счастью существует много опций. Наиболее подходящее решение зависит от сценария использования и желаемого уровня безопасности.

ssh-ключ с паролем, нет ssh-agent

Теперь пароль должен быть введен каждый раз, когда ключ используется для аутентификации. В то время как это - наилучший вариант из точки зрения безопасности, он предлагает худшее удобство использования. Это может также привести к слабому паролю, выбираемому, in-order-to уменьшают нагрузку ввода его неоднократно.

ssh-ключ с паролем, с ssh-agent

Добавление следующего к ~/.bash_profile автоматически запустится ssh-agent и загрузите ssh-ключ (ssh-ключи) на входе в систему:

if [ -z "$SSH_AUTH_SOCK" ] ; then
  eval `ssh-agent -s`
  ssh-add
fi

Теперь пароль должен быть введен в каждый вход в систему. В то время как немного лучше с точки зрения удобства использования, это имеет недостаток это ssh-agent подсказки для пароля независимо от того, если ключ должен использоваться или не во время сессии входа в систему. Каждый новый вход в систему также порождает отличное ssh-agent экземпляр, который остается работать с добавленными ключами в памяти даже после выхода из системы, если явно не уничтожено.

Уничтожить ssh_agent на выходе из системы добавьте следующее к ~/.bash_logout

if [ -n "$SSH_AUTH_SOCK" ] ; then
  eval `/usr/bin/ssh-agent -k`
fi

или следующее к ~/.bash_profile

trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0

Создание нескольких ssh-agent экземпляров можно избежать путем создания персистентного коммуникационного сокета к агенту в фиксированном местоположении в файловой системе, такой как в ответе Collin Anderson. Это - улучшение по сравнению с порождением нескольких экземпляров агентов, однако, если явно не уничтожено дешифрованный ключ все еще остается в памяти после выхода из системы.

На рабочих столах ssh-агенты, включенные с настольной средой, такие как Брелок для ключей Gnome Агент SSH, могут быть лучшим подходом, поскольку они обычно могут заставляться запросить пароль в первый раз, когда ssh-ключ используется во время сессии входа в систему, и сохраните дешифрованный закрытый ключ в памяти до конца сессии.

ssh-ключ с паролем, с ssh-ident

ssh-ident утилита, которая может справиться ssh-agent от Вашего имени и идентификационные данные загрузки по мере необходимости. Это добавляет ключи только однажды, поскольку они необходимы, независимо от того, сколько терминалов, ssh или сессий входа в систему, которые требуют доступа к ssh-agent. Это может также добавить и использовать другой агент и другой набор ключей в зависимости от хоста, подключаемого с, или каталог ssh вызывается от. Это допускает изоляцию ключей при использовании передачи агента с различными хостами. Это также позволяет использовать несколько учетных записей на сайтах как GitHub.

Включить ssh-ident, установите его и добавьте следующий псевдоним к Вашему ~/bash_profile:

alias ssh='/path/to/ssh-ident'

ssh-ключ с паролем, с keychain

keychain маленькая утилита, которая справляется ssh-agent от Вашего имени и позволяет ssh-agent оставаться работать, когда сессия входа в систему заканчивается. На последующих логинах, keychain соединится с существующим ssh-agent экземпляр. На практике это означает, что пароль должен быть быть введенным только во время первого входа в систему после перезагрузки. На последующих логинах, незашифрованном ключе от существующего ssh-agent экземпляр используется. Это может также быть полезно для разрешения войти аутентификации RSA/DSA без пароля cron задания без ssh-ключей без пароля.

Включить keychain, установите его и добавьте что-то как следующее к ~/.bash_profile:

eval `keychain --agents ssh --eval id_rsa`

С точки зрения безопасности, ssh-ident и keychain хуже, чем ssh-agent экземпляры ограничили временем жизни конкретной сессии, но они предлагают высокий уровень удобства. Улучшить безопасность keychain, некоторые люди добавляют --clear опция к их ~/.bash_profile вызов связки ключей. Путем выполнения этого пароли должны быть повторно введены на входе в систему как выше, но cron задания будут все еще иметь доступ к незашифрованным ключам после того, как пользователь выйдет из системы. keychain страница Wiki имеет больше информации и примеров.

ssh-ключ без пароля

С точки зрения безопасности это - худшая опция, так как закрытый ключ полностью незащищен в случае, если это выставляется. Это - однако, единственный способ удостовериться, что пароль не должен быть повторно введен после перезагрузки.

ssh-ключ с паролем, с ssh-agent, передача пароля к ssh-add из сценария

В то время как это могло бы походить на простую идею передать пароль ssh-add из сценария, например. echo "passphrase\n" | ssh-add, это не столь просто, как это кажется как ssh-add не читает пароль из stdin, но открывается /dev/tty непосредственно для чтения.

Это может работаться вокруг с expect, инструмент для автоматизации интерактивных приложений. Ниже пример сценария, который добавляет ssh-ключ с помощью пароля, сохраненного в сценарии:

#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact

Обратите внимание, что, поскольку пароль хранится в простом тексте в сценарии с точки зрения безопасности, это едва лучше, чем наличие ssh-ключа без пароля. Если этот подход должен использоваться, важно удостовериться что expect сценарию, содержащему пароль, установил верные полномочия на него, делая его читаемым, перезаписываемым и выполнимым только ключевой владелец.

361
27.01.2020, 19:27
  • 1
    Хорошо, но когда я поместил Ваш код в ~/.bash_profile, я должен ввести в пароле каждый раз, когда я вхожу в систему, я не хочу это также. Я не обеспокоен безопасностью вообще. отзовитесь эхом "pass\n" | ssh-добавляют, не работает –  zdun8 17.09.2013, 15:59
  • 2
    @user1607072 Да, именно так ssh-agent отрывок в ~/.bash_profile ведет себя, как объяснено в ответе. Вы могли бы хотеть посмотреть на keychain утилита. С keychain необходимо ввести пароль на первом входе в систему после перезагрузки, но на последующих логинах keychain соединится с существующим ssh-agent экземпляр с дешифрованным ключом в памяти. Кроме этого существует опция генерации ssh-ключа без пароля, но это, конечно, не рекомендуется. –  Thomas Nyman 17.09.2013, 16:35
  • 3
    @user1607072, В то время как я настоятельно рекомендовал бы один из большего количества безопасных подходов, существует способ передать пароль ssh-add из сценария. Причина echo "pass\n" | ssh-add не работает это ssh-add не читает пароль из stdin, но открывается /dev/tty непосредственно для чтения. Обновленный ответ для включения обходного решения для этого, с помощью названной утилиты expect. –  Thomas Nyman 17.09.2013, 21:03
  • 4
    @user1607072, Это могло бы быть немного излишества для Вашего варианта использования, но Kerberos в сочетании с ssh GSSAPI поддержка может также использоваться для логинов ssh без пароля. Соответствующий метод аутентификации в ssh называют gssapi-with-mic. Это обычно используется в больших сетях, но конечно если у Вас есть интерес к этому, это могло бы стоить изучить. –  Thomas Nyman 18.09.2013, 14:54

Добавьте это к Вашему ~/.bashrc файл:

ssh-add -L|grep identities > /dev/null && ssh-add /path/to/ssh/private/key
0
27.01.2020, 19:27
  • 1
    , который я не вижу, как это касается вопроса, который является о том, чтобы не быть запрошенным пароля на последующих логинах. –  Chris Down 06.01.2014, 15:23

Я не буду рекомендовать вам ssh-add (который должен открыть ssh-агент) при входе в систему. Это связано с тем, что Вы не можете контролировать, когда заканчивается секция ssh-agent, и можете создать риск безопасности, когда Вам не нужно использовать ключевые файлы при одном входе в систему.

Вместо этого я рекомендую написать скрипт, открывающий подоболочку секции ssh-agent, с автоматическим добавлением всех ключевых файлов, и вызываемый при необходимости использования ssh. Если вы можете принять это, читайте дальше.

У вас есть два варианта:

  1. Удалить все ключевые фразы для ваших ключей, которые имеют слабую защиту в случае кражи ваших ключевых файлов. (поэтому не рекомендуется )

  2. Используйте одну и ту же ключевую фразу для Ваших ключей. Затем, когда Вы ssh-add keyfile1 keyfile2 ... , вам нужно будет ввести кодовую фразу только один раз, для каждого раздела.

В обоих случаях можно написать такой файл скрипта "ssh_keys_section.sh", как:

#!/bin/bash
# This script run a ssh-agent on a sub-shell and automatically ssh-add all keyfiles at once.
# This agent ends when you type `exit` to close the sub-shell.
exec ssh-agent bash -c "ssh-add /path/to/keyfile1 /path/to/keyfile2 ...; exec bash"

Замечания:

  • Команда изменить или удалить ключевую фразу: ssh-keygen -p -f keyfile
  • Внутри sub-shell, вы можете даже вставить больше терминалов, которые имеют одинаковые разблокированные ключи, используя, возможно, команду типа /path/to/yourterminal & (зависит от ОС)
4
27.01.2020, 19:27

Хорошо, это не очень трудно работать в init функции оболочки. Например:

fn(){ 
    echo first time called\!
    fn(){ 
        echo not the first time called\!
    }
}
fn; fn; fn

... напечатает...

first time called!
not the first time called!
not the first time called!

Можно также определить псевдонимы оболочки в функции, исходных файлах или любом способе вещей - можно сделать довольно многое с текущим состоянием оболочки, что также можно сделать по запросу , кроме повлиять на ее позиционные параметры (хотя даже это можно обойти с помощью псевдонимов ) .

Поэтому может быть хорошей идеей, чтобы исходить ваши установки в виде файлов .fn.name (или что-либо еще) , а затем вызывать их один раз в файле rc - где начальный вызов функции обрабатывает все свои собственные установки по мере необходимости, а затем переопределяет себя для всех вызовов после этого.

Или, аналогично некоторым оболочкам будет делать с autoload , вы можете создать однострочную функцию, которая определяется каждый раз, когда файл rc читается как:

printf '%b' '[ -f ~/.fn_name ] &&\n\tfn_name(){ . ~/.fn_name; }\n' >>~/.bash.rc

... и в ~/.fn _ name ...

fn_name(){ : now redefine the function; }

... в том смысле, что путь fn _ name будет использовать едва ли какое-либо состояние оболочки вообще до тех пор, пока оно не будет впервые вызвано, это не будет загромождать .bash.rc ужасно, и может быть легко управляемым.

Однако может быть проще поместить все эти типы в один файл ~/.fn и, чтобы получить его из основного rc, а затем, чтобы получить каждого человека из него.

-121--175009-

Можно попробовать:

$ sort -rt"," -k2,3 file.csv | 
   awk -F, '{a[$2][$3]=$0; if(a[$2][$4]){print a[$2][$4]; print;}}'
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper

Объяснение

  • Сортировка будет отсортирована по 2-му и 3-му полям, так что строки с одинаковым PDBID будут отсортированы вместе и в соответствии с положением 1-го остатка функции. -r изменяет сортировку на противоположную (так что сначала печатаются большие числа), -t, наборы разделитель полей на , и -k определяет поля для сортировки.

Что касается сценария awk :

  • -F, : установите разделитель поля на , .
  • a [$2] [$3] = $0; : это список списков, двумерный массив. Например, для первой строки это будет a [4tov] [1404] = $0 . a - это только имя массива. Значение равно текущей строке, $0 .
  • если (a [$2] [$4]) : если 4-е поле (второй остаток) было замечено связанным с тем же PDBID в качестве 1-го остатка.
  • распечатать [2] [4] долл. США; print; : печать строки, на которой она отображалась (поскольку она была сохранена как значение массива a ), и текущей строки.

У меня нет доступа к OSX для проверки, но на основании вашего комментария , похоже, что OSX awk , в отличие от GNU awk , не может иметь дело с многомерными массивами. Итак, вот то же самое в Perl:

sort -rt"," -k2,3 file.csv | 
 perl -F"," -ane '$k{$F[1]}{$F[2]}=$_; 
                  print "$k{$F[1]}{$F[3]}$_" if $k{$F[1]}{$F[3]}'
-121--161310-

Чтобы добавить (возможно, без пароля) ключ и убедиться, что ssh-add не будет запрашивать пароль, несмотря ни на что,даже при выполнении в X :

DISPLAY= ssh-add -k /path/to/key </dev/null &>/dev/null

Состояние выхода указывает на успех или неудачу.

0
27.01.2020, 19:27

Добавьте это в свой ~ / .bashrc , затем выйдите из системы и снова войдите, чтобы вступили в силу.

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l > /dev/null || ssh-add

Это должно запрашивать пароль только при первом входе в систему после каждой перезагрузки. Он будет повторно использовать один и тот же ssh-agent , пока он продолжает работать.

100
27.01.2020, 19:27

Вот обходной путь для автоматизации парольной фразы SSH.

  1. Создайте однострочный сценарий, который выводит вашу парольную фразу на стандартный вывод, например:

      echo 'echo MY_SSH_PASSWORD'> ~ / .print_ssh_password && chmod 700 ~ / .print_ssh_password 
     

    Важно: убедитесь, что вы копируете начальный пробел в , чтобы предотвратить сохранение пароля в истории .

И воспользуйтесь одним из следующих способов.

  • с использованием стандартного метода ввода:

     cat ~ / .ssh / id_rsa | SSH_ASKPASS = ~ / .print_ssh_password ssh-add - подход 
     
  • или именованный канал :

    1. Создайте именованный канал (вы также можете попробовать ] подстановка процесса ):

       mkfifo --mode 0600 ~ / .ssh_fifo 
       
    2. Запустите ssh-add , указав программу, используемую для аутентификации:

       кошка ~ / .ssh / id_rsa> ~ / .ssh_fifo | SSH_ASKPASS = ~ / .print_ssh_password ssh-add ~ / .ssh_fifo 
       

    См .: man ssh-add , чтобы узнать больше о SSH_ASKPASS .

5
27.01.2020, 19:27
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
     echo succeeded
     chmod 600 "${SSH_ENV}"
     . "${SSH_ENV}" > /dev/null
     /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
     . "${SSH_ENV}" > /dev/null
     #ps ${SSH_AGENT_PID} doesn't work under cywgin
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
         start_agent;
     }
else
     start_agent;
fi

Благодарность здесь: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html

Это решение также одобрено здесь: http://mah.everybody.org/docs/ssh

1
27.01.2020, 19:27

Я использовал сценарий, упомянутый steampowered, я Сделал нижеследующий сейчас, потому что он не оставляет файлы валяющимися.

Работает только с оболочкой zsh .

#!/bin/sh

AGENT_BIN=`which ssh-agent`
AGENT_ADD_BIN=`which ssh-add`
AGENT_PID=`ps -fe | grep ${AGENT_BIN} | awk -vuser=$USER -vcmd="$AGENT_BIN" '$1==user && $8==cmd{print $2;exit;}'`
if [ -z "$AGENT_BIN" ]; then
    echo "no ssh agent found!";
    return
fi
if [ "" -eq "$AGENT_PID" ]; then
    if read -sq "YN?Do you want to unlock your ssh keys?"; then
        echo ""
        output=`$AGENT_BIN | sed 's/echo/#echo/g'`
        eval $output
        $AGENT_ADD_BIN
    fi
else
    for f in "/proc/"*
    do
        cmdline=`cat "$f/cmdline"`
        if [ "${AGENT_BIN}" -ef "${cmdline}" ]; then
            export SSH_AUTH_SOCK=`cat $f/net/unix | grep --binary-file=text -oP '((/[^/]*?)+/ssh-[^/]+/agent\.\d+$)'`
            export SSH_AGENT_PID=${f##*/}
            break;
        fi
    done
fi
2
27.01.2020, 19:27

Не имеет непосредственного отношения к вопросу OP, но может быть полезен другим: начиная с версии 7.2.0 в ssh (1) есть опция, позволяющая добавить ключ к ssh-agent при первой аутентификации; вариант - AddKeysToAgent и может быть установлен на да , нет , спросить или подтвердить , в масштабе всей системы или в вашем личном файле .ssh / config .

Ссылка: https://www.openssh.com/txt/release-7.2

16
27.01.2020, 19:27

Если вы используете seahorse в качестве менеджера паролей ... Что вы, вероятно, и есть; D

Другое решение, которое достигает цели, которую вы ищете, - это просто добавить ssh-ключи в seahorse для автоматической разблокировки при входе в систему . Основным преимуществом этого является то, что вам никогда не нужно вводить пароль для ключей после входа в систему через gdm или что-то еще, с чем вы входите, даже если у ключей есть пароль. Для этого ТРЕБУЕТСЯ как закрытый, так и открытый ключ. Они также ДОЛЖНЫ следовать соглашению об именах для морских коньков. Допускается значение по умолчанию (id_rsa для закрытого ключа и id_rsa.pub для открытого ключа ... На самом деле все, что есть privatekeyname и privatekeyname.pub )

Чтобы добавить ваш ssh-ключ в морской конек для автоматической разблокировки при входе в систему; (на fedora25 я не уверен, где путь находится в других дистрибутивах, хотя, скорее всего, он очень похож)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

Для меня это было

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(морской конек автоматически Предположим, что открытый ключ в моем случае был id_rsa.pub)

После выполнения команды морской конек откроет симпатичное маленькое поле пароля gtk, чтобы ввести пароль для закрытого ключа. или просто оставьте поле пустым, если вы сгенерировали ключ без пароля.

Морской конек не подскажет, все ли прошло хорошо. Вам нужно будет попытаться подключиться к целевой машине по ssh.Затем морской конек предложит вам разблокировать ключ с помощью пароля графически (ЭТО ПРОИЗОЙДЕТ ТОЛЬКО ОДИН РАЗ), но на этот раз он должен выглядеть немного по-другому; P (это также та часть, где морской конек делает некоторые морские коньки для магии ssh-add, я считаю ) и предложите ВАРИАНТ для разблокировки ключа при входе в систему, вы должны отметить эту опцию, чтобы достичь своей цели.

Просто потому, что я не прочитал все ответы, я бы порекомендовал отменить то, что все говорили вам делать с помощью ssh-add, прежде чем пытаться ответить. В противном случае с вашими ключами может случиться что-то плохое, idk.

0
27.01.2020, 19:27

Вот окончательный сценарий.

Обновите $ PASSW, затем скопируйте и вставьте его в свой Терминал

# <sshpass> via typinator
# Updated: 2017-01-18_21h36
#
# apt-get update -y; apt-get install expect -qy

# Pass this value to ssh-add
PASSW="myfancypass123"

# Define a name for this script
THIS_SCRIPT="$(date +%Y-%m-%d_%H-%M-%S-%N)".sh

# Create a fresh directory to work from / Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la


# Output our bash script file - BEGIN
cat <<< '
#!/bin/bash

set -u     # Stop if an unbound variable is referenced
set -e     # Stop on first error
export HISTIGNORE="expect*";

# Normal CMDs
echo && echo "The process should take about 10 seconds:" && echo
eval "$(ssh-agent -s)"; sleep 0.5;

# Define VAR passed when this bash-script was launched
password="$@"

# Launch the expect magic
expect -c "
    spawn ssh-add /root/.ssh/id_rsa
    expect "?assword:"
    send \"$password\r\"
    expect "?password:"
    send \"$password\r\"
    expect eof"

export HISTIGNORE="";
export password="";
' > $THIS_SCRIPT
# Output our bash script file - END


# Ensure we are in the right path
cd ~/temp; ls -la; sleep 1;

# Run the bash script
chmod +x ./$THIS_SCRIPT; ./$THIS_SCRIPT "$PASSW"; unset password;

# Clean up
rm -rf ~/temp; mkdir -p ~/temp; cd ~/temp; ls -la
0
27.01.2020, 19:27

Решение с единым входом для SSH может привести меня кpam_ssh.

Согласно этой статье , понятие:

If you work with multiple *nix-based machines via ssh, you are probably tired of constantly having to enter your password every time you want to access another box. There is a secure way to allow you to access every machine, that you have ssh access to, without having to enter another password (other than the one you signed on with originally.)


This is actually quite simple to do, you basically just create a public/private key pair to authenticate yourself to your other machines, then have PAM spawn an agent to load your keys after you logon, providing a single signon solution to accessing all your remote machines. This guide will walk you through setting this up.

Я не проверял, действительно ли это работает.

1
27.01.2020, 19:27

Лучший известный мне способ — использовать сценарий входа в систему PAM, который я адаптировал из предыдущей работы, поскольку не смог найти удовлетворительного ответа на этот вопрос.

Ваша парольная фраза хранится в зашифрованном виде с помощью системного пароля и сложной функции деривации. При входе в систему ваш системный пароль используется для расшифровки парольной фразы и ее добавления в агент.

https://github.com/capocasa/systemd-user-pam-ssh

Преимущество по сравнению с любым другим представленным решением заключается в том, что оно сочетает в себе безопасность, эквивалентную запуску ssh -add вручную при загрузке без каких-либо усилий. Он не требует дополнительных инструментов и имеет одну дополнительную зависимость, которая уже установлена ​​по умолчанию в большинстве систем (OpenSSL ).

0
27.01.2020, 19:27

Мои настройки в macOS следующие: (в .zshrcили .bash_profileдля пользователей bash):

# Kill then Load the ssh-agent and set the necessary env variables it outputs
sshRestart() {
    # if all else fails
    # pkill -u $(whoami) ssh-agent;

    if [ -n "$SSH_AUTH_SOCK" ] ; then
        eval `/usr/bin/ssh-agent -k`
    fi
    eval `ssh-agent -s`
    ssh-add ~/.ssh/YOUR_KEY_FILE
    echo "Restarted SSH agent"
}

if [ -z "$SSH_AUTH_SOCK" ] || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]] ; then
    eval `ssh-agent -s` > /dev/null 2>&1
    ssh-add ~/.ssh/YOUR_KEY_FILE > /dev/null 2>&1
fi

Часть || [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]необходима в macOS, поскольку значение по умолчанию — /private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners. В противном случае исчерпывающий ответ @Thomas Nyman не удастся, потому что $SSH_AUTH_SOCKвсегда имеет значение.

Затем в.zlogout(или .bash_logoutдля башков):

if [ -n "$SSH_AUTH_SOCK" ] ; then
    eval `/usr/bin/ssh-agent -k`
fi

Протестировано на macOS Mojave 10.14.5

0
27.01.2020, 19:27
if [ ! -S ${HOME}/.ssh/ssh_auth_sock ]; then
  eval $(ssh-agent)
  ln -sf "${SSH_AUTH_SOCK}" ${HOME}/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=${HOME}/.ssh/ssh_auth_sock

ssh_keys=$(find -E ~/.ssh -type f -regex '.*(rsa$|pem)')
ssh_agent_keys=$(ssh-add -l | awk '{key=NF-1; print $key}')

for k in "${ssh_keys}"; do
    for l in "${ssh_agent_keys}"; do
        if [[ ! "${k}" = "${l}" ]]; then
            ssh-add "${k}" > /dev/null 2>&1
        fi
    done
done
3
27.01.2020, 19:27

Это очень хорошо объяснил GitHub в Автоматическом -запуске агента ssh -в Git для Windows , который, в свою очередь, работает и для Linux.

Вы можете запускать ssh-agentавтоматически при открытии оболочки bash или Git. Скопируйте следующие строки и вставьте их в свой файл ~/.profileили ~/.bashrcв оболочке Git:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" &&. "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
   . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Если ваш закрытый ключ не хранится ни в одном из местоположений по умолчанию (, например ~/.ssh/id_rsa), вам нужно сообщить агенту аутентификации SSH, где его найти. Чтобы добавить свой ключ в агент ssh -, введите ssh-add ~/path/to/my_key.

Совет:Если вы хотите, чтобы ssh-agentзабыл ваш ключ через некоторое время, вы можете настроить его для этого, запустив ssh-add -t <seconds>.

-1
11.02.2021, 13:14

Самое простое решение не обязательно должно быть плохим.

Вам не нужны ни ssh-agent, ни ssh-add, если вы используете секретный ключ без пароля, см.https://stackoverflow.com/a/48290333/11154841.

Это не обязательно должно быть небезопасно. :Вам просто нужно удалить оба ключа пары ключей сразу после их использования. Это означает, что вы должны удалить открытый ключ на сервере и удалить закрытый ключ на клиенте. Само собой разумеется :никогда их больше не используйте, даже не храните где-нибудь резервную копию.

Имейте в виду, что вы можете создать открытый ключ из закрытого ключа, но не наоборот. Обычно достаточно просто удалить открытый ключ из зарегистрированных ключей на вашем портале Git, но лучше удалить оба, чтобы один и тот же открытый ключ больше никогда не использовался. Даже если кто-то украл ваш закрытый ключ, от этого будет бесполезно, если вы просто никогда больше не будете использовать его открытый ключ.

С закрытым ключом без пароля вы даже можете использовать его в Docker, чтобы обойти любые вводы пароля. Вы можете клонировать репозиторий git без пароля, вам нужен закрытый ключ без пароля. См. Dockerfile :клон репозитория с закрытым ключом без пароля. Например, ошибки :«агент аутентификации» или «чтение _фразы-пароля :не могут открыть /dev/tty» .

0
16.03.2021, 01:05

Теги

Похожие вопросы