У меня есть следующее .bash_profile на моих удаленных серверах:
if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
reattach() {
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
fi
exec screen -A -D -RR ${1:+"$@"}
}
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
Это делает две вещи: во-первых, устанавливает функцию оболочки для замены оболочки и переноса соединения ssh-agent, во-вторых, она вызывает функцию после паузы в течение нескольких секунд (если вы не хотите, чтобы экран запускался).
Первое ifпредложение будет истинным, если еще не запущенный screen ( -z "${STY}") подключен к терминалу ( -t 0), а я не запускаю sudo (который иногда не меняется $USER).
reattachФункция будет сначала проверить , если SSH был вызван с портом SSH-агент активным ( -n "${SSH_AUTH_SOCK}"). Затем он заменит все, что находится в ~/.ssh/agent-scriptтекущем активном файле сокета, и заменит переменную среды ( $SSH_AUTH_SOCK) новым значением. Затем скрипт заменит текущую оболочку одним screenсеансом (убедившись, что должен существовать только один). Все аргументы reattachфункции передаются в команду ( ${1:+"$@"}).
Последняя часть сначала удаляет все мертвые сессии ( screen -wipe), сообщает пользователю (мне), что экран скоро запустится, и вместо этого может вернуться в оболочку, нажав Ctrl- C. Затем он ждет 5 секунд и вызывает reattachфункцию.