У меня уже настроен агент ssh, и я могу запускать команды на внешнем сервере в скрипте Bash, выполняя такие вещи, как:
ssh blah_server "ls; pwd;"
Теперь, что я действительно хотел бы сделать, это запустить много длинных команд на внешнем сервере. Заключать все это в кавычки было бы довольно уродливо, и я бы действительно предпочел избегать ssh'ing несколько раз, чтобы избежать этого.
Итак, есть ли способ, которым я могу сделать это за один раз, заключенный в скобки или что-то? Я ищу что-то вроде:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
В принципе, я буду рад любому решению, если оно чистое.
редактировать
Чтобы прояснить, я говорю об этом как о части большего сценария bash. Другим людям может понадобиться разобраться со сценарием, поэтому я бы хотел сохранить его в чистоте. Я не хочу иметь bash-скрипт с одной строкой, которая выглядит следующим образом:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
потому что это очень некрасиво и трудно читать.
ssh
вызовом?scp
,ssh
и выполнение. Это будет самый чистый путь, я думаю.Ответы:
Как насчет Bash Here Document :
Чтобы избежать проблем, упомянутых @Globalz в комментариях, возможно, вам удастся (в зависимости от того, что вы делаете на удаленном сайте) заменить первую строку на
Обратите внимание, что вы можете выполнить подстановку переменных в документе Here, но вам, возможно, придется столкнуться с проблемами цитирования. Например, если вы заключите в кавычки «предельную строку» (то есть
EOF
в приведенном выше), то вы не сможете выполнять подстановки переменных. Но без цитирования предельной строки переменные подставляются. Например, если вы определили$NAME
выше в своем сценарии оболочки, вы можете сделатьи это создаст файл в месте назначения
otherhost
с именем того, что вы назначили$NAME
. Другие правила, касающиеся цитирования сценариев оболочки, также применимы, но они слишком сложны, чтобы их здесь приводить.источник
Отредактируйте ваш скрипт локально, затем передайте его в ssh, например
где
commands-to-execute-remotely.sh
выглядит ваш список выше:источник
( echo $mycmd $myvar ; ...) | ssh myhost
- как и в случае использования cat, вы точно знаете, что происходит в потоке команд ssh. И, конечно , подоболочка в сценарии может быть несколько строк для удобства чтения - см linuxjournal.com/content/bash-sub-shellscommands-to-execute-remotely.sh
?$localvar
для интерпретации локальной переменной,\$remotevar
для удаленной интерпретации дистанционно определенной переменной,\$(something with optionnal args)
чтобы получить результат выполнения чего-либо на удаленном сервере. Пример того, что вы можете использовать ssh через 1 (или, как показано здесь, несколько команд ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Чтобы соответствовать вашему примеру кода, вы можете заключить команды в одинарные или двойные кавычки. Например
источник
Я вижу два пути:
Сначала вы создаете управляющий сокет следующим образом:
и запускай свои команды
Таким образом, вы можете написать команду ssh без фактического повторного подключения к серверу.
Вторым было бы динамически сгенерировать скрипт,
scp
запустить его и запустить.источник
Это также можно сделать следующим образом. Поместите ваши команды в скрипт, назовем его command-inc.sh
Сохранить файл
Теперь запустите его на удаленном сервере.
Никогда не подводил для меня.
источник
bash -s
нужно?#!/bin/bash
действительно используется?ssh user@remote < /path/to/commands-inc.sh
(кажется, работает для меня). Ну, я полагаю, ваша версия гарантирует, что мы используемbash
оболочку, а не какую-то другую оболочку - вот в чем цель, не так ли?Поместите все команды в сценарий, и он может быть запущен как
источник
bash -s
?man
страницIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
командой в целом, то естьssh remote-user@remote-host <./remote-commands.sh
. Я попробовал свой путь, и это, казалось, сработало, хотя я не уверен, что это каким-то образом недостаточно.SSH и запуск нескольких команд в Bash.
Отдельные команды с точкой с запятой в строке, передаваемые в echo, передаются в команду ssh. Например:
источник
Для любого, кто споткнулся здесь, как я - мне удалось избежать точки с запятой и новой строки:
Первый шаг: точка с запятой. Таким образом, мы не нарушаем команду ssh:
Перечислен удаленный каталог hosts / home (вошел как root), тогда как
перечислил текущий рабочий каталог.
Следующий шаг: разрыв строки:
Это снова перечислило удаленный рабочий каталог - улучшено форматирование:
Если на самом деле лучше, чем здесь документ или цитаты из пунктирных линий - ну, не мне решать ...
(Используя bash, Ubuntu 14.04 LTS.)
источник
ssh host "echo test && ls"
Отправленные ответы с использованием многострочных строк и нескольких сценариев bash не работали для меня.
Вот функциональный способ ssh и запуска нескольких команд, сохраняя локальный контекст.
источник
Не уверен, что самый чистый для длинных команд, но, конечно, самый простой:
источник
Это хорошо работает для создания сценариев, так как вам не нужно включать другие файлы:
источник
-s
флаг, я процитирую его, вы можете избежать замены первой строки на ... , и я не смог уйти, просто вызвав bash, смутно помню.Самый простой способ настроить систему на использование одиночных сессий ssh по умолчанию с мультиплексированием.
Это можно сделать, создав папку для сокетов:
А затем добавьте следующее в вашу конфигурацию .ssh:
Теперь вам не нужно изменять какой-либо ваш код. Это позволяет выполнять несколько вызовов ssh и scp без создания нескольких сессий, что полезно, когда требуется больше взаимодействия между локальными и удаленными компьютерами.
Благодаря ответу @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ и https://en.wikibooks.org / wiki / OpenSSH / Кулинарная книга / Мультиплексирование .
источник