Как использовать SSH для запуска оболочки script на удаленном компьютере?

Как запустить оболочку script на удаленном компьютере?

У меня есть SSH, настроенный как на машинах A, так и на B. Мой script находится на машине A, которая выполнит задачу на машине B.

+880
20 нояб. '08 в 11:44
источник поделиться
9 ответов

Если машина A - это окно Windows, вы можете использовать Plink (часть PuTTY) с параметром -m, и он будет выполните локальный script на удаленном сервере.

plink root@MachineB -m local_script.sh

Если машина A - это система на основе Unix, вы можете использовать:

ssh root@MachineB 'bash -s' < local_script.sh

Вам не нужно копировать script на удаленный сервер для его запуска.

+939
28 апр. '10 в 20:41
источник

Связанные вопросы


Похожие вопросы

Это старый вопрос, и ответ Джейсона отлично работает, но я хотел бы добавить это:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

Это также можно использовать с su и командами, требующими ввода пользователем. (обратите внимание на ' escape-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 просто отправляет stdin в виде текста, он не ждет ответа между строками

Изменить: я только что узнал, что вы можете отступать от внутренней стороны, если используете <<-END!

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

+446
06 окт. '10 в 13:11
источник

Кроме того, не забудьте избежать переменных, если вы хотите их забрать с целевого хоста.

Это уловило меня в прошлом.

Например:

user@host> ssh user2@host2 "echo \$HOME"

выводит/home/user2

а

user@host> ssh user2@host2 "echo $HOME"

выводит/home/user

Другой пример:

user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"

корректно выводит "привет".

+192
20 нояб. '08 в 12:25
источник

Это расширение ответа YarekT для объединения встроенных удаленных команд с передачей переменных ENV с локальной машины на удаленный хост, чтобы вы могли параметризовать свои сценарии на удаленной стороне:

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

Я нашел это исключительно полезным, сохранив его в одном script, чтобы он был очень читабельным и поддерживаемым.

Почему это работает. ssh поддерживает следующий синтаксис:

ssh user @host remote_command

В bash мы можем указать переменные среды для определения перед запуском команды в одной строке следующим образом:

ENV_VAR_1 = 'значение1' ENV_VAR_2 = 'значение2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'

Это упрощает определение переменных перед запуском команды. В этом случае echo - наша команда, в которой мы работаем. Все перед echo определяет переменные среды.

Итак, мы объединяем эти две функции и ответ YarekT, чтобы получить:

ssh user @host ARG1 = $ARG1 ARG2 = $ARG2 'bash -s'<'ENDSSH'...

В этом случае мы устанавливаем ARG1 и ARG2 в локальные значения. Отправка всего после user @host как remote_command. Когда удаленный компьютер выполняет команду ARG1 и ARG2, устанавливаются локальные значения, благодаря локальной оценке командной строки, которая определяет переменные среды на удаленном сервере, а затем выполняет команду bash -s с использованием этих переменных. Вуаля.

+104
09 сент. '11 в 15:00
источник
<hostA_shell_prompt>$ ssh user@hostB "ls -la"

Это подскажет вам пароль, если вы не скопировали открытый ключ пользователя hostA в файл authorized_keys в домашней директории пользователя .ssh. Это позволит использовать аутентификацию без пароля (если она принимается как метод auth в конфигурации ssh-сервера)

+79
20 нояб. '08 в 11:53
источник

Я начал использовать Fabric для более сложных операций. Для Fabric требуется Python и несколько других зависимостей, но только на клиентской машине. Серверу нужен только сервер ssh. Я считаю, что этот инструмент намного мощнее, чем сценарии оболочки, переданные в SSH, и стоит того, чтобы его настроить (особенно, если вам нравится программирование на Python). Ткань обрабатывает сценарии на нескольких хостах (или узлах определенных ролей), помогает упростить операции idempotent (например, добавить строку в конфигурацию script, но не если она уже существует), и позволяет построить более сложную логику (например, язык Python может обеспечить).

+23
26 янв. '11 в 16:17
источник

Предполагая, что вы хотите сделать это автоматически с "локальной" машины, без ручного входа в машину "remote", вы должны изучить расширение TCL, известное как "Ожидание", оно предназначено именно для такого рода ситуаций. На этой домашней странице выглядит немного дерьмово, но не позволяйте этому отговаривать вас; Я также предоставил ссылку на script для входа в систему/взаимодействия через SSH.

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/

+8
20 нояб. '08 в 12:10
источник

Я пытаюсь запустить удаленный script что-то вроде ssh user @remote sh script.unx

script.unx на удаленном компьютере, запускается несколько команд, но он говорит

commando не найден, похоже, что удаленный script не читает переменные окружения

любая идея?

попробуйте запустить ssh user @remote sh./ script.unx

+4
18 дек. '09 в 21:16
источник

Сначала скопируйте script на Machine B с помощью scp

[user @machineA] $scp/path/to/ script user @machineB:/home/user/path

Затем запустите script

[user @machineA] $ssh user @machineB "/home/user/path/ script"

Это будет работать, если вы предоставили исполняемый разрешение script.

-22
20 нояб. '08 в 12:00
источник

Посмотрите другие вопросы по меткам или Задайте вопрос