2012-12-18 15 views
57

Mam dwa pytania:napisać skrypt do ssh do zdalnego komputera i wykonywać polecenia

  1. Istnieje wiele maszyn zdalnych Linux i muszę napisać skrypt, który będzie wykonywał ten sam zestaw poleceń w każdej maszynie. (W tym niektóre operacje sudo). Jak to zrobić za pomocą skryptów powłoki?
  2. Ssh'ing do zdalnego komputera, jak obsługiwać, gdy prosi o uwierzytelnienie odcisków palców RSA.

Zdalne maszyny to maszyny wirtualne utworzone w biegu i po prostu mam ich adresy IP. Nie mogę więc wcześniej umieścić pliku skryptu na tych maszynach i wykonać ich z mojego komputera.

+0

myślę o wdrożeniu programu agenta, jak w odległych komputerach z systemem Linux, które utrzymują połączenie z serwerem za pomocą gniazda sieciowego (SSL) lub przez połączenie/okresowego odpytywania do serwera. – Raptor

+0

Muszę wykonać zestaw komend tylko raz, więc nie ma potrzeby utrzymywania połączenia – Balanivash

+0

"brak skryptów" oznacza "brak plików w ogóle", jak sądzę? Jak radzisz sobie z uwierzytelnianiem? Możesz wyłączyć sprawdzanie odcisków palców hosta (zobacz moją odpowiedź), ale nadal otrzymujesz interaktywny monit o podanie hasła, jeśli nie ustawiłeś klucza publicznego/prywatnego. –

Odpowiedz

88

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

Można 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 

Kiedy ssh'ing do zdalnej maszyny, jak radzić sobie, gdy skłania do uwierzytelniania linii papilarnych RSA.

Możesz dodać opcję StrictHostKeyChecking=no do ssh:

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

Będzie disable the host key check i automatycznie dodać klucz hosta do listy znanych hostów. Jeśli nie chcesz dodawać hosta do znanego pliku hosts, dodaj opcję -o UserKnownHostsFile=/dev/null.

Należy pamiętać, że ten wyłącza niektóre kontrole bezpieczeństwa, na przykład ochronę przed atakiem man-in-the-middle. Dlatego nie należy go stosować w środowisku wrażliwym na bezpieczeństwo.

+0

Potrzebuję ssh z poziomu skryptu, a nie ręcznie – Balanivash

+0

Jaki jest język skryptowy? Możesz oczywiście wywołać 'ssh' z dowolnego skryptu powłoki –

+0

Dzięki! To działa! – zero

-1

Możesz śledzić to podejście:

  • Połącz się ze zdalnym komputerem używając Oczekiwać Script. Jeśli twój komputer nie obsługuje oczekiwać, możesz pobrać to samo. Pisanie skryptu Expect jest bardzo proste (google, aby uzyskać pomoc w tym zakresie)
  • Umieść wszystkie działania, które należy wykonać na serwerze zdalnym w skrypcie powłoki.
  • Wywołaj skrypt zdalnej powłoki z oczekiwanego skryptu po pomyślnym zalogowaniu.
+0

Jak już wspomniałem w pytaniu, zdalne maszyny są tworzone w biegu i nie mam wcześniej żadnego skryptu w maszynie. – Balanivash

+0

W takim przypadku umieść wszystkie akcje w skrypcie oczekiwania. Oczekiwany skrypt może również uruchamiać polecenia na zdalnym hoście. –

4

Istnieje wiele sposobów na poradzenie sobie z tym.

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

Dzięki przekazanemu agentowi ssh możesz teraz logować się do każdego systemu bez hasła .

Co więcej, moduł pam będzie uwierzytelniał sudo za pomocą pary kluczy ssh, aby można było uruchamiać z uprawnieniami roota (lub dowolnego innego użytkownika) w razie potrzeby.

Nie musisz martwić się o interakcję z kluczem hosta. Jeśli wejście nie jest terminalem, wówczas ssh ograniczy jedynie możliwość przekazywania agentów i uwierzytelniania za pomocą haseł.

Powinieneś również zajrzeć do paczek like Capistrano. Zdecydowanie rozejrzyj się po tej stronie; ma wprowadzenie do zdalnego pisania skryptów.

Poszczególne linie skrypt może wyglądać mniej więcej tak:

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

Jeśli jesteś w stanie napisać kod Perl, wówczas należy rozważyć użycie Net::OpenSSH::Parallel.

Będziesz w stanie opisać działania, które należy uruchomić na każdym hoście w sposób deklaratywny, a moduł zajmie się wszystkimi przerażającymi szczegółami. Uruchamianie komend za pośrednictwem sudo jest również obsługiwane.

2

Zainstaluj sshpass przy użyciu, apt-get install sshpass, a następnie zmodyfikuj skrypt i umieść adresy IP komputerów, nazwy użytkownika i hasła w odpowiednich maszynach. Po tym uruchom ten skrypt. To jest 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 
+0

użyj $ SSHPASS, aby wyeksportować hasło, aby uniknąć wyświetlania w skrypcie. Ref: https://www.tecmint.com/sshpass-non-interactive-ssh-login-shell-script-ssh-password/ – Hexy

Powiązane problemy