Чи можу я виконати деякі команди при запуску сеансу ssh перед тим, як перейти до інтерактивного режиму?


13

Під час запуску сеансу ssh командою ssh у мене, здається, є два варіанти - інтерактивна сесія за замовчуванням із стандартною програмою env і починається з домашнього каталогу - або виконувати довільну команду, але неінтерактивно (навіть такі трюки, як ssh "command; command; bash -i -l"здається, не приносять користі). Досить часто я хочу інтерактивний сеанс, але з тим, що відбувається до цього - як правило, зміна каталогу або іноді коригування системного середовища. Ці речі відрізнятимуться від сеансу до сеансу, тому я не можу просто дотримуватися їх .bashrc.

Чи є спосіб зробити це?

Відповіді:


13

Я відповідаю собі, як нарешті відкрив секрет. Ні -tваріант ssh, ні -lваріант для bashне призведуть до самостійної реєстрації оболонки - але в поєднанні вони працюють.

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'Змінює каталог, встановлює змінні середовища, а потім запускає належну оболонку входу (єдина відмінність, яку я знайшов поки що /etc/motd, не відображається таким чином - це звичайно sshвідповідальність або loginвідповідальність, а не bash- крім того, що все здається працювати ідеально, і всі змінні середовища однакові).

Ці зміни в середовищі / каталозі відбуваються після ssh, тому вони не обмежуються PermitUserEnvironmentналаштуваннями та пов'язаними з ними (точно так, як планувалося), а перед .bashrc/ .profileвиконувати. Це має переваги і недоліки - важче просто переосмислити щось, що встановлюється з скриптів bash init, як PS1, але простіше упакувати точно потрібні значення в sshкомандні рядки і .profileзробити все важким підйомом.

І якщо це дійсно необхідно, насправді досить просто змусити bash виконувати щось після за .profileдопомогою командного рядка на кшталт ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- дуже некрасиво, коли ставиться таким чином, але ці альтернативні .profileфайли можна підготувати раніше. (наскільки я можу сказати bash, є кілька кандидатських місць для .profileсценарію, і він виконає перше знайдене - . fileне має таких автоматичних резервних копій, тому вам потрібно буде перевірити, де нормально, profileякщо ви хочете це зробити)


Дивовижне, дякую за це! Я хотів знайти спосіб внести внесок до акаунта користувача відразу після ssh'ing, і параметр "-t" змусив його працювати. Без цього параметра ваша оболонка не має підказки, не має історії команд, гине від SIGINT тощо.
Ashoat

Ця відповідь дуже корисна, але вам не вистачає декількох ;с у першій рядку входу в ssh. Це не дозволить мені редагувати вашу відповідь, тому що я недостатньо змінююсь. У мене це на роботі ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Я думаю, це те, що ти задумав.
Роб Квасовський

2

Редагуйте .bashrc та додайте свої специфічні для SSH налаштування середовища у:

if [ $SSH_TTY ]; then
    ...
fi

Це дозволить вам додати налаштування спеціально для сеансів SSH. "Звичайно, якщо все, що ви хочете, - це встановити довільні змінні середовища прямо в самому початку, які змінюються залежно від сеансу, я не знаю, як ви можете змусити машину відгадати їх для вас, крім того, щоб набрати їх ... незважаючи ні на що, ви" Мені знадобиться деяка перевірена умова, щоб ґрунтуватись на виборі параметрів.


2

На sshчоловіковій сторінці:

Крім того, ssh читає ~ / .ssh / середовище і додає в середовище рядки формату "VARNAME = значення", якщо файл існує, і користувачі можуть змінювати своє середовище. Для отримання додаткової інформації див параметр PermitUserEnvironment в sshd_config (5).

що говорить:

PermitUserEnvironment
Вказує, чи ~ / .ssh / середовище та оточення = параметри в ~ / .ssh / pooblaščeних ключів обробляються sshd (8). За замовчуванням - "ні". Увімкнення обробки середовища може дозволяти користувачам обходити обмеження доступу в деяких конфігураціях за допомогою механізмів, таких як LD_PRELOAD.

Цей засіб можна використовувати для умовного виконання операторів у вашому віддаленому пристрої, ~/.bashrcвикористовуючи ifструктуру, яку запропонував Міккі .


1

Просто запустіть таким чином: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : щоб ця підказка з'явилася
  • ; bash: щоб повернути керування назад, незважаючи на виконання команди (тут cd) та вихід із ssh-сеансу

Ласкаво просимо до ServerFault! Будь ласка, надайте та поясніть та / або документацію для команд чи сценаріїв, щоб пояснити, для чого вони призначені.
Cory Knutson

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