написати сценарій оболонки для ssh на віддалену машину та виконати команди


97

У мене є два запитання:

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

Віддалені машини - це віртуальні машини, створені під час запуску, і я просто маю їхні IP-адреси. Отже, я не можу розмістити файл сценарію заздалегідь на цих машинах і виконати їх зі своєї машини.


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

Мені потрібно виконати набір команд лише один раз, тому не потрібно підтримувати зв’язок
Баланіваш

"немає сценаріїв" означає "взагалі відсутні файли", я думаю? Як ви обробляєте автентифікацію? Ви можете відключити перевірку відбитків пальців хоста (див. Мою відповідь), але ви все одно отримуєте інтерактивне запит на введення пароля, якщо ви не встановили відкритий / закритий ключ.
Андреас Фестер,

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

Відповіді:


141

Існує кілька віддалених машин 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?
Chanafot

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, збереження вихідних даних у файлах та тайм-аут.

Приклад і використання:

Підключіться до хоста1 та хоста2 та надрукуйте "привіт, світе" з кожного:

 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: [user @] host [: port] для одного хоста.
-i: Відображення стандартного виводу та стандартної помилки під час завершення кожного
аргументу -x аргументи: передає додаткові аргументи командного рядка SSH -опція
: Може використовуватися для надання опцій у форматі, що використовується у файлі конфігурації. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p паралелізм: Використовуйте вказане число як максимальну кількість одночасних з'єднань
-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 Script . Якщо ваш апарат не підтримує очікуйте, ви можете завантажити те саме. Написати сценарій Expect дуже просто (google отримати допомогу з цього приводу)
  • Помістіть усі дії, які потрібно виконати на віддаленому сервері, у сценарій оболонки.
  • Викликати скрипт віддаленої оболонки з очікуваного сценарію після успішного входу.

Як я вже згадував у питанні, віддалені машини створюються під час запуску, і я не можу мати жодного сценарію в машині заздалегідь.
Баланіваш

У такому випадку виконайте всі дії в сценарії Expect. Очікуваний сценарій може запускати команди також на віддаленому хості.
rai.skumar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.