Я должен запустить сценарий оболочки (Windows / Linux) на удаленной машине.
У меня настроен SSH на компьютере A и B. Мой сценарий находится на компьютере A, который будет выполнять часть моего кода на удаленной машине, машине B.
Локальные и удаленные компьютеры могут быть системами на базе Windows или Unix.
Есть ли способ запустить это с помощью plink / ssh?
shell
ssh
sysadmin
remote-execution
alpha_989
источник
источник
Ответы:
Если компьютер A является Windows-модулем, вы можете использовать Plink (часть PuTTY ) с параметром -m, и он будет выполнять локальный сценарий на удаленном сервере.
Если машина A является системой на основе Unix, вы можете использовать:
Вам не нужно копировать скрипт на удаленный сервер, чтобы запустить его.
источник
-s
опции? эта страница руководства заставляет меня поверить, что она будет обрабатывать стандартный ввод, когда будет выполнена обработка, независимо от того-s
, используется она или нет.sudo
, запуститеssh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.HISTCONTROL=ignoreboth or ignorespace
чтобы она работала)ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
Кредиты полностью переходят к ответу @chubbsondubs ниже.Это старый вопрос, и ответ Джейсона работает нормально, но я хотел бы добавить это:
Это также может быть использовано с командами su и, которые требуют пользовательского ввода. (обратите внимание на
'
сбежавшего наследника)Изменить: так как этот ответ продолжает получать бит трафика, я бы добавил еще больше информации для этого замечательного использования heredoc:
Вы можете вкладывать команды с этим синтаксисом, и это единственный способ, которым кажется, что вложение работает (в здравом смысле)
На самом деле вы можете поговорить с некоторыми службами, такими как telnet, ftp и т. Д. Но помните, что heredoc просто отправляет stdin в виде текста, он не ждет ответа между строками
Редактировать: я только что узнал, что вы можете сделать отступы с помощью вкладок, если вы используете
<<-END
!(Я думаю, что это должно работать)
Также см. Http://tldp.org/LDP/abs/html/here-docs.html.
источник
<<'ENDSSH'
) строки не будут расширяться, переменные не будут оцениваться. Вы также можете использовать<<ENDSSH
или,<<"ENDSSH"
если вы хотите расширения.Expect
может использоваться, когда вам нужно автоматизировать интерактивные команды, такие как FTP.Pseudo-terminal will not be allocated because stdin is not a terminal.
сообщение.-t -t
Чтобы избежать этого, нужно использовать ssh с параметрами. Смотрите эту тему на SOКроме того, не забудьте экранировать переменные, если вы хотите забрать их с хоста назначения.
Это застало меня в прошлом.
Например:
распечатывает / home / user2
пока
распечатывает / home / user
Другой пример:
распечатывает "привет" правильно.
источник
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
циклах, запущенных вssh
сеансе, переменная цикла не должна быть экранирована.ssh user2@host2 'echo hello world' | awk '{ print $1 }'
запустить скрипт Awk локально. Если удаленная команда производит огромное количество выводимых данных, вы, конечно же, хотите избежать копирования всего этого обратно на локальный сервер. Между прочим, одинарные кавычки вокруг удаленной команды исключают необходимость экранирования.Это расширение ответа YarekT на объединение встроенных удаленных команд с передачей переменных ENV с локального компьютера на удаленный хост, чтобы вы могли параметризовать свои сценарии на удаленной стороне:
Я нашел это исключительно полезным, сохранив все это в одном сценарии, чтобы он был очень удобочитаемым и поддерживаемым.
Почему это работает. ssh поддерживает следующий синтаксис:
В bash мы можем указать переменные среды, которые нужно определить до запуска команды в одной строке, например:
Это облегчает определение переменных до запуска команды. В этом случае echo - наша команда, которую мы выполняем. Все до echo определяет переменные окружения.
Таким образом, мы объединяем эти две функции и ответ YarekT, чтобы получить:
В этом случае мы устанавливаем ARG1 и ARG2 в локальные значения. Отправка всего после user @ host как remote_command. Когда удаленный компьютер выполняет команду ARG1 и ARG2 устанавливают локальные значения, благодаря локальной оценке командной строки, которая определяет переменные среды на удаленном сервере, а затем выполняет команду bash -s с использованием этих переменных. Вуаля.
источник
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
заключается в том, чтобы иметь возможность применять аргументы к сценариям, полученным через stdin. Я имею в виду, вы можете также опустить его, если вы не собираетесь его использовать. Если вы используете его, нет никаких причин использовать переменные среды:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
Это запросит у вас пароль, если только вы не скопировали открытый ключ пользователя hostA в файл author_keys в каталоге пользователя .ssh. Это позволит проводить аутентификацию без пароля (если она принята в качестве метода авторизации в конфигурации сервера ssh)
источник
Я начал использовать Fabric для более сложных операций. Fabric требует Python и пару других зависимостей, но только на клиентском компьютере. Сервер должен быть только ssh-сервером. Я считаю, что этот инструмент гораздо более мощный, чем сценарии оболочки, переданные SSH, и стоит того, чтобы его настроить (особенно если вам нравится программирование на Python). Fabric обрабатывает выполняемые сценарии на нескольких хостах (или хостах определенных ролей), помогает упростить идемпотентные операции (такие как добавление строки в скрипт конфигурации, но не, если она уже есть) и позволяет создавать более сложную логику (такую как Python). язык могу предоставить).
источник
Попробуйте запустить
ssh user@remote sh ./script.unx
.источник
источник
Предполагая, что вы хотите сделать это автоматически с «локального» компьютера, без ручного входа на «удаленный» компьютер, вам нужно посмотреть расширение TCL, известное как Expect, оно разработано именно для такой ситуации. Я также предоставил ссылку на скрипт для входа / взаимодействия через SSH.
https://www.nist.gov/services-resources/software/expect
http://bash.cyberciti.biz/security/expect-ssh-login-script/
источник
Я использую этот для запуска сценария оболочки на удаленной машине (проверено на / bin / bash):
источник
Настоятельно рекомендуется использовать исходный файл среды (.bashrc / .bashprofile / .profile). перед запуском чего-либо на удаленном хосте, потому что переменные окружения целевого и исходного хостов могут быть deffer.
источник
если вы хотите выполнить команду, как это
temp=`ls -a` echo $temp
команда `` вызовет ошибки.команда ниже решит эту проблему
ssh user@host ''' temp=`ls -a` echo $temp '''
источник
Ответ здесь ( https://stackoverflow.com/a/2732991/4752883 ) прекрасно работает, если вы пытаетесь запустить скрипт на удаленной машине Linux с помощью
plink
илиssh
. Это будет работать, если скрипт имеет несколько строкlinux
.** Однако, если вы пытаетесь запустить пакетный скрипт, расположенный на локальном
linux/windows
компьютере, а ваш удаленный компьютер естьWindows
, и он состоит из нескольких строк, используя **plink root@MachineB -m local_script.bat
не будет работать.
Будет выполнена только первая строка скрипта. Это, вероятно, ограничение
plink
.Решение 1:
Чтобы запустить многострочный пакетный скрипт (особенно, если он относительно простой и состоит из нескольких строк):
Если ваш оригинальный пакетный скрипт выглядит следующим образом
Вы можете объединить строки, используя разделитель «&&», как показано в вашем
local_script.bat
файле: https://stackoverflow.com/a/8055390/4752883 :После этого изменения вы можете запустить скрипт, как указано здесь @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 с:
Решение 2:
Если ваш пакетный сценарий относительно сложен, может быть лучше использовать пакетный сценарий, который инкапсулирует команду plink, а также следующие действия, указанные здесь @Martin https://stackoverflow.com/a/32196999/4752883 :
источник
Этот bash-скрипт запускает ssh на целевой удаленной машине и запускает некоторую команду на удаленной машине, не забудьте установить ожидаемую часть перед запуском (на Mac
brew install expect
)источник
Вы можете использовать runoverssh :
-s
запускает локальный скрипт удаленноПолезные флаги:
-g
используйте глобальный пароль для всех хостов (запрос одного пароля),-n
используйте SSH вместо sshpass, полезно для аутентификации с открытым ключомисточник
Сначала скопируйте скрипт на компьютер B, используя scp
Затем просто запустите скрипт
Это будет работать, если вы дали исполняемому разрешению скрипт.
источник