Примушуйте SSH використовувати певну оболонку


29

Чи можна змусити SSH використовувати певну оболонку на віддаленому кінці, незалежно від того, яка оболонка користувача за замовчуванням?

Я спробував рішення, схожі на:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

але, на жаль, оболонка за замовчуванням на віддаленому кінці відповідає за аналіз частини "складної, багаторядкової команди", і мені важко уникнути її достатньо, щоб працювати як для користувачів Bash, так і для C оболонки.


Відповіді:


8

Я не вірю, що це можливо, принаймні, із відкритими системами. Якщо у вас є можливість, кращим рішенням може стати перетягнути файл оболонки-скрипта, а потім виконати його за допомогою опублікованого вами методу. Перевагою було б мінімізувати необхідну кількість евакуації, але залишити файл позаду, який доведеться видалити (можливо, як останній крок сценарію).


1
Це я зрештою зробив, але використовуючи scp. Чудова ідея.
plinehan

16

Використовуйте гередок:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

ви не повинні використовувати "-s" для bash для читання команд з stdin?
Weboide

Це не завжди потрібно.
Ігнасіо Васкес-Абрамс

Я би проголосував за це, якщо міг би, оскільки це заважає командам отримати доступ до stdin, а питання стосувалося виклику певної оболонки.
Ерік Вудруф

3
@EricWoodruff, ... виклик певної оболонки (у цьому випадку bash) - саме те , що показує, як робити.
Чарльз Даффі

1
FYI ви також можете зробити cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash. Отже, замість одного кроку у вас є два кроки: крок 1 скопіюйте свій скрипт у файл, крок 2 cat- сценарій ssh.
Тревор Бойд Сміт

10

Використовуйте вхід на основі ключів, а не на основі пароля. Тоді ви можете додати (список) "примусових команд (и)" до свого відкритого ключа ssh (у полі "параметри" у випадку SSH1), який встановлений на сервері (у файлі ~ / .ssh / autori_keys для SSH1 , ~ / .ssh2 / авторизація для SSH2).

Зробіть свою примусову команду так, щоб потрібна оболонка називалася ...

Більше: Ви можете пов’язати щонайменше одну примусову команду із заданою клавішею. Якщо вам потрібні кілька примусових команд для різних цілей, вам доведеться встановити різні клавіші. (Звичайно, ви можете помістити кілька речей в один сценарій, який ви викликаєте за допомогою примусової команди. Але майте на увазі, що примусові команди завжди виконуються для певного облікового запису / ключа, якщо користувач входить у систему, незалежно від того, чи вимагав він запустити щось інше. Якщо ви все ще хочете вшанувати початкову команду, яку ви просили, перегляньте, як використовувати $SSH_ORIGINAL_COMMANDзмінну ...)

Прочитайте про "примусові команди" через Google .


Хороший матеріал. Ця графіка на сторінці O'Reilly дуже приємна. У моєму конкретному випадку я хочу, щоб я мав змогу застосувати це до будь-яких користувачів, а не лише до користувачів, які правильно налаштували свої ключі. У мене також немає кореня на серверних машинах, тому я не можу редагувати такі файли, як /etc/sshrc.
plinehan

Ну, це завжди той сервер (або краще: той, хто здійснює контроль над сервером) той, хто викликає знімки, коли ви підключаєтесь до його служби .... "Власник" сервера вирішує, що з ним можна зробити. - Ви не можете нічого змусити "для будь-яких користувачів", якщо у вас немає вищих привілеїв, ніж вони.
Курт Пфайфл

Якщо клієнт може виконувати довільні команди, то він також може виконувати довільну оболонку як команду.
Ерік Вудруф

@KurtPfeifle, яке посилається на O'Reilly, порушено
Брайан Ванденберг

@BrianVandenberg: Thx для підказки. Зараз я видалив це посилання.
Курт Пфайфл

2

Ви можете використовувати цю -tопцію, щоб примусити розподілити псевдо-tty для програми, яку ви хочете запустити, як якщо б ви виконували стандартну оболонку. Потім передайте потрібну оболонку як звичайний старий аргумент.

За допомогою цієї методики ви можете не тільки використовувати будь-яку встановлену оболонку, але ви також можете відкрити vim та інші програми, для яких потрібна TTY, з однієї команди. Що здорово, якщо ви пишете скрипт оболонки, який десь заносить вас і відкриває файл на vim, або htop чи щось подібне.

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# exit
Connection to myhost closed.
me@my-machine $ ssh root@myhost -t sh
# exit
Connection to myhost closed.
me@my-machine $ 

Не впевнений, що це оболонка для входу, але є варіанти зробити так, щоб bash діяв як оболонка для входу, тому ваша оболонка може мати і це.


1

Дивно, але я бачу різні результати з наступного:

запустити тире:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Показ повністю цитованої команди працює як і очікувалося.


1
Не дивно. Віддалений демон SSH ефективно працює sh -c "$*". Таким чином, ти біжиш sh -c "/bin/bash -c echo <(cat)"; сама echoкоманда є єдиним аргументом, переданим до цього -c, а the <(cat)- цілком окремим аргументом.
Чарльз Даффі

0

Нещодавно я стикався з подібною ситуацією, коли мені потрібно було використовувати ksh coprocess для sqlplus, і у мене був лише ssh, через який повинні відбуватися читання та запис.

Спосіб зробити це - передати всю залежну команду в один рядок (use;) в / usr / bin / ksh на віддаленій машині. наприклад:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.