scrivere uno script di shell in ssh su una macchina remota ed eseguire i comandi


97

Ho due domande:

  1. Ci sono più macchine Linux remote e ho bisogno di scrivere uno script di shell che eseguirà lo stesso insieme di comandi su ogni macchina. (Comprese alcune operazioni sudo). Come può essere fatto usando lo scripting della shell?
  2. Quando si esegue lo ssh sulla macchina remota, come gestire quando richiede l'autenticazione dell'impronta digitale RSA.

Le macchine remote sono VM create in corsa e io ho solo i loro IP. Quindi, non posso inserire un file di script in precedenza in quelle macchine ed eseguirli dalla mia macchina.


Penso di distribuire un programma simile a un agente in macchine Linux remote, che mantengono la connessione con il server tramite connessione socket di rete (o SSL) / tramite polling periodico al server.
Raptor

Devo eseguire una serie di comandi solo una volta, quindi non è necessario mantenere la connessione
Balanivash

"nessun script" significa "nessun file", suppongo? Come gestisci l'autenticazione? È possibile disabilitare il controllo dell'impronta digitale dell'host (vedere la mia risposta), ma si ottiene comunque una richiesta di password interattiva se non è stata impostata una chiave pubblica / privata.
Andreas Fester

1
Andreas: sì. nessun file. il prompt di passwd può essere gestito usando expectcome `si aspetta" ? assword: "`
Balanivash

Risposte:


142

Ci sono più macchine Linux remote e ho bisogno di scrivere uno script di shell che eseguirà lo stesso insieme di comandi su ogni macchina. (Comprese alcune operazioni sudo). Come può essere fatto usando lo scripting della shell?

Puoi farlo con ssh, ad esempio:

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

Quando si esegue lo ssh sulla macchina remota, come gestire quando richiede l'autenticazione dell'impronta digitale RSA.

Puoi aggiungere l' StrictHostKeyChecking=noopzione a ssh:

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

Ciò disabiliterà il controllo della chiave host e aggiungerà automaticamente la chiave host all'elenco degli host noti. Se non desideri che l'host venga aggiunto al file hosts noto, aggiungi l'opzione -o UserKnownHostsFile=/dev/null.

Notare che questo disabilita alcuni controlli di sicurezza , ad esempio la protezione contro gli attacchi man-in-the-middle. Pertanto, non dovrebbe essere applicato in un ambiente sensibile alla sicurezza.


Qual è il linguaggio di scripting? Ovviamente puoi anche chiamare sshda qualsiasi script di shell
Andreas Fester

che ne dici se vuoi anche fare un CTRL + C e continuare ssh su più server ?. ad esempio in alcuni server viene richiesta la password e in altri no, quindi lo script si bloccherà lì. c'è un modo per fare qualcosa di simile a -o per fare un CTRL c o CTRL d?
Chanafot il

5

Esistono diversi modi per gestirlo.

Il mio modo preferito è installare http://pamsshagentauth.sourceforge.net/ sui sistemi remoti e anche la tua chiave pubblica. (Trova un modo per installarli sulla VM, in qualche modo hai installato un intero sistema Unix, cosa sono un paio di file in più?)

Con il tuo agente ssh inoltrato, ora puoi accedere a ogni sistema senza password.

E ancora meglio, quel modulo pam si autenticherà per sudo con la tua coppia di chiavi ssh in modo che tu possa eseguire con i diritti di root (o di qualsiasi altro utente) secondo necessità.

Non devi preoccuparti dell'interazione con la chiave host. Se l'input non è un terminale, ssh limiterà solo la tua capacità di inoltrare agenti e autenticarsi con password.

Dovresti anche esaminare pacchetti come Capistrano. Sicuramente guardati intorno in quel sito; ha un'introduzione allo scripting remoto.

Le singole righe di script potrebbero avere un aspetto simile a questo:

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

4

Installa sshpass usando, apt-get install sshpassquindi modifica lo script e metti IP, nomi utente e password della tua macchina Linux nel rispettivo ordine. Dopo di che eseguire lo script. Questo è tutto ! Questo script installerà VLC in tutti i sistemi.

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

usa $ SSHPASS per esportare la password per evitare di essere mostrata nello script. Rif: tecmint.com/…
Hexy

2

Se sei in grado di scrivere codice Perl, dovresti considerare l'utilizzo di Net :: OpenSSH :: Parallel .

Saresti in grado di descrivere le azioni che devono essere eseguite in ogni host in modo dichiarativo e il modulo si prenderà cura di tutti i dettagli spaventosi. sudoÈ supportato anche l' esecuzione di comandi .


2

Questo lavoro per me.

Sintassi: ssh -i pemfile.pem nome_utente @ indirizzo_ip 'comando_1; comando 2; comando 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

Per questo tipo di attività, utilizzo ripetutamente Ansible che consente di duplicare in modo coerente gli script bash in diversi contenitori o VM. Ansible (più precisamente Red Hat ) ora ha un'interfaccia web aggiuntiva AWX che è l'edizione open-source della loro torre commerciale.

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible Tower: prodotto commerciale, probabilmente esplorerai per primo l'AWX open-source gratuito, piuttosto che il percorso gratuito di 15 giorni di Torre


1

Esistono diversi modi per eseguire i comandi o gli script su più macchine Linux remote. Un modo semplice e più semplice è tramite pssh (programma ssh parallelo)

pssh : è un programma per eseguire ssh in parallelo su un numero di host. Fornisce funzionalità come l'invio di input a tutti i processi, il passaggio di una password a ssh, il salvataggio dell'output su file e il timeout.

Esempio e utilizzo:

connettersi a host1 e host2 e stampare "hello, world" da ciascuno:

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

Esegui comandi tramite uno script su più server:

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

Usa ed esegui un comando senza controllare o salvare le chiavi host:

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

Se il file hosts.txt ha un numero elevato di voci, ad esempio 100, l'opzione parallelismo può anche essere impostata su 100 per garantire che i comandi vengano eseguiti contemporaneamente:

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

Opzioni :
-I : legge l' input e invia a ogni processo ssh.
-P: dice a pssh di visualizzare l'output non appena arriva.
-h: legge il file dell'host.
-H: [utente @] host [: porta] per host singolo.
-i: Visualizza l'output standard e l'errore standard al completamento di ogni host
-x args: Passa argomenti extra della riga di comando SSH
-o opzione: può essere utilizzata per fornire opzioni nel formato utilizzato nel file di configurazione. (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p parallelismo: utilizza il numero specificato come numero massimo di connessioni simultanee
-q Modalità silenziosa: causa l'eliminazione della maggior parte dei messaggi di avviso e di diagnostica.
-t: fa scadere le connessioni dopo il numero di secondi specificato. 0 significa che pssh non interromperà alcuna connessione

Quando si esegue lo ssh sulla macchina remota, come gestire quando richiede l'autenticazione dell'impronta digitale RSA.

Disabilita StrictHostKeyChecking per gestire il prompt di autenticazione RSA.
-o StrictHostKeyChecking = no

Fonte : man pssh


0

Questo ha funzionato per me. Ho creato una funzione. Metti questo nel tuo script di shell:

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

sshcmd USER HOST COMMAND

Se si dispone di più macchine su cui si desidera eseguire lo stesso comando, è necessario ripetere quella riga con un punto e virgola. Ad esempio, se hai due macchine, faresti questo:

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

Sostituisci USER con l'utente del computer. Sostituisci HOST con il nome del computer. Sostituisci COMANDO con il comando che vuoi eseguire sul computer.

Spero che questo ti aiuti!


-1

Puoi seguire questo approccio:

  • Connettiti alla macchina remota utilizzando Expect Script . Se la tua macchina non supporta, aspettati di poter scaricare lo stesso. Scrivere lo script Expect è molto semplice (google per ottenere aiuto su questo)
  • Metti tutte le azioni che devono essere eseguite sul server remoto in uno script di shell.
  • Richiama lo script della shell remota dallo script previsto una volta che il login è riuscito.

Come ho accennato nella domanda, le macchine remote vengono create in esecuzione e non posso avere alcuno script nella macchina in anticipo.
Balanivash

In tal caso, inserire tutte le azioni nello script Expect. Expect script può eseguire comandi anche su host remoto.
rai.skumar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.