GNU/Linux >> Linux Esercitazione >  >> Linux

Ssh – Script per automatizzare Scp in rete?

Ho una rete piena di macchine Linux. In questa rete ho un utente come utente1 con la password come password in tutte le macchine.

Ho il seguente script per inserire i file nella directory home di utente1 in tutte le macchine della rete.

#!/usr/bin/expect -f

# connect via scp
spawn cat /home/user1/Desktop/IPlistfile.txt | while read line do
spawn scp /home/user1/Desktop/filetobesent.txt [email protected]${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yesr"
exp_continue
}
-re ".*sword.*" {
exp_send "passwordr"
}
}
interact
done

Il problema è che ricevo un messaggio di errore come "can't read line. No such variable “. Tuttavia, se utilizzo direttamente un indirizzo IP invece della variabile di riga, sono in grado di trasferire il file.

Modifica :Il file IPlistfile.txt contiene l'elenco degli indirizzi IP nella mia rete. Ogni riga contiene un singolo indirizzo IP.

Risposta accettata:

Mi vengono in mente un paio di modi per farlo, ma consiglio vivamente di configurare ssh senza password accedi, mi ringrazierai più tardi.

1. Configura l'accesso senza password alle tue macchine.

Questo è di gran lunga il metodo migliore poiché sei obbligato a connetterti di nuovo alle macchine e questo ti semplificherà la vita. È anche molto, molto più sicuro delle altre opzioni anche se scegli di utilizzare una passphrase vuota poiché non lancerai password non crittografate.

Innanzitutto, crea un ssh pubblico chiave sulla tua macchina:

ssh-keygen -t rsa

Ti verrà richiesta una passphrase che ti verrà chiesto di inserire per la prima volta che esegui qualsiasi comando ssh dopo ogni accesso. Ciò significa che per più ssh o scp comandi, dovrai inserirlo solo una volta. Tuttavia, puoi lasciarlo vuoto per avere un accesso completamente senza password.

Dopo aver generato la tua chiave pubblica, copiala (come user1 ) su ogni computer della tua rete :

while read ip; do 
 ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip 
done < IPlistfile.txt

Dovrai inserire manualmente la password per ogni IP (a meno che tu non utilizzi una delle soluzioni seguenti anche per questo passaggio) ma una volta fatto, sarai in grado di copiare i file su una qualsiasi di queste macchine con un semplice:

while read ip; do
  scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Se hai sshpass installato, puoi automatizzarlo in modo da non dover digitare la password per ogni macchina:

SSHPASS='password'
while read ip; do
  sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

2. Installa sshpass

Questo è un piccolo programma ingegnoso che ti permette di passare un ssh password come parametro della riga di comando. Questa, ovviamente, non è una soluzione molto sicura e ti consiglio vivamente di leggere la sezione "Considerazioni sulla sicurezza" di man sshpass .

Ad ogni modo, è probabilmente disponibile nei repository della tua distribuzione, su sistemi basati su Debian può essere installato con

sudo apt-get install sshpass

Non posso controllare poiché non ho una macchina basata su RedHat ma per quanto posso dire dalla ricerca qui, dovrebbe essere installabile su Fedora con

sudo yum install sshpass

Una volta installato, puoi semplicemente eseguire

SSHPASS='password'
while read ip; do
  sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Il -e l'opzione dice a sshpass per ottenere la password da SSHPASS variabile. Questo è un po' più sicuro che assegnarlo come parametro con -p opzione.

Correlati:autorizzazioni SSH e home directory?

IMPORTANTE:

Questo fallirà silenziosamente se il server a cui ti stai connettendo è sconosciuto, se la sua chiave pubblica non è memorizzata nella tua macchina. Se questo non sembra funzionare, connettiti una volta (ssh o scp ) alla macchina remota e accetta la sua chiave pubblica.

3. Usa pscp invece

pscp è un'alternativa a scp che accetta la password come parametro della riga di comando. Sui sistemi basati su Debian, questo può essere installato con

sudo apt-get install putty-tools

Come ho detto prima, non posso controllare ma dovrebbe essere installabile su Fedora con

sudo yum install putty

Puoi quindi copiare i tuoi file con

while read ip; do
  pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Linux
  1. Errore nello script di conteggio per il numero di occorrenze?

  2. Comportamento imprevisto di uno script di shell?

  3. Ssh – Scp attraverso più host?

  4. 11 Utili comandi “ssh” e “scp” in Linux

  5. script user-data (cloud-init) non in esecuzione su EC2

Automatizza l'elaborazione delle immagini con questo script Bash

Come funziona SSH?

Installa e usa WinSCP

Spazi per le variabili nello script Bash?

Come eseguire lo Scp tramite una macchina intermedia??

Esecuzione di più thread scp contemporaneamente