Есть ли способ заставить SSH использовать определенную оболочку на удаленном конце, независимо от того, какая оболочка пользователя по умолчанию?
Я пробовал решения, похожие на:
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
но, к сожалению, оболочка по умолчанию на удаленном конце отвечает за синтаксический анализ части «сложной многострочной команды», и мне трудно ее избежать, чтобы работать как для пользователей оболочки Bash, так и для C.
ssh
bash
shell
command-line-interface
plinehan
источник
источник
Ответы:
Я не верю, что это возможно, по крайней мере, с системами на основе openssh. Если у вас есть такая возможность, лучшим решением может быть создание файла сценария оболочки, а затем выполнение его с помощью опубликованного вами метода. Преимущество было бы в том, чтобы минимизировать количество необходимых экранирований, но оставило бы файл, который пришлось бы удалить (возможно, в качестве последнего шага сценария).
источник
Используйте наследственность:
источник
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. Таким образом, вместо одного шага у вас есть два шага: шаг 1, скопируйте ваш скрипт в файл, шаг 2,cat
в который скриптssh
.Используйте основанные на ключах логины, а не пароли. Затем вы можете добавить (список) «принудительных команд (ы)» к вашему общедоступному ключу ssh (в поле «опции» в случае SSH1), который установлен на сервере (в файле ~ / .ssh / authorized_keys для SSH1 , ~ / .ssh2 / авторизация для SSH2).
Сделайте принудительную команду, чтобы ваша желаемая оболочка называлась ...
Больше: Вы можете связать не более одной принудительной команды с данной клавишей. Если вам требуется несколько принудительных команд для разных целей, вам нужно настроить разные клавиши. (Конечно, вы можете поместить несколько вещей в один скрипт, который вы вызываете с помощью принудительной команды. Но имейте в виду, что принудительные команды всегда запускаются для данной учетной записи / ключа, если пользователь входит в систему, независимо от того, запросил ли он что-то другое для запуска. Если вы все еще хотите выполнить оригинальную команду, о которой вы просили, посмотрите, как использовать
$SSH_ORIGINAL_COMMAND
переменную ...)Читайте о "принудительных командах" через Google .
источник
/etc/sshrc
.Вы можете использовать
-t
опцию принудительного выделения псевдотерминала для программы, которую вы хотите запустить, как если бы вы выполняли стандартную оболочку. Затем передайте оболочку, которую вы хотите, в качестве простого старого аргумента.С помощью этой техники вы можете не только использовать любую установленную оболочку, но также вы можете открывать vim и другие программы, для которых требуется TTY, из одной команды. Что здорово, если вы пишете сценарий оболочки, который регистрирует вас где-то и открывает файл на vim, или htop, или что-то в этом роде.
Не уверен, является ли это оболочкой входа в систему, но есть варианты, чтобы bash действовал как оболочка входа в систему, так что ваша оболочка тоже может иметь это.
источник
Удивительно, но я вижу разные результаты со следующим:
бежать в тире:
против Баш:
Показ полностью цитируемой команды работает, как и ожидалось.
источник
sh -c "$*"
. Итак, вы бежитеsh -c "/bin/bash -c echo <(cat)"
; самаecho
команда является единственным передаваемым аргументом-c
, и<(cat)
вообще является отдельным аргументом.Некоторое время назад я столкнулся с подобной ситуацией, когда мне нужно было использовать ksh-сопроцесс для sqlplus, и у меня был только ssh, через который должны выполняться чтение и запись.
Один из способов сделать это - передать всю зависимую команду в одну строку (use;) в / usr / bin / ksh на удаленной машине. например:
источник