Мне нужно запустить сценарий оболочки (windows/Linux) на удаленной машине.
У меня настроен SSH на машинах A и B. Мой скрипт находится на машине A, которая будет выполнять часть моего кода на удаленной машине, машине B.
Локальный и удаленный компьютеры могут быть как на базе Windows, так и на базе Unix.
Есть ли способ выполнить это с помощью plink/ssh?
Если машина в это окно, вы можете использовать Плинк (часть шпатлевки) с -м параметре, и он будет выполнять локальный скрипт на удаленном сервере.
plink root@MachineB -m local_script.sh
Если машина является Unix-системой, вы можете использовать:
ssh root@MachineB 'bash -s' < local_script.sh
Вы должны'т иметь, чтобы скопировать скрипт на удаленный сервер, чтобы запустить его.
Это старый вопрос, и Джейсон'ы ответ работает, но я хотел бы добавить это:
ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH
Это также может быть использован с SU и команды, которые требуют ввод данных пользователем. (Примечание '
сбежал помощи heredoc)
Редактировать: поскольку этот ответ становится все биты трафика, я бы добавил еще больше информации на эту замечательную использование помощи heredoc:
Вы можете гнездиться команды с таким синтаксисом, и это единственный способ раскроя, кажется, работает (в разумном смысле)
ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'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 просто отправляет стандартного ввода как текста, это не'т ждать ответ Между строк
Редактировать: я только что узнал, что вы можете сделать отступ внутренности с закладки если вы используете << конец
!
ssh user@host <<-'ENDSSH'
#commands to run on remote host
ssh user@host2 <<-'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
(Я думаю, что это должно работать)
Смотрите также http://tldp.org/LDP/abs/html/here-docs.html
Кроме того, Дон'т забывайте, чтобы избежать переменных, если вы хотите, чтобы забрать их от узла назначения.
Это поймали меня в прошлом.
Например:
user@host> ssh user2@host2 "echo \$HOME"
распечатывает /дома/пользователь2
а
user@host> ssh user2@host2 "echo $HOME"
распечатывает /главная/пользователя
Другой пример:
user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"
распечатывает "Привет" правильно.
Это расширение YarekT'ы ответ для объединения удаленных команд в соответствии с передача переменных ОКР с локальной машины на удаленный хост, так что вы можете параметризовать скриптов на удаленной стороне:
ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
# commands to run on remote host
echo $ARG1 $ARG2
ENDSSH
Я нашел это очень полезным, сохраняя все это в одном скрипте, так что's очень четкий и ремонтопригодны.
Почему это работает. СШ поддерживает следующий синтаксис:
SSH пользователь@хост remote_command
В bash можно использовать переменные среды, чтобы определить до запуска команды в одну строку вот так:
ENV_VAR_1='значение1' ENV_VAR_2='значение2' Баш-с 'Эхо $ENV_VAR_1 $ENV_VAR_2'
Это упрощает определение переменных до выполнения команды. В этом случае эхо-это наша команда мы'вновь работает. Все, прежде чем Эхо определяет переменные среды.
Поэтому мы объединяем эти две особенности и YarekT'ы ответ получить:
по SSH пользователь@хост АРГ1=АРГУМЕНТ1$АРГ2=$АРГУМЕНТ2 'Баш-ы' <<'ENDSSH'...
В этом случае мы устанавливаем arg1 и arg2 местного значения. Отправив все после того, как пользователь@хост как remote_command. Когда удаленная машина выполняет команду arg1 и arg2 устанавливаются местного значения, благодаря местным командная строка оценки, которая определяет переменные среды на удаленном сервере, а затем запускает Баш-s команда с помощью этих переменных. Вуаля.
<hostA_shell_prompt>$ ssh user@hostB "ls -la"
Это запросит у вас пароль, если только вы не скопировали открытый ключ пользователя hostA'в файл authorized_keys в каталоге home of user .ssh's. Это позволит проводить аутентификацию без пароля (если это принято в качестве метода аутентификации в конфигурации ssh-сервера')
Я'вэ начал использовать ткань для более сложных операций. Ткань требует питона и пару других зависимостей, но только на клиентской машине. Сервер нужен только ssh-сервер. Я нахожу этот инструмент, чтобы быть гораздо более мощным, чем скрипты передал от СШ, и хорошо стоит проблема получения настройки (особенно если вы любите программирование в Python). Ткань ручки запуска скриптов на нескольких хозяев (или хозяева определенных ролей), помогает облегчить идемпотентные операции (например, добавление строки в конфигурационный скрипт, но нет, если это's уже есть), и позволяет строить более сложную логику (например, в языке Python могут предоставить).
Попробуйте запустить SSH пользователь@дистанционного ш ./сценарий.ункс
.
Если вы предполагаете, что хотите делать это автоматически с "локальной" машины, без ручного входа на "удаленную" машину, вам следует обратить внимание на расширение TCL, известное как Expect, оно предназначено именно для таких ситуаций. Я также дал ссылку на скрипт для входа/взаимодействия через SSH.
если вы хотите выполнить команду
темп=`Общ -а` Эхо $ТЭМП
командование в `` приведет к ошибкам.
ниже команда будет решать эту проблему
SSH пользователь@хост ''' темп=`Общ -а` Эхо $ТЭМП '''
Ответ здесь (https://stackoverflow.com/a/2732991/4752883) отлично работает, если
вы'вновь пытается запустить скрипт на удаленной машине с Linux, используя тук
или СШ
.
Это будет работать, если скрипт содержит несколько строк на Линукс
.
Однако, если вы пытаетесь запустить пакетный скрипт, расположенный на локальном `машины с ОС Linux/Windows, и ваш удаленный компьютер "окна", и он состоит несколько строк, используя
`plink root@MachineB -m local_script.bat`
не будет работать.
Только в первой строке скрипта будет выполнен. Вероятно, это
ограничение палить
.
Для выполнения многострочного пакетного сценария (особенно, если это'с относительно простой, состоящие из несколько строк):
Если вашего оригинальный сценарий выглядит следующим образом
cd C:\Users\ipython_user\Desktop
python filename.py
вы можете комбинировать линии вместе с помощью в "&ампер;&ампер;" и сепаратор следующим образом в
local_script.файл bat
:
https://stackoverflow.com/a/8055390/4752883:
cd C:\Users\ipython_user\Desktop && python filename.py
После этого изменения, то вы можете запустить скрипт как указано здесь @JasonR.Кумбс: <https://stackoverflow.com/a/2732991/4752883> с:
плинк корень@MachineB -м local_script.летучая мышь
Решение # 2: Если ваш сценарий является относительно сложным, это может быть лучше использовать пакетный скрипт, который инкапсулирует команду плинк, а также следует, как указал здесь @Мартин https://stackoverflow.com/a/32196999/4752883:
rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N
rem Wait a second to let Plink establish the tunnel
timeout /t 1
rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R
rem Kill the tunnel
taskkill /im plink.exe
Вы можете использовать runoverssh:
Баш судо АПТ установить runoverssh
Баш runoverssh -с localscript.sh пользователь узел1 Узел2 Узел3...
-С
работает скрипт удаленно
Полезные флаги:
-г
использовать глобальный пароль для всех узлов (один пароль)
-Н
использовать SSH вместо sshpass, полезные для аутентификации на основе открытого ключа
Этот скрипт делает bash SSH на целевой удаленный компьютер и запустить какую-то команду на удаленной машине, не забудьте установить ожидайте, перед его запуском (на самогон Мак установить ждать )
#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"
ssh user@hostname ".~/.bashrc;/cd path-to-file/;.filename.sh"
настоятельно рекомендуется источник файл среды(.bashrc и/.bashprofile/.профиль). прежде чем запускать что-то на удаленный хост, потому что цель и исходные узлы переменных окружения может быть отсрочивают друг.
Сначала скопируйте сценарий на машину B с помощью scp
[user@machineA]$ scp /path/to/script user@machineB:/home/user/path
Затем просто запустите скрипт
[user@machineA]$ ssh user@machineB "/home/user/path/script"
Это будет работать, если вы предоставили скрипту разрешение на выполнение.