Как запустить сценарий оболочки на удаленном компьютере?Как использовать SSH для запуска сценария оболочки на удаленной машине?
Я SSH настроен как на машине A и B. Мой сценарий на компьютере А, который будет выполнять задачу на машине В.
Как запустить сценарий оболочки на удаленном компьютере?Как использовать SSH для запуска сценария оболочки на удаленной машине?
Я SSH настроен как на машине A и B. Мой сценарий на компьютере А, который будет выполнять задачу на машине В.
<hostA_shell_prompt>$ ssh [email protected] "ls -la"
Это предложит вам пароль, если вы не скопировали свой Хоста открытый ключ пользователя в файле authorized_keys в домашней директории пользователя .ssh. Это позволит беспарольного аутентификации (если они будут приняты в качестве метода аутентификации по конфигурации SSH сервера)
Во-первых, скопировать сценарий к Machine B с помощью Scp
[пользователь @ machineâ] $ УПП/путь/к/скрипт пользователя @ MachineB:/Главная/пользователь/путь
Затем просто запустите скрипт
[пользователь @ machineâ] $ SSH пользователь @ MachineB «/ Главная/пользователь/путь/скрипт "
Это будет работать, если вы предоставили исполняемый файл сценарию.
привет Я применил рекомендуемое предложение, но он дал мне следующую ошибку: [oracle @ node1 ~] $ ssh oracle @ node2: ./ home/oracle/au/fs /conn.sh ssh: node2: ./ home/oracle/au/fs/conn.sh: имя или услуга неизвестны [oracle @ node1 ~] $ – 2008-11-20 12:47:50
'ssh oracle @ node2: ./ home/oracle/au /fs/conn.sh? В неправильной командной строке имя команды должно быть отделено от части user @ host пробелом, а не двоеточием. – bortzmeyer 2008-12-15 13:37:37
Я ниспровергаю это, потому что это первичное утверждение о том, что он не может быть запущен без копирования, неверен. – 2010-04-28 21:02:40
Предполагая, что вы хотите сделать это автоматически с «локальной» машины, без ручного входа в «удаленную» машину, вы должны изучить расширение TCL, известное как «Ожидание», оно предназначено именно для такого рода ситуаций , Это домашняя страница ниже выглядит немного дерьмовой, но не позволяйте этому отговаривать вас; Я также предоставил ссылку на скрипт для входа в систему/взаимодействия через SSH.
Кроме того, не забудьте, чтобы избежать переменных, если вы хотите, чтобы забрать их с хоста назначения.
Это уловило меня в прошлом.
Например:
[email protected]> ssh [email protected] "echo \$HOME"
распечатывает/дома/user2
в то время как
[email protected]> ssh [email protected] "echo $HOME"
распечатывает/Главная/пользователь
Другой пример:
[email protected]> ssh [email protected] "echo hello world | awk '{print \$1}'"
правильно распечатывает «привет».
Попробуйте запустить ssh [email protected] sh ./script.unx
.
Это работает только в том случае, если скрипт находится в каталоге по умолчанию (home) на пульте дистанционного управления. Я думаю, что вопрос заключается в том, как запустить скрипт, хранящийся локально на пульте дистанционного управления. – metasim 2010-07-20 12:35:33
Если машина A - это окно Windows, вы можете использовать Plink (часть PuTTY) с параметром -m, и он выполнит локальный скрипт на удаленном сервере.
plink [email protected] -m local_script.sh
Если машина А система Unix на основе, вы можете использовать:
ssh [email protected] 'bash -s' < local_script.sh
Вы не должны скопировать скрипт на удаленном сервере, чтобы запустить его.
Это старый вопрос, и ответ на Джейсоне работает отлично, но я хотел бы добавить следующее:
ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ENDSSH
Это также может быть использован с су и командами, которые требуют ввода данных пользователя. (Обратите внимание на '
сбежавшего Heredoc)
Edit: Так как этот ответ продолжает получать биты трафика, я хотел бы добавить еще больше информации в этом прекрасном использовании Heredoc:
Вы можете командует гнездо с этим синтаксисом, и то будет единственный способ гнездования, кажется, работает (в здравом образом)
ssh [email protected] <<'ENDSSH'
#commands to run on remote host
ssh [email protected] <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
Вы действительно можете иметь разговор с некоторыми услугами, как Telnet, FTP и т.д. Но помните, что Heredoc просто посылает как стандартный ввод текста, он не ожидание ответа между линиями
Редактирование: я только что узнал, что вы можете отступать от внутренних, если используете <<-END
!
ssh [email protected] <<-'ENDSSH'
#commands to run on remote host
ssh [email protected] <<-'END2'
# Another bunch of commands on another host
wall <<-'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.secureftp-test.com <<-'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH
(я думаю, что это должно работать)
Я начал использовать Fabric для более сложных операций. Для Fabric требуется Python и несколько других зависимостей, но только на клиентской машине. Серверу нужен только сервер ssh. Я считаю, что этот инструмент намного мощнее, чем сценарии оболочки, переданные в SSH, и стоит того, чтобы его настроить (особенно, если вам нравится программирование на Python). Ткань обрабатывает сценарии на нескольких хостах (или узлах определенных ролей), помогает упростить операции идемпотент (например, добавление строки в скрипт конфигурации, но не если она уже существует) и позволяет создавать более сложную логику (например, Python язык может обеспечить).
Это расширение для ответа YarekT, чтобы объединить рядный удаленные команды с переходом ENV переменных с локальной машины на удаленный хост, так что вы можете параметризовать свои скрипты на удаленной стороне:
ssh [email protected] ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
я нашел это исключительно полезно, сохраняя все это в одном скрипте, чтобы он был очень читабельным и поддерживаемым.
Почему это работает.SSH поддерживает следующий синтаксис:
SSH пользователь @ хост remote_command
В Баш можно задать переменные среды для определения до выполнения команды на одной строке, например так:
ENV_VAR_1 = 'значение1' ENV_VAR_2 = 'значение2' Баш -c 'эхо $ ENV_VAR_1 $ ENV_VAR_2'
это позволяет легко определить ва до запуска команды. В этом случае echo - наша команда, в которой мы работаем. Все перед echo определяет переменные среды.
Так мы соединим эти две функции и ответ YarekT, чтобы получить:
SSH пользователь @ хост ARG1 = $ ARG1 ARG2 = $ ARG2 'Баш -ную < < 'ENDSSH' ...
В этом случае мы устанавливаем ARG1 и ARG2 в локальные значения. Отправка всего после user @ host как remote_command. Когда удаленный компьютер выполняет команду ARG1 и ARG2, устанавливаются локальные значения, благодаря локальной оценке командной строки, которая определяет переменные среды на удаленном сервере, а затем выполняет команду bash -s с использованием этих переменных. Вуаля.
Проголосовали за вас. Это допустимое решение. Очевидно, что ключи должны быть защищены, но они также могут быть недействительными точно так же, как пароль через сервер. – willasaywhat 2008-11-21 17:44:47
Я не думаю, что это отвечает на вопрос. В этом примере показано, как запустить удаленную команду, но не как выполнить локальный скрипт на удаленной машине. – 2010-04-28 21:03:36
Не уверен, но не можете ли вы подключить свой скрипт к hostA для запуска на hostB с помощью этого метода? – nevets1219 2010-04-28 21:13:12