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.
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