1) В вашем скрипте SSH rc (~ / .ssh / rc) вы установите символическую ссылку из канонического местоположения на «текущий» SSH_AUTH_SOCK. Вот как я это делаю в bash (содержимое ~ / .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-agent (т.е. вы используете ssh без -A). Вторая половина этой команды устанавливает символическую ссылку в каноническом месте, которая обновляется до «реального» SSH_AUTH_SOCK во время входа в систему. Это не зависит от использования оболочки в ssh или непосредственного вызова команды, также работает с "ssh -t screen -RRD".
Примечание: существование ~ / .ssh / rc меняет поведение sshd. Примечательно, что он не будет называть xauth. Смотрите man 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 - это экранный синтаксис, а не оболочка.
Решение изначально адаптировано из этого поста , которое не работает, но имеет правильную идею.
Я думаю, что это работает как упрощение ответа @ sandip-bhattacharya. Поместите это в свой
~/.bashrc
файл и запускайте команду экспорта во всех текущих сеансах экрана.Это гласит «если
$SSH_AUTH_SOCK
это сокет (-S
), а не символическая ссылка (! -h
), создайте новую символическую ссылку по известному пути. Во всех случаях переопределите,SSH_AUTH_SOCK
чтобы указать на известный путь.В
! -h
избегает создания циклической ссылки , если вы запустите это несколько раз.Кроме того, если вы используете
byobu
, он делает это автоматически, без необходимости редактировать файлы конфигурации.Единственная ошибка, которую я обнаружил в этом (
byobu
имеет ее тоже), - если вы откроете второеssh -A
илиForwardAgent
соединение, оно перезапишет первый сокет, и если вы закроете второе соединение до первого, вы потеряете свой единственный хороший сокет.источник
tmux
также.~/.ssh/ssh_auth_sock_"$(hostname)"
для вашей символической ссылки. Он будет хранить отдельные сокеты аутентификации для каждого хоста.«ssh -t some.machine screen -R» не будет запускать bash и, следовательно, не будет запускать сценарий .bash_profile, в котором создается символическая ссылка.
Вы можете попробовать: ssh -t some.machine bash -c "screen -R"
(конечно, если вы используете bash в качестве оболочки)
Изменить: этот «ответ» на самом деле комментарий к первому ответу, приведенному выше :)
источник
Я думаю, что вам нужно Autossh. Я использую его уже много лет, и в сочетании с экраном он делает все мои терминальные сессии полностью переносимыми и прозрачными. Я просто закрываю lappy, перехожу на новое место, открываю lappy и все мои экраны и вложенные экраны подключаются автоматически. Я даже не думаю об этом больше.
http://www.linux.com/archive/feature/134133
это основа ... Я ruby создал сценарий lil для автоматизации процесса в моем .screenrc для данного хоста. (также выполняет пересылку по ssh, поэтому во всех этих разных местах я могу туннелировать свое соединение через мои серверы)
в дистрибутиве autossh должна быть программа rscreen (и ... есть!)
Это должно помочь с проблемами SSH / экрана
Наконец, для того, чтобы мой ssh-агент работал, я использую связку ключей, так как я являюсь чем-то вроде головы оболочки ... Я думаю, в OSX есть что-то доступное, чтобы держать вашего агента рядом ...
источник
Вот метод, который я использую:
Обычно я настраиваю псевдоним или функцию оболочки с помощью этих команд:
Возможно, вам придется адаптировать регулярное выражение « screen - (r | DR) » к точным командам, которые вы используете для повторного подключения экрана.
Предостережение с моим методом: все может пойти не так, если на компьютере запущена другая команда « screen ».
источник
sudo
.Я обычно поддерживаю долгосрочные (более 6 месяцев) сеансы на своем рабочем месте на разных серверах. Поэтому многократное подключение и наличие жизнеспособного ssh-экспедитора было проблематичным. Вот что я настроил в своих системах:
Если я просто войду на удаленный сервер без запуска / повторного подключения экрана, то появятся два «сокета», один используется
screen
другим, а другой - новой оболочкой. Не должно быть двух сеансов «запуска», но второй сеанс все еще можно запустить с помощьюreattach -S new
; в этой ситуации агент будет разделен со~/.ssh/agent-screen
значением. Чтобы вернуть работающего экспедитора обратно, я бы отсоединил, снова вошел в систему.X${USER} = Xmyusername
Гарантирует, что код не будет вызыватьсяsudo
на том же сервере.источник
Я использую вариант того, что @apinstein использует для моего .bashrc .
Это работает для всех приложений, запущенных в моем сеансе экрана. Это будет работать для всех новых оболочек в вашем сеансе экрана. Для существующих оболочек вам нужно запустить
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
оболочку хоста, чтобы она заработала.PS Извините, что добавил это как независимый ответ, тогда как он просто основан на ответе @ apinstein. Пришлось сделать это, так как комментарии в stackoverflow не поддерживают блоки кода.
источник
Я попробовал этот простой вкладыш, как было предложено в статье Давайте подружимся с screen и ssh-agent, и он работает для меня.
Первый раз войдите в Target. Необходимо сделать только один раз.
Первый запуск экрана .. Нужно сделать только один раз.
Если отсоединен или отключен, используйте эту команду для последующего входа в систему, чтобы подключиться к экрану выхода.
источник
Это все действительно хорошие ответы, я делаю это немного по-другому. После запуска нового сеанса ssh и повторного подключения я сбрасываю
SSH_AUTH_SOCK
переменную среды, основываясь на содержимом среды root bash. Мне требуется доступ ssh-agent только при использовании svn, поэтому я просто перезагружаюсь,SSH_AUTH_SOCK
как требуется в этих оболочках.При этом используется файловая система proc, поэтому она специфична для Linux. Я протестировал это только на безголовом Linux-боксе, к которому у меня есть доступ, может потребоваться некоторая настройка, чтобы заставить его работать в других средах.
Сбросить SSH_AUTH_SOCK (это можно сделать псевдонимом).
screen_auth.sh выглядит так
источник
Все вышеперечисленные решения страдают от гонок (либо в нескольких сеансах SCREEN, либо в нескольких соединениях SSH). Единственное универсальное решение, о котором я могу подумать, - это сначала включить SSH_AUTH_SOCK для процесса сервера SCREEN,
screen -r
а затем перетащить его в сеанс BASH перед каждой интерактивной не встроенной командой. К сожалению, SCREEN и BASH были разработаны без осознания таких проблем, поэтому их сложно реализовать должным образом (хотя никогда не поздно опубликовать запросы функций в обоих проектах). Моя попытка была преодолена для BASH-сессий, которые можно найти здесь:Установить:
$HOME/bin
, добавьте исполняемый бит;убедитесь, что
$HOME/bin
идет/usr/bin
в PATH:PATH = $ HOME / Bin: $ PATH
добавьте это к вашему
.bashrc
:настройка источника $ HOME / bin / screen-helper
Теперь вы можете попытаться создать сеанс SCREEN внутри сеанса SSH, отсоединить, отключить, подключить и снова подключить, и, надеюсь, вы
ssh-add -l
должны правильно отобразить ваши ключи.источник
ssh-agent
демон (как предложено здесь superuser.com/a/412052/376867 ) не страдает от состояния гонки, но страдает от несвежего набора ключей. И что более важно, не очень безопасно оставлять все свои ключи на удаленном хосте вместе с сеансом экрана (или даже дольше до перезагрузки в случае упомянутого поста).Я пролистал другие ответы и не смог найти свой. Вот что я использую. Создайте файл
~/.screenrc-wrapper
со следующим содержимым:И добавьте это к себе
~/.bashrc
(или,~/.zshrc
если вы используете это):Таким образом, вы будете использовать два сеанса экрана - один «обертка» и один внутренний. Это сохранит последний, даже когда вы выйдете из системы, и он продолжит включать ssh-agent. Еще одна приятная особенность заключается в том, что он запомнит настройки вашего окна - если вы используете разделенные окна, это может быть очень удобно.
Вы можете найти эту функцию в контексте в моих точечных файлах .
источник