Есть ли способ заставить 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")