Есть ли удобный способ гарантировать, что все логины от данного пользователя (т.е. меня) используют один и тот же ssh-agent? Я взломал сценарий, чтобы сделать эту работу большую часть времени, но я все время подозревал, что есть какой-то способ сделать это, что я только что пропустил. Кроме того, с тех пор были достигнуты удивительные успехи в области компьютерных технологий, как, например, этот веб-сайт.
Итак, цель в том, чтобы
- всякий раз, когда я вхожу в ящик, независимо от того, идет ли он через SSH, или в графическом сеансе, запущенном из gdm / kdm / etc, или в консоли:
- если мое имя пользователя в данный момент не
ssh-agent
запущено, оно запускается, переменные среды экспортируются иssh-add
вызываются. - в противном случае координаты существующего агента экспортируются в переменные среды сеанса входа в систему.
- если мое имя пользователя в данный момент не
Это средство особенно ценно, когда рассматриваемый ящик используется как точка ретрансляции при ssh
входе в третий ящик. В этом случае он избегает необходимости вводить парольную фразу закрытого ключа каждый раз, когда вы входите в ssh, а затем хотите, например, выполнить git push
или что-то еще.
Сценарий, приведенный ниже, делает это в основном надежно, хотя в последнее время он потерпел неудачу, когда X потерпел крах, и тогда я начал еще один графический сеанс. Возможно, в этом случае произошли другие шалости.
Вот мой плохой сценарий. Я получаю это из моего .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Пожалуйста, скажите мне, что есть лучший способ сделать это. Также, пожалуйста, не придирайтесь к несоответствиям / оплошностям (например, добавляя var
вещи etc
); Я написал это некоторое время назад и с тех пор многому научился.
Ответы:
С таким же успехом я мог бы добавить свой собственный вариант в смесь:
И затем каждый раз, когда я вхожу в систему, если я хочу подключить агента (что я не всегда), я просто набираю
sagent
.источник
if [ ! -x "$(which ssh-add)" ];
следует заменить наif ! which ssh-add;
илиif ! command -v ssh-add
. (Помните,[
это просто команда)if ! which ssh-add > /dev/null
для предотвращения печати пути, и в этот момент я не совсем уверен, что он более понятен, хотя, полагаю, это сэкономит вам один дополнительный вызов команды.ssh -A [user@]remotehost
Я думаю, что это может быть то, что вы ищете. Используйте ключ -A при запуске ssh forward вашего ssh-agent. Вот пример использования:
У меня есть удаленный сервер, на котором есть некоторые git-репозитории с удаленным указателем на github. Без ssh-agent, запущенного в сеансе экрана, я должен ввести ключевую фразу для своего ключа, чтобы сделать «мастер происхождения git pull». Booo! Кроме того, у меня должен быть установлен мой закрытый ключ на удаленном сервере - больше Boooo!
Вместо этого, просто используя
ssh -A [user@]remotehost
проходы по моему локально работающему ssh-agent. Теперь мне больше не нужен мой личный ключ, чтобы существовать даже на удаленном хосте. Я не верю, что вам нужно делать какие-либо скрипты с ssh-agent.источник
man 5 ssh_config
дляForwardAgent
настройки конфигурации. Он включает переадресацию агента по умолчанию, устраняя необходимость в-A
аргументе. Перед использованием переадресации агента следует помнить, что существует угроза безопасности, при которой другие привилегированные пользователи на удаленном компьютере могут получить доступ к перенаправленному сокету агента. Это также упоминается на странице руководства. Это хорошо объяснено здесь .Вот довольно хороший, который работает и в Cygwin:
Добавьте его в ваш .bash_profile или .bashrc
Источник: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
источник
${SSH_ENV}
должно быть,"${SSH_ENV}"
если в вашем имени пользователя Windows есть пробелПопробуйте использовать брелок, это сделано для этого. http://www.gentoo.org/doc/en/keychain-guide.xml
источник
Я недавно начал использовать:
https://github.com/ccontavalli/ssh-ident
Все, что мне нужно сделать, это добавить:
В моем файле .bashrc. Сценарий заботится о:
источник
Я предпочитаю делать вещи максимально простыми: (фрагмент из
~/.profile
)Я не думал об использовании
-a
раньше, но это может быть проще:источник
В моем случае у меня есть шикарно-ГИТ установка в PowerShell и хотел Cygwin использовать тот же SSH-агент. Мне пришлось сделать некоторые манипуляции с путями, поскольку они используют разные папки tmp, и был создан файл .env UTF16 с BOM и CR \ LF, так что было интересно иметь дело. Добавление следующего к .bashrc, используемому cygwin, должно работать:
источник
Снова пример для немедленного добавления вашего .bash_profile с просьбой добавить ваш ключ по умолчанию при входе в систему. Переадресация не была вариантом в моем случае.
источник
Это мое решение, адаптированное с https://superuser.com/a/141233/5255 (в этой теме):
источник
создать файл ~ / ssh-agent.sh
включите файл в .bashrc
источник
Это то, что я добавил, что работает для меня. Сначала он проверяет, запущен ли агент, и если да, он установит для него подходящие среды, если нет, то создаст его. Также исключает создание дополнительных агентов:
Просто поместите это в свой
.bashrc
источник
У меня есть вариант этой проблемы, взятый прямо из моего .bashrc:
Это решение хранит копию информации об агенте SSH в вашем домашнем каталоге. Если у вас есть домашний каталог с автоматическим подключением NFS, который может использоваться несколькими хостами, имя хоста используется как часть имени файла, чтобы различать их, поэтому вход в систему с одного компьютера не приведет к засорению используемого файла агента на другом.
Поведение:
1) При первом сеансе пользователя запрашивается ключевая фраза.
2) Вторые, третьи и четвертые (и так далее) сеансы наследуют SSH-агент и ключи, добавленные в первый.
3) Если агент убит или аварийно завершает работу, первый последующий сеанс создаст нового агента, перезапишет файл агента новым - и снова запросит ключевую фразу-пароль. Созданные впоследствии сеансы будут вести себя как сценарий 2), пока новый агент SSH продолжает работать.
источник
(это относится к посту 2 выше, я не смог добавить комментарий)
@raghavan: Ваш пример полезен, но предлагает изменить две строки, которые имеют
pgrep ssh-agent
в
pgrep -u $ USER ssh-agent> / dev / null
так, чтобы были найдены только агенты, работающие под текущим пользователем, и pid не отображается на экране (очиститель).
Также будет предложено изменить $ HOME / ssh-agent.out на $ HOME / .ssh-agent.out
С уважением
источник
Я прочитал ваше оригинальное решение и ряд предложенных, но решил упростить процесс для собственного использования. Это то, что я добавил в свой собственный .bashrc:
Я сделал пару предположений здесь:
В общем, я думаю, что это похоже на простое решение.
источник
Я обнаружил, что у меня часто
ssh-agent
выполнялось несколько процессов, и что PID внутри имени файла сокета никогда не совпадал с PID работающегоssh-agent
, поэтому я взломал что-то, чтобы попытаться восстановиться после этих условий, основываясь на многочисленных приведенных выше примерах.Это отдельная функция, она использует переменную Zsh для идентификатора пользователя, если она там есть, и пытается тратить меньше времени на разбор, возможно, огромных
/tmp
каталогов, ограничиваяfind(1)
немного больше.Вероятно, он все еще подвержен ошибкам и запутан, но некоторые поверхностные тесты показывают, что он в основном работает для моих сценариев использования, так что вот так:
источник
Вот мое вращение на этом. Я ' источник ' ниже сценарий из моего .bash_profile :
источник
Вот простой скрипт, который всегда будет повторно использовать один и тот же ssh-agent или запускать ssh-agent, если он не запущен. Ключ должен использовать
-a
опцию, чтобы использовать то же имя сокета. В противном случае по умолчанию он будет каждый раз выбирать случайное имя сокета. Вы также можете легко объединить эти 3 строки в псевдоним из 1 строки.источник
источник