2008-11-20 4 views

ответ

87
<hostA_shell_prompt>$ ssh [email protected] "ls -la" 

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

+2

Проголосовали за вас. Это допустимое решение. Очевидно, что ключи должны быть защищены, но они также могут быть недействительными точно так же, как пароль через сервер. – willasaywhat 2008-11-21 17:44:47

+6

Я не думаю, что это отвечает на вопрос. В этом примере показано, как запустить удаленную команду, но не как выполнить локальный скрипт на удаленной машине. – 2010-04-28 21:03:36

+0

Не уверен, но не можете ли вы подключить свой скрипт к hostA для запуска на hostB с помощью этого метода? – nevets1219 2010-04-28 21:13:12

-22

Во-первых, скопировать сценарий к Machine B с помощью Scp

[пользователь @ machineâ] $ УПП/путь/к/скрипт пользователя @ MachineB:/Главная/пользователь/путь

Затем просто запустите скрипт

[пользователь @ machineâ] $ SSH пользователь @ MachineB «/ Главная/пользователь/путь/скрипт "

Это будет работать, если вы предоставили исполняемый файл сценарию.

+0

привет Я применил рекомендуемое предложение, но он дал мне следующую ошибку: [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

+0

'ssh oracle @ node2: ./ home/oracle/au /fs/conn.sh? В неправильной командной строке имя команды должно быть отделено от части user @ host пробелом, а не двоеточием. – bortzmeyer 2008-12-15 13:37:37

+4

Я ниспровергаю это, потому что это первичное утверждение о том, что он не может быть запущен без копирования, неверен. – 2010-04-28 21:02:40

8

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

http://expect.nist.gov/

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

197

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

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

Например:

[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}'" 

правильно распечатывает «привет».

4

Попробуйте запустить ssh [email protected] sh ./script.unx.

+4

Это работает только в том случае, если скрипт находится в каталоге по умолчанию (home) на пульте дистанционного управления. Я думаю, что вопрос заключается в том, как запустить скрипт, хранящийся локально на пульте дистанционного управления. – metasim 2010-07-20 12:35:33

974

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

plink [email protected] -m local_script.sh 

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

ssh [email protected] 'bash -s' < local_script.sh 

Вы не должны скопировать скрипт на удаленном сервере, чтобы запустить его.

471

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

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 

(я думаю, что это должно работать)

Также см http://tldp.org/LDP/abs/html/here-docs.html

24

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

115

Это расширение для ответа 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 с использованием этих переменных. Вуаля.

 Смежные вопросы

  • Нет связанных вопросов^_^