Назад | Перейти на главную страницу

Заставить SSH использовать определенную оболочку

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

Я пробовал решения, похожие на:

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

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

Используйте heredoc:

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

Используйте логины на основе ключей, а не на основе пароля. Затем вы можете добавить (список) "принудительная команда (и)" к вашему публичному ключу ssh (в "параметры" поле в случае SSH1), установленного на сервере (в ~ / .ssh / authorized_keys файл для SSH1, ~ / .ssh2 / авторизация для SSH2).

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

Больше: Вы можете связать не более одной принудительной команды с данным ключом. Если вам требуется несколько принудительных команд для разных целей, вам нужно настроить разные ключи. (Конечно, вы можете поместить несколько вещей в один скрипт, который вы вызываете с помощью принудительной команды. Но имейте в виду, что принудительные команды всегда запускать для данной учетной записи / ключа, если пользователь входит в систему, независимо от того, запрашивал ли он что-то другое для запуска. Если вы хотите по-прежнему соблюдать исходную запрошенную команду, узнайте, как использовать $SSH_ORIGINAL_COMMAND переменная ...)

Прочтите о «принудительных командах» через Google.

Я не верю, что это возможно, по крайней мере, с системами на основе openssh. Если у вас есть такая возможность, лучшим решением может быть создание файла сценария оболочки, а затем его выполнение с помощью метода, который вы опубликовали. Это будет иметь то преимущество, что сведет к минимуму необходимое экранирование, но оставит файл, который нужно будет удалить (возможно, на последнем этапе сценария).

Вы можете использовать -t возможность принудительного выделения псевдотерминала для программы, которую вы хотите запустить, как если бы вы выполняли стандартную оболочку. Затем передайте оболочку, которую вы хотите, как простой старый аргумент.

С помощью этого метода вы можете не только использовать любую установленную оболочку, но и открывать vim и другие программы, требующие TTY, с помощью одной команды. Это здорово, если вы пишете сценарий оболочки, который регистрирует вас где-то и открывает файл на vim, htop или еще чем-то.

Вот bash

me@my-machine $ ssh root@myhost -t bash
root@myhost:~# 

sh тоже работает. Как и все остальное.

me@my-machine $ ssh root@myhost -t sh
# 

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

Удивительно, но я вижу разные результаты со следующим:

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

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

против bash:

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

Показанная полностью цитируемая команда работает должным образом.

Некоторое время назад я столкнулся с подобной ситуацией, когда мне нужно было использовать сопроцесс ksh для sqlplus, и у меня был только ssh, через который должны происходить чтение и запись.

Способ сделать это - передать всю вашу зависимую команду в одну строку (используйте;) в / 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")