У меня есть следующее .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
функцию.