Я начал задавать этот вопрос, но ответил на это, в то время как у меня был он открытый. Я собираюсь отправить этот вопрос, чтобы продолжить он с моим решением и оставить его открывается к другим потенциальным решениям.
<
предыстория>
Я - пользователь энергии и tmux. Мне нравится удаленная работа энергии, поскольку я не должен волноваться о машинах разработки Ubuntu kirking, когда фильм флэш-памяти дает мне панику ядра. Выполнение tmux означает, что открытые файлы ожидают меня после того, как я перезагружаю, и я могу продолжить от того, где я кончил. У меня были проблемы с энергией, работающей на tmux сессии, когда я соединяюсь как так:
ssh example.com -t 'tmux attach'
Проблемы UTF-8 неожиданно возникают, которые не неожиданно возникают при окружении в обычно и просто присоединении к tmux сессии вручную.
<
/ предыстория>
Таким образом, я хочу допускающий повторное использование метод запуска чего-то на входе в систему ssh, который не влияет ни на одну из других вещей, я настроил в моем .zshrc
(или Ваш .bashrc
если Вы все еще используете удар), который может требоваться для моей среды разработки, которая не появляется, когда я иногда работаю локально над очень упомянутой машиной.
Когда Вы работаете ssh example.com
, ssh демон запускает оболочку входа в систему для Вас, и оболочка входа в систему читает Ваш ~/.profile
(или ~/.bash_profile
или ~/.zprofile
или ~/.login
в зависимости от Вашей оболочки входа в систему). Когда Вы указываете команду для выполнения удаленно (с или без -t
), ssh демон запускает обычную оболочку, таким образом, Ваш .profile
не читается. Средство:
ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'
Большинство ssh демонов настроено для отказа от переменных среды передачи за исключением LC_*
. Если ssh демон на example.com
позволяет его, можно злоупотребить пользовательским LC_*
переменная для запуска tmux автоматически — вставила это Ваш ~/.profile
:
if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
exec tmux attach
fi
затем войдите в систему с LC_tmux_session= ssh example.com
или LC_tmux_session=session_name ssh example.com
.
Этот ответ имеет больше информации о передающих переменных среды по ssh.
Я ранее советовал устанавливать PermitUserEnvironment yes
и включение переменной среды Ваш ~/.ssh/environment
до Eli Heady, внесенного с лучшим предложением в комментариях ниже.
Откройте Ваш .zlogin
(удар: .bash_profile
и т.д.) и помещенный следующее:
if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
while true; do
echo -n "Do you want to attach to a tmux session? [y/n]"
read yn
case $yn in
[Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
[Nn]* ) break;;
* ) echo "Please answer y/n";;
esac
done
fi
Вдохновение, взятое от: Как я запрашиваю вход в сценарии оболочки Linux?
Обратите внимание, что я использовал .zlogin
файл, но Вы могли использовать Ваш .zshrc
файл, но мне нравится сохранять мой dotfiles опрятным, и он разделяет его так, я могу использовать его на других машинах.
Замените вопрос чем-то подходящим для себя и замены MY_SSH_CONNECTION="yes" tmux attach
с чем Вы хотите работать в той точке.
Отметьте, как сценарий устанавливает MY_SSH_CONNECTION="yes"
прежде tmux attach
для передачи его до tmux как, он также будет открывать оболочку, которая получит доступ к тому же самому сценарию выше и предотвратит любую рекурсию.
if [[ "$SSH_CONNECTION" != "" ]]
должен сделать это.
– Eli Heady
22.03.2011, 14:42
Самостоятельно, я добавляю это к своим .bash_profile файлам:
if [ -z "$STY" ]; then
reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
screen -wipe
echo 'starting screen... (type Ctrl-C to abort)'
sleep 5 && reattach
fi
Это дает мне некоторое время для прерывания повторного прикрепления к или создания экранной сессии. Это не продолжит работать 'ssh системные форматы' команды (который не называет ~/. *profile). Функция оболочки настраивается, чтобы повторно прикрепить, если я прерываюсь.
Вы могли бы рассмотреть выполнение
ssh remotehost -t screen -DR
и выполненный Ваш терминальный сеанс там. Можно затем отсоединиться (^A^D
) и повторно прикрепите позже (от другого клиента также). Это заставит проблему с неинтерактивной инициализацией уйти, поскольку экран сохраняет полные сессии интерактивного терминала (дополнительно оболочки входа в систему также, man screen
(1) или ^A?
)
-t 'tmux attach'
У меня есть проблемы с энергией, которые обычно не присутствуют. Поэтому реальный вопрос о запущении скриптов на подключении ssh, а не экране/управлении сеансами. Извинения за то, что не были более ясными в моем вопросе
– connrs
23.03.2011, 11:44
Говорить с проблемами UTF-8 а именно, если Вы добавляете
SendEnv LANG
И $LANG
установлен на что-то как en_US.UTF-8
на местном конце и Вашем sshd на удаленном конце разрешает SendEnv
директива (с AcceptEnv
в sshd_config
), tmux на другом конце должен соблюдать его. У меня была эта проблема некоторое время, и было трудно диагностировать.
Если Вы хотите, чтобы это работало каждый раз, когда Вы соединяетесь, Вы могли бы просто добавить tmux attach
к нижней части Вашего ~/.profile
на удаленной машине.
ssh example.com -t 'tmux attach'
не то, потому что это имеет проблемы при загрузке моей среды, а потому что у меня были проблемы с символьным дисплеем UTF-8; эта проблема не существует при соединении стандартным способом. Поэтому этот вопрос о запущении скриптов сразу после соединения по SSH. – connrs 23.03.2011, 11:17.profile
? Я предположил, что проблема была должна неправильно установить локали на целевой машине, который Ваш/etc/profile
или.profile
фиксированный. Проблема локали является, вероятно, закрепляемой с большей информацией. – Gilles 'SO- stop being evil' 23.03.2011, 21:33