Как я могу сразу запустить скрипт после соединения через SSH?

Я начал задавать этот вопрос, но ответил на это, в то время как у меня был он открытый. Я собираюсь отправить этот вопрос, чтобы продолжить он с моим решением и оставить его открывается к другим потенциальным решениям.

<предыстория>

Я - пользователь энергии и tmux. Мне нравится удаленная работа энергии, поскольку я не должен волноваться о машинах разработки Ubuntu kirking, когда фильм флэш-памяти дает мне панику ядра. Выполнение tmux означает, что открытые файлы ожидают меня после того, как я перезагружаю, и я могу продолжить от того, где я кончил. У меня были проблемы с энергией, работающей на tmux сессии, когда я соединяюсь как так:

ssh example.com -t 'tmux attach'

Проблемы UTF-8 неожиданно возникают, которые не неожиданно возникают при окружении в обычно и просто присоединении к tmux сессии вручную.

</ предыстория>

Таким образом, я хочу допускающий повторное использование метод запуска чего-то на входе в систему ssh, который не влияет ни на одну из других вещей, я настроил в моем .zshrc (или Ваш .bashrc если Вы все еще используете удар), который может требоваться для моей среды разработки, которая не появляется, когда я иногда работаю локально над очень упомянутой машиной.

24
22.03.2011, 23:36
6 ответов

Когда Вы работаете 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.

13
27.01.2020, 19:41
  • 1
    Причина я не использую ssh example.com -t 'tmux attach' не то, потому что это имеет проблемы при загрузке моей среды, а потому что у меня были проблемы с символьным дисплеем UTF-8; эта проблема не существует при соединении стандартным способом. Поэтому этот вопрос о запущении скриптов сразу после соединения по SSH. –  connrs 23.03.2011, 11:17
  • 2
    я люблю Ваше решение все же. Изящный –  connrs 23.03.2011, 11:49
  • 3
    @connrs: у Вас есть проблемы с UTF-8, даже когда Вы выполняете Ваш .profile? Я предположил, что проблема была должна неправильно установить локали на целевой машине, который Ваш /etc/profile или .profile фиксированный. Проблема локали является, вероятно, закрепляемой с большей информацией. –  Gilles 'SO- stop being evil' 23.03.2011, 21:33
  • 4
    я хотел возвратиться в офис для тестирования этого. Вы полностью корректны, получение/etc/profile действительно инициировало надлежащее поведение. Вы теперь на самом деле решили проблему, которая заставила меня спрашивать это больше универсального вопроса –  connrs 25.03.2011, 11:13

Я ранее советовал устанавливать 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 как, он также будет открывать оболочку, которая получит доступ к тому же самому сценарию выше и предотвратит любую рекурсию.

6
27.01.2020, 19:41
  • 1
    Применение PermitUserEnvironment не будет возможно в некоторых средах из-за потенциальных последствий безопасности. SSH устанавливает переменную $SSH_CONNECTION, которая может использоваться вместо Вашего $SSH_LOGIN в Вашем .zlogin, устраняя потребность использовать ~/.ssh/environment. Что-то как 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). Функция оболочки настраивается, чтобы повторно прикрепить, если я прерываюсь.

3
27.01.2020, 19:41

Вы могли бы рассмотреть выполнение

ssh remotehost -t screen -DR

и выполненный Ваш терминальный сеанс там. Можно затем отсоединиться (^A^D) и повторно прикрепите позже (от другого клиента также). Это заставит проблему с неинтерактивной инициализацией уйти, поскольку экран сохраняет полные сессии интерактивного терминала (дополнительно оболочки входа в систему также, man screen(1) или ^A?)

0
27.01.2020, 19:41
  • 1
    Как упомянуто в моем вопросе, я использую tmux, а не экран GNU для управления моими сессиями. И при загрузке -t 'tmux attach' У меня есть проблемы с энергией, которые обычно не присутствуют. Поэтому реальный вопрос о запущении скриптов на подключении ssh, а не экране/управлении сеансами. Извинения за то, что не были более ясными в моем вопросе –  connrs 23.03.2011, 11:44
  • 2
    Очень жаль, Вы упомянули tmux, но это ничего не значило для меня. Спасибо за упоминание нового инструмента, хотя! –  sehe 23.03.2011, 11:49

Говорить с проблемами UTF-8 а именно, если Вы добавляете

SendEnv LANG

И $LANG установлен на что-то как en_US.UTF-8 на местном конце и Вашем sshd на удаленном конце разрешает SendEnv директива (с AcceptEnv в sshd_config), tmux на другом конце должен соблюдать его. У меня была эта проблема некоторое время, и было трудно диагностировать.

0
27.01.2020, 19:41

Если Вы хотите, чтобы это работало каждый раз, когда Вы соединяетесь, Вы могли бы просто добавить tmux attach к нижней части Вашего ~/.profile на удаленной машине.

0
27.01.2020, 19:41

Теги

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