При запуске экранной сессии, в то время как ssh-агент работает (от ssh-A передача агента), получение доступ к ssh-агенту хорошо работает. Однако, если Вы отсоединяетесь от той сессии, выходите из системы, входите в систему снова (с передачей ssh-агента) и повторно прикрепляете к своей экранной сессии, доступ ssh-агента не работает.
Как это может быть зафиксировано?
1) В Вашем емкостно-резистивном сценарии SSH (~/.ssh/rc) Вы настроите символьную ссылку от канонического местоположения до "текущего" SSH_AUTH_SOCK. Вот то, как я делаю это в ударе (содержание ~/.ssh/rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(и удостоверьтесь к chmod 755 ~/.ssh/rc). "Тест" должен только препятствовать ошибке отобразиться, если Вы не выполняете ssh-агент (т.е. Вы ssh без-A). Вторая половина из этого наборы команд символьная ссылка в каноническом месте, которое обновляет себя к "реальному" SSH_AUTH_SOCK во время входа в систему. Это независимо от использования оболочки в ssh или вызове команды непосредственно, работы также с "ssh-t экранируют-RRD".
Примечание: существование ~/.ssh/rc изменяет поведение sshd. В частности, это не назовет xauth. Посмотрите человека sshd для получения дополнительной информации, и как зафиксировать это.
Кроме того, Вы не должны использовать "-v" с ln, как только он повредит rsync-over-ssh со следующей диагностикой:
$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
2) В Вашем .screenrc просто необходимо переопределить SSH_AUTH_SOCK к каноническому местоположению:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Обратите внимание использование setenv независимо от того, что окружает Вас использование; я думаю, что setenv является экранным синтаксисом, не оболочкой.
Решение первоначально адаптировалось из этого сообщения, которое не работает, но имеет верное представление.
"ssh-t some.machine экранируют-R", не выполнит удар и поэтому не запустит .bash_profile скрипт, где символьная ссылка создается.
Вы могли попробовать: ssh-t some.machine колотят-c, "экранируют-R"
(принятие Вас использует удар в качестве Вашей оболочки, конечно),
Править: Тот "ответ" является на самом деле комментарием к первому ответу, данному выше :)
Я думаю, что Вам нужен autossh. Я использовал его уже много лет и объединился с экраном, это делает все мои терминальные сеансы абсолютно портативными и прозрачными. Я просто закрываю lappy, перемещаюсь в новое местоположение, открываю lappy и все мои экраны, и вложенные экраны соединяются автоматически. Я даже больше не думаю об этом.
http://www.linux.com/archive/feature/134133
основы... Я ruby'd немного сценария для автоматизации процесса в моем .screenrc для данного хоста. (также делает мою передачу ssh, таким образом, во всех этих различных местах я могу туннелировать свое соединение через мои серверы),
в autossh дистрибутиве должна быть программа, названная rscreen (и.. существует!)
#!/bin/sh
#
# sample script to use autossh to open up a remote screen
# session, or reconnect to an existing one.
#
# $Id: rscreen,v 1.4 2002/05/07 17:54:13 harding Exp $
#
if [ "X$1" = "X" ]; then
echo "usage: `basename $0` <host>"
exit 1
fi
if [ "X$SSH_AUTH_SOCK" = "X" ]; then
eval `ssh-agent -s`
ssh-add $HOME/.ssh/id_rsa
fi
#AUTOSSH_POLL=600
#AUTOSSH_PORT=20000
#AUTOSSH_GATETIME=30
#AUTOSSH_LOGFILE=$HOST.log
#AUTOSSH_DEBUG=yes
#AUTOSSH_PATH=/usr/local/bin/ssh
export AUTOSSH_POLL AUTOSSH_LOGFILE AUTOSSH_DEBUG AUTOSSH_PATH AUTOSSH_GATETIME
autossh -M 20004 -t $1 "screen -e^Zz -D -R"
Это должно помочь с ssh/screen проблемами
Наконец, для поддерживания моего ssh-агента в рабочем состоянии, я использую связку ключей, так как я - своего рода глава оболочки... Я думаю, что OSX имеет что-то в наличии для имения в наличии агента...
Вот метод, который я использую:
SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK) ; eval $SOCK ; export SSH_AUTH_SOCK
DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY) ; eval $DISP ; export DISP
Я обычно настраивал псевдоним или функцию оболочки с командами тезисов:
function ssh-screen-auth() {
SOCK=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep SSH_AUTH_SOCK)
eval $SOCK
export SSH_AUTH_SOCK
DISP=$(sudo cat /proc/$(pgrep -f "screen -(r|DR)")/environ | tr "\0" "\n" | grep DISPLAY)
eval $DISP
export DISPLAY
}
Вам, вероятно, придется адаптировать регулярное выражение 'экран - (r|DR)' к точным командам, которые Вы используете для повторного прикрепления экрана.
Протест с моим методом: вещи могут пойти не так, как надо, если существует другая "экранная" команда, работающая на компьютере.