Як я можу запустити сценарій відразу після підключення через SSH?


24

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

<попередня історія>

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

ssh example.com -t 'tmux attach'

UTF-8 видає обрізання, яке не обрізається при звичайному обстрілі і просто приєднується до сеансу tmux вручну.

</ посібник>

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

Відповіді:


13

Коли ви запускаєте 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.


Причина, яку я не використовую, ssh example.com -t 'tmux attach'полягає не в тому, що у мене проблеми з завантаженням мого оточення, а через те, що у мене виникли проблеми з відображенням символів UTF-8; ця проблема не існує при підключенні звичайним способом. Ось чому це питання стосується запуску скриптів відразу після підключення через SSH.
connrs

Я люблю ваше рішення. Елегантний
connrs

@connrs: У вас є проблеми з UTF-8 навіть під час запуску .profile? Я припускав, що проблема пов’язана з неправильно встановленими локалями на цільовій машині, які ви вирішили /etc/profileабо .profileвиправили. Проблема з локальною локалізацією, ймовірно, може бути вирішена за допомогою додаткової інформації.
Жил "ТАК - перестань бути злим"

Я хотів повернутися в офіс, щоб перевірити це. Ви абсолютно правильні, пошук / etc / profile викликає правильну поведінку. Ви фактично вирішили проблему, яка мотивувала мене задати це більш загальне запитання
конгрес

6

Раніше я радив налаштувати PermitUserEnvironment yesта додати змінну середовища у вашій програмі, ~/.ssh/environmentпоки Елі Хеді не врізався з кращою пропозицією в коментарях нижче.

Відкрийте свій .zlogin(bash: .bash_profileetc.) і поставте наступне:

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, оскільки він також відкриє оболонку, яка матиме доступ до самого того самого сценарію, що вище, і запобігає будь-якій рекурсії.


2
Використання PermitUserEn Environment не буде можливим у деяких середовищах через потенційні наслідки для безпеки. SSH встановлює змінну $ SSH_CONNECTION, яку можна використовувати замість вашого $ SSH_LOGIN у вашому .zlogin, усуваючи необхідність використання ~ / .ssh / середовища. Щось подібне if [[ "$SSH_CONNECTION" != "" ]]повинно це робити.
Елі Хеді

3

Я сам додаю це до своїх файлів .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 system command' (який не викликає профіль ~ /.*). Функція оболонки встановлюється для повторного приєднання, якщо я перервав.


Чудово! Мені вдалося виправити це, встановивши bashrc, а потім у кожному новому вікні екрана - при зміні на .profile він працював чудово.
Гюго

0

Ви можете розглянути можливість запуску

ssh remotehost -t screen -DR

і запустіть свій термінальний сеанс там. Потім ви можете від'єднати ( ^A^D) і повторно приєднати пізніше (також від іншого клієнта). Це призведе до усунення проблеми з неінтерактивною ініціалізацією, оскільки екран зберігає повноцінні сеанси інтерактивних терміналів (необов'язково також оболонки для входу, man screen(1) або ^A?)


Як було сказано в моєму запитанні, я використовую tmux, а не екран GNU для управління сеансами. І при завантаженні у -t 'tmux attach'мене є проблеми з vim, які нормально відсутні. Ось чому справжнє питання стосується запуску скриптів на ssh connect, а не управління екраном / сеансом. Вибачте за те, що в моєму питанні ясніше не було ясніше
підписання

Так вибачте, ви згадали про tmux, але це нічого не означало для мене. Дякуємо, що згадали про новий інструмент!
вересень

0

Якщо ви додасте, поговоріть конкретно з питаннями UTF-8

SendEnv LANG

І $LANGвстановлено щось на кшталт en_US.UTF-8локального кінця, і ваш sshd на віддаленому кінці дозволяє SendEnvдирективу (з AcceptEnvin sshd_config), tmux на іншому кінці має її шанувати. У мене ця проблема була деякий час, і її було важко усунути.


0

Якщо ви хочете, щоб вона працювала щоразу, коли ви підключаєтесь, ви можете просто додати tmux attachїї до нижньої частини ~/.profileна віддаленій машині.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.