napisz skrypt powłoki do ssh na zdalnej maszynie i wykonaj polecenia


97

Mam dwa pytania:

  1. Istnieje wiele zdalnych maszyn linuxowych i muszę napisać skrypt powłoki, który będzie wykonywał ten sam zestaw poleceń na każdej maszynie. (W tym niektóre operacje sudo). Jak można to zrobić za pomocą skryptów powłoki?
  2. Podczas łączenia się z komputerem zdalnym, jak postępować, gdy pojawi się monit o uwierzytelnienie odcisków palców RSA.

Zdalne maszyny to maszyny wirtualne tworzone w biegu, a ja mam tylko ich adresy IP. Nie mogę więc wcześniej umieścić pliku skryptu na tych maszynach i uruchomić ich z mojego komputera.


Myślę o wdrożeniu programu podobnego do agenta na zdalnych maszynach z systemem Linux, które utrzymują połączenie z serwerem przez gniazdo sieciowe (lub SSL) / przez okresowe odpytywanie do serwera.
Raptor,

Zestaw poleceń muszę wykonać tylko raz, więc nie ma potrzeby utrzymywania połączenia
Balanivash

Przypuszczam, że „brak skryptów” oznacza „żadnych plików”? Jak radzisz sobie z uwierzytelnianiem? Możesz wyłączyć sprawdzanie linii papilarnych hosta (zobacz moją odpowiedź), ale nadal otrzymujesz interaktywne zapytanie o hasło, jeśli nie skonfigurowałeś klucza publicznego / prywatnego.
Andreas Fester

1
Andreas: tak. żadnych plików. znak zachęty do podania hasła może być obsługiwany za pomocą expect„oczekiwać” ? hasło:
Balanivash

Odpowiedzi:


142

Istnieje wiele zdalnych maszyn linuxowych i muszę napisać skrypt powłoki, który będzie wykonywał ten sam zestaw poleceń na każdej maszynie. (W tym niektóre operacje sudo). Jak można to zrobić za pomocą skryptów powłoki?

Możesz to zrobić za pomocą ssh, na przykład:

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

Podczas łączenia się z komputerem zdalnym, jak postępować, gdy pojawi się monit o uwierzytelnienie odcisków palców RSA.

Możesz dodać StrictHostKeyChecking=noopcję do ssh:

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

Spowoduje to wyłączenie sprawdzania klucza hosta i automatyczne dodanie klucza hosta do listy znanych hostów. Jeśli nie chcesz, aby host był dodawany do pliku znanych hostów, dodaj opcję -o UserKnownHostsFile=/dev/null.

Należy pamiętać, że powoduje to wyłączenie niektórych kontroli bezpieczeństwa , na przykład ochrony przed atakiem typu man-in-the-middle. Dlatego nie należy go stosować w środowisku wrażliwym na bezpieczeństwo.


Jaki jest język skryptowy? Możesz oczywiście zadzwonić sshz dowolnego skryptu powłoki
Andreas Fester,

A co jeśli chcesz również zrobić CTRL + C i kontynuować ssh na wielu serwerach? na przykład na niektórych serwerach prosi o hasło, a na innych nie, więc skrypt tam utknie. czy istnieje sposób na zrobienie czegoś podobnego do -o przy wykonywaniu CTRL c lub CTRL d?
Chanafot

5

Istnieje wiele sposobów radzenia sobie z tym.

Moim ulubionym sposobem jest zainstalowanie http://pamsshagentauth.sourceforge.net/ na zdalnych systemach, a także własnego klucza publicznego. (Znajdź sposób na zainstalowanie tych plików na maszynie wirtualnej, w jakiś sposób masz zainstalowany cały system Unix, co to jest jeszcze kilka plików?)

Po przekazaniu agenta ssh możesz teraz zalogować się do każdego systemu bez hasła.

A nawet lepiej, ten moduł pam uwierzytelni się dla sudo z twoją parą kluczy ssh, dzięki czemu możesz uruchomić z uprawnieniami roota (lub dowolnego innego użytkownika) w razie potrzeby.

Nie musisz martwić się o interakcję z kluczem hosta. Jeśli dane wejściowe nie pochodzą z terminala, ssh ograniczy po prostu możliwość przekazywania agentów i uwierzytelniania za pomocą haseł.

Powinieneś także zajrzeć do pakietów takich jak Capistrano. Zdecydowanie rozejrzyj się po tej witrynie; zawiera wprowadzenie do zdalnego skryptowania.

Poszczególne wiersze skryptu mogą wyglądać mniej więcej tak:

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

4

Zainstaluj sshpass za pomocą, apt-get install sshpassa następnie edytuj skrypt i umieść adresy IP, nazwy użytkowników i hasła swoich maszyn z systemem Linux w odpowiedniej kolejności. Następnie uruchom ten skrypt. Otóż ​​to ! Ten skrypt zainstaluje VLC we wszystkich systemach.

#!/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

użyj $ SSHPASS, aby wyeksportować hasło, aby uniknąć wyświetlania w skrypcie. Ref: tecmint.com/…
Hexy,

2

Jeśli potrafisz napisać kod w Perlu, powinieneś rozważyć użycie Net :: OpenSSH :: Parallel .

Byłbyś w stanie w deklaratywny sposób opisać akcje, które muszą zostać uruchomione na każdym hoście, a moduł zajmie się wszystkimi przerażającymi szczegółami. sudoObsługiwane jest również uruchamianie poleceń .


2

Ta praca dla mnie.

Składnia: ssh -i pemfile.pem nazwa_użytkownika @ adres_ip 'command_1; polecenie 2; polecenie 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

Do tego typu zadań wielokrotnie używam Ansible, który pozwala na spójne kopiowanie skryptów bash w kilku kontenerach lub maszynach wirtualnych. Ansible (a dokładniej Red Hat ) ma teraz dodatkowy interfejs sieciowy AWX, który jest wersją open source ich komercyjnej wersji Tower.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: produkt komercyjny, prawdopodobnie najpierw odkryjesz darmowy AWX o otwartym kodzie źródłowym, a nie 15-dniowy darmowy szlak wieży


1

Istnieje wiele sposobów wykonywania poleceń lub skryptów na wielu zdalnych komputerach z systemem Linux. Jednym prostym i najłatwiejszym sposobem jest użycie pssh (równoległy program ssh)

pssh : to program do równoległego wykonywania ssh na wielu hostach. Udostępnia funkcje, takie jak wysyłanie danych wejściowych do wszystkich procesów, przekazywanie hasła do ssh, zapisywanie danych wyjściowych do plików i przekroczenie limitu czasu.

Przykład i zastosowanie:

połącz się z hostami host1 i host2 i wydrukuj „hello, world” z każdego z nich:

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

Uruchamiaj polecenia za pomocą skryptu na wielu serwerach:

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

Użyj i uruchom polecenie bez sprawdzania lub zapisywania kluczy hosta:

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

Jeśli plik hosts.txt zawiera dużą liczbę wpisów, powiedzmy 100, wówczas opcję równoległości można również ustawić na 100, aby zapewnić równoczesne uruchamianie poleceń:

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

Opcje :
-I : Odczytuje wejście i wysyła do każdego procesu ssh.
-P: Nakazuje pssh wyświetlić wyjście, gdy nadejdzie.
-h: Czyta plik hosta.
-H: [użytkownik @] host [: port] dla pojedynczego hosta.
-i: Wyświetla standardowe wyjście i błąd standardowy po zakończeniu każdego hosta
-x args: Przekazuje dodatkowe argumenty wiersza poleceń SSH
-o opcja: Można jej użyć do podania opcji w formacie użytym w pliku konfiguracyjnym. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p paralelizm: użyj podanej liczby jako maksymalnej liczby jednoczesnych połączeń
-q Tryb cichy: powoduje, że większość komunikatów ostrzegawczych i diagnostycznych jest pomijana.
-t: Przekracza limit czasu połączeń po określonej liczbie sekund. 0 oznacza, że ​​pssh nie przekroczy limitu czasu połączeń

Podczas łączenia się z komputerem zdalnym, jak postępować, gdy pojawi się monit o uwierzytelnienie odcisków palców RSA.

Wyłącz StrictHostKeyChecking, aby obsłużyć monit uwierzytelniania RSA.
-o StrictHostKeyChecking = nie

Źródło : man pssh


0

To zadziałało dla mnie. Zrobiłem funkcję. Umieść to w swoim skrypcie powłoki:

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

sshcmd USER HOST COMMAND

Jeśli masz wiele komputerów, na których chcesz wykonać to samo polecenie, powtórz ten wiersz ze średnikiem. Na przykład, jeśli masz dwie maszyny, zrobiłbyś to:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Zastąp USER nazwą użytkownika komputera. Zastąp HOST nazwą komputera. Zastąp COMMAND poleceniem, które chcesz wykonać na komputerze.

Mam nadzieję że to pomoże!


-1

Możesz zastosować to podejście:

  • Połącz się ze zdalnym komputerem za pomocą Expect Script . Jeśli twój komputer nie obsługuje, możesz pobrać to samo. Pisanie skryptu Expect jest bardzo łatwe (Google, aby uzyskać pomoc w tej sprawie)
  • Wszystkie czynności, które należy wykonać na serwerze zdalnym, umieść w skrypcie powłoki.
  • Wywołaj zdalny skrypt powłoki ze skryptu oczekiwania po pomyślnym zalogowaniu.

Jak wspomniałem w pytaniu, zdalne maszyny są tworzone w biegu i nie mogę wcześniej mieć żadnego skryptu na komputerze.
Balanivash,

W takim przypadku umieść całą akcję w skrypcie Expect. Oczekuj, że skrypt może uruchamiać polecenia również na zdalnym hoście.
rai.skumar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.