написать сценарий оболочки для ssh на удаленный компьютер и выполнить команды


97

У меня два вопроса:

  1. Существует несколько удаленных компьютеров с Linux, и мне нужно написать сценарий оболочки, который будет выполнять один и тот же набор команд на каждой машине. (Включая некоторые операции sudo). Как это можно сделать с помощью сценариев оболочки?
  2. Когда ssh'ing к удаленному компьютеру, как обрабатывать, когда он запрашивает аутентификацию по отпечатку пальца RSA.

Удаленные машины - это виртуальные машины, созданные на ходу, и у меня есть только их IP-адреса. Итак, я не могу заранее разместить файл сценария на этих машинах и выполнить их со своей машины.


Я думаю о развертывании агентоподобной программы на удаленных машинах Linux, которые поддерживают соединение с сервером через соединение через сетевой сокет (или SSL) / путем периодического опроса на сервере.
Raptor

Мне нужно выполнить набор команд только один раз, поэтому нет необходимости поддерживать соединение
Баланиваш

Полагаю, «без скриптов» означает «вообще без файлов»? Как вы обрабатываете аутентификацию? Вы можете отключить проверку отпечатка пальца хоста (см. Мой ответ), но вы все равно получите интерактивный запрос пароля, если вы не настроили открытый / закрытый ключ.
Андреас Фестер

1
Андреас: да. файлов вообще нет. приглашение passwd можно обработать, используя expectкак `expect" ? assword: "`
Баланиваш

Ответы:


142

Существует несколько удаленных компьютеров с Linux, и мне нужно написать сценарий оболочки, который будет выполнять один и тот же набор команд на каждой машине. (Включая некоторые операции sudo). Как это можно сделать с помощью сценариев оболочки?

Вы можете сделать это с помощью ssh, например:

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

Когда ssh'ing к удаленному компьютеру, как обрабатывать, когда он запрашивает аутентификацию по отпечатку пальца RSA.

Вы можете добавить StrictHostKeyChecking=noпараметр в ssh:

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

Это отключит проверку ключа хоста и автоматически добавит ключ хоста в список известных хостов. Если вы не хотите, чтобы хост добавлялся в файл известных хостов, добавьте эту опцию -o UserKnownHostsFile=/dev/null.

Обратите внимание, что это отключает определенные проверки безопасности , например защиту от атаки «злоумышленник посередине». Поэтому его не следует применять в среде, чувствительной к безопасности.


Какой язык сценариев? Конечно, вы также можете позвонить sshиз любого сценария оболочки
Андреас Фестер

как насчет того, если вы также хотите сделать CTRL + C и продолжить ssh на нескольких серверах ?. например, на некоторых серверах запрашивается пароль, а на других - нет, поэтому скрипт там застревает. есть ли способ сделать что-то похожее на -o для выполнения CTRL c или CTRL d?
Ханафот,

5

Есть несколько способов справиться с этим.

Мой любимый способ - установить http://pamsshagentauth.sourceforge.net/ в удаленных системах, а также ваш собственный открытый ключ. (Придумайте способ установить их на виртуальную машину, каким-то образом у вас установлена ​​вся система Unix, какие еще файлы?)

Теперь, когда ваш ssh-агент перенаправлен, вы можете входить в любую систему без пароля.

И что еще лучше, этот модуль pam будет аутентифицироваться для sudo с вашей парой ключей ssh, поэтому вы можете работать с правами root (или любого другого пользователя) по мере необходимости.

Вам не нужно беспокоиться о взаимодействии ключа хоста. Если вход не является терминалом, тогда ssh просто ограничит вашу способность пересылать агентов и аутентифицироваться с помощью паролей.

Вам также следует изучить такие пакеты, как Capistrano. Обязательно посмотрите на этот сайт; в нем есть введение в удаленное создание сценариев.

Отдельные строки скрипта могут выглядеть примерно так:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

4

Установите sshpass с помощью, apt-get install sshpassзатем отредактируйте сценарий и поместите IP-адреса ваших Linux-машин, имена пользователей и пароль в соответствующем порядке. После этого запустите этот скрипт. Это оно ! Этот скрипт установит VLC во все системы.

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

используйте $ SSHPASS для экспорта пароля, чтобы он не отображался в скрипте. Ссылка: tecmint.com/…
Hexy,

2

Если вы умеете писать код Perl, вам следует рассмотреть возможность использования Net :: OpenSSH :: Parallel .

Вы сможете описать действия, которые должны выполняться на каждом хосте, декларативно, а модуль позаботится обо всех пугающих деталях. sudoТакже поддерживается выполнение команд .


2

Эта работа для меня.

Синтаксис: ssh -i pemfile.pem имя_пользователя @ ip_address 'command_1; команда 2; команда 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

1

Для такого рода задач я неоднократно использую Ansible, который позволяет последовательно дублировать сценарии bash в нескольких контейнерах или виртуальной машине. У Ansible (точнее, Red Hat ) теперь есть дополнительный веб-интерфейс AWX, который представляет собой версию с открытым исходным кодом их коммерческой Tower.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: коммерческий продукт, вы, вероятно, сначала изучите бесплатный AWX с открытым исходным кодом, а не 15 дней бесплатного использования. Башни


1

Есть несколько способов выполнить команды или сценарий на нескольких удаленных машинах Linux. Один простой и легкий способ - через pssh (параллельная программа ssh)

pssh : это программа для параллельного выполнения ssh на нескольких хостах. Он предоставляет такие функции, как отправка входных данных всем процессам, передача пароля по ssh, сохранение вывода в файлы и тайм-аут.

Пример и использование:

подключитесь к host1 и host2 и выведите «hello, world» из каждого:

 pssh -i -H "host1 host2" echo "hello, world"

Запускайте команды через скрипт на нескольких серверах:

pssh -h hosts.txt -P -I<./commands.sh

Использование и запуск команды без проверки или сохранения ключей хоста:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

Если файл hosts.txt имеет большое количество записей, скажем 100, тогда параметр параллелизма также может быть установлен на 100, чтобы гарантировать, что команды выполняются одновременно:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

Параметры :
-I: читать ввод и отправлять каждому процессу ssh.
-P: указывает pssh отображать вывод по мере его поступления.
-h: читает файл хоста.
-H: [пользователь @] хост [: порт] для одиночного хоста.
-i: отображать стандартный вывод и стандартную ошибку при завершении каждого хоста
-x args: передает дополнительные аргументы командной строки SSH
-o option: может использоваться для предоставления параметров в формате, используемом в файле конфигурации. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p parallelism: использовать данное число как максимальное количество одновременных подключений
-q Тихий режим: подавляет большинство предупреждающих и диагностических сообщений.
-t: установить тайм-аут соединения через заданное количество секунд. 0 означает, что pssh не будет тайм-аут для подключения

Когда ssh'ing к удаленному компьютеру, как обрабатывать, когда он запрашивает аутентификацию по отпечатку пальца RSA.

Отключите StrictHostKeyChecking для обработки запроса проверки подлинности RSA.
-o StrictHostKeyChecking = нет

Источник : man pssh


0

Это сработало для меня. Я выполнил функцию. Поместите это в свой сценарий оболочки:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

Если у вас есть несколько компьютеров, на которых вы хотите выполнить одну и ту же команду, повторите эту строку с точкой с запятой. Например, если у вас две машины, вы бы сделали это:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Замените USER на пользователя компьютера. Замените HOST именем компьютера. Замените COMMAND на команду, которую вы хотите выполнить на компьютере.

Надеюсь это поможет!


-1

Вы можете следовать этому подходу:

  • Подключитесь к удаленному компьютеру с помощью сценария ожидания . Если ваша машина не поддерживает, вы можете загрузить то же самое. Написать сценарий Expect очень просто (Google, чтобы получить помощь по этому поводу)
  • Поместите все действия, которые необходимо выполнить на удаленном сервере, в сценарий оболочки.
  • Вызов удаленного сценария оболочки из сценария ожидания после успешного входа в систему.

Как я уже упоминал в вопросе, удаленные машины создаются на ходу, и я не могу заранее установить на машине какой-либо скрипт.
Баланиваш

В этом случае поместите все действия в сценарий Expect. Сценарий Expect также может выполнять команды на удаленном хосте.
rai.skumar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.