Mám síť plnou linuxových strojů. V této síti mám uživatele jako uživatel1 s heslem jako heslo ve všech strojích.
Mám následující skript k umístění souborů do domovského adresáře user1 ve všech počítačích v síti.
#!/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
Problém je v tom, že se mi zobrazuje chybová zpráva „can't read line. No such variable
“. Pokud však místo proměnné řádku použiji přímo IP adresu, jsem schopen přenést soubor.
Upravit :Soubor IPlistfile.txt obsahuje seznam IP adres v mé síti. Každý řádek obsahuje jednu IP adresu.
Přijatá odpověď:
Napadá mě několik způsobů, jak to udělat, ale velmi doporučuji nastavit ssh
bez hesla přístup, poděkujete mi později.
1. Nastavte přístup ke svým počítačům bez hesla.
Toto je zdaleka nejlepší metoda, protože se budete chtít znovu připojit ke strojům, což vám výrazně usnadní život. Je také mnohem, mnohem bezpečnější než ostatní možnosti, i když se rozhodnete použít prázdnou přístupovou frázi, protože nebudete házet hesla nezašifrovaná.
Nejprve vytvořte veřejný ssh
klíč na vašem počítači:
ssh-keygen -t rsa
Budete požádáni o heslo, které budete požádáni o zadání prvního čas, kdy po každém přihlášení spustíte jakýkoli příkaz ssh. To znamená, že pro více ssh
nebo scp
příkazy, budete jej muset zadat pouze jednou. Můžete jej však nechat prázdné, abyste měli přístup zcela bez hesla.
Jakmile vygenerujete svůj veřejný klíč, zkopírujte jej (jako user1
) ke každému počítači ve vaší síti:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip
done < IPlistfile.txt
Budete muset ručně zadat heslo pro každou IP (pokud pro tento krok nepoužijete jedno z níže uvedených řešení), ale jakmile to uděláte, budete moci kopírovat soubory na kterýkoli z těchto počítačů pomocí jednoduchého:
while read ip; do
scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
Pokud máte sshpass
nainstalován, můžete to automatizovat, takže nemusíte zadávat heslo pro každý počítač:
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
2. Nainstalujte sshpass
Toto je šikovný malý program, který vám umožní předat ssh
heslo jako parametr příkazového řádku. Toto zjevně není příliš bezpečné řešení a vřele doporučuji, abyste si přečetli část „Bezpečnostní otázky“ man sshpass
.
Každopádně je pravděpodobně k dispozici v repozitářích vaší distribuce, na systémech založených na Debianu jej lze nainstalovat pomocí
sudo apt-get install sshpass
Nemohu to zkontrolovat, protože nemám stroj založený na RedHat, ale pokud mohu zjistit z vyhledávání zde, měl by být instalovatelný na Fedoru pomocí
sudo yum install sshpass
Jakmile jej nainstalujete, můžete jednoduše spustit
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
-e
volba říká sshpass
získat heslo z SSHPASS
variabilní. Je to o něco bezpečnější, než když to dáváte jako parametr pomocí -p
možnost.
DŮLEŽITÉ:
To se tiše nezdaří, pokud je server, ke kterému se připojujete, neznámý, pokud jeho veřejný klíč není uložen ve vašem počítači. Pokud se vám zdá, že to nefunguje, stačí se připojit jednou (ssh
nebo scp
) ke vzdálenému počítači a přijměte jeho veřejný klíč.
3. Použijte pscp
místo
pscp
je alternativou k scp
který přijímá heslo jako parametr příkazového řádku. Na systémech založených na Debianu to lze nainstalovat pomocí
sudo apt-get install putty-tools
Jak jsem řekl dříve, nemohu to zkontrolovat, ale mělo by být možné nainstalovat na Fedoru pomocí
sudo yum install putty
Soubory pak můžete zkopírovat pomocí
while read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt