Есть ли удобный способ гарантировать, что все логины от данного пользователя (т.е. меня) используют один и тот же 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
); Я написал это некоторое время назад и с тех пор многому научился.