Как Вы заставляете экран автоматически соединяться с текущим ssh-агентом при повторном прикреплении к существующему экрану?

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

Как это может быть зафиксировано?

48
задан 15.04.2013, 18:17

4 ответа

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 является экранным синтаксисом, не оболочкой.

Решение первоначально адаптировалось из этого сообщения, которое не работает, но имеет верное представление.

41
ответ дан 07.12.2019, 08:32

"ssh-t some.machine экранируют-R", не выполнит удар и поэтому не запустит .bash_profile скрипт, где символьная ссылка создается.

Вы могли попробовать: ssh-t some.machine колотят-c, "экранируют-R"

(принятие Вас использует удар в качестве Вашей оболочки, конечно),

Править: Тот "ответ" является на самом деле комментарием к первому ответу, данному выше :)

4
ответ дан 07.12.2019, 08:32

Я думаю, что Вам нужен 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 имеет что-то в наличии для имения в наличии агента...

3
ответ дан 07.12.2019, 08:32

Вот метод, который я использую:

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)' к точным командам, которые Вы используете для повторного прикрепления экрана.

  • Первая строка читает, переменная среды SSH_AUTH_SOCK в пространстве процесса "экрана-r" управляют, чтобы Вы просто ввели и обновляете значение в своей текущей оболочке.
  • Вторая строка необходима, если Вы используете "ssh-X" для передачи соединений X11: это обновляет переменную ДИСПЛЕЯ таким же образом.

Протест с моим методом: вещи могут пойти не так, как надо, если существует другая "экранная" команда, работающая на компьютере.

2
ответ дан 07.12.2019, 08:32

Теги

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