Saya memiliki jaringan yang penuh dengan mesin Linux. Di jaringan ini, saya memiliki pengguna sebagai pengguna1 dengan sandi sebagai sandi di semua mesin.
Saya memiliki skrip berikut untuk meletakkan file di direktori home user1 di semua mesin jaringan.
#!/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
Masalahnya adalah saya mendapatkan pesan kesalahan karena “can't read line. No such variable
“. Namun, jika saya menggunakan alamat IP secara langsung alih-alih variabel baris, saya dapat mentransfer file.
Sunting :IPlistfile.txt berisi daftar alamat IP di jaringan saya. Setiap baris berisi satu alamat IP.
Jawaban yang Diterima:
Saya dapat memikirkan beberapa cara untuk melakukan ini, tetapi saya sangat menyarankan untuk menyiapkan ssh
less tanpa kata sandi akses, Anda akan berterima kasih kepada saya nanti.
1. Siapkan akses tanpa kata sandi ke mesin Anda.
Sejauh ini, ini adalah metode terbaik karena Anda pasti ingin terhubung ke mesin lagi dan ini akan membuat hidup Anda lebih mudah. Ini juga jauh, jauh lebih aman daripada opsi lain bahkan jika Anda memilih untuk menggunakan frasa sandi kosong karena Anda tidak akan membuang kata sandi yang tidak terenkripsi.
Pertama, buat ssh
public publik kunci pada mesin Anda:
ssh-keygen -t rsa
Anda akan dimintai kata sandi yang akan diminta untuk Anda masukkan pertama kali Anda menjalankan perintah ssh setelah setiap login. Ini berarti bahwa untuk beberapa ssh
atau scp
perintah, Anda hanya perlu memasukkannya sekali. Namun demikian, Anda dapat membiarkannya kosong untuk mendapatkan akses tanpa kata sandi sepenuhnya.
Setelah Anda membuat kunci publik, salin (sebagai user1
) ke setiap komputer di jaringan Anda :
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip
done < IPlistfile.txt
Anda harus memasukkan kata sandi untuk setiap IP secara manual (kecuali jika Anda menggunakan salah satu solusi di bawah ini untuk langkah ini juga) tetapi setelah Anda melakukannya, Anda akan dapat menyalin file ke salah satu mesin ini dengan sederhana:
while read ip; do
scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
Jika Anda memiliki sshpass
diinstal, Anda dapat mengotomatiskannya sehingga Anda tidak perlu mengetikkan sandi untuk setiap mesin:
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
2. Instal sshpass
Ini adalah program kecil yang bagus yang memungkinkan Anda untuk melewatkan ssh
password sebagai parameter baris perintah. Ini, jelas, bukan solusi yang sangat aman dan saya sangat menyarankan Anda membaca bagian "Pertimbangan Keamanan" dari man sshpass
.
Bagaimanapun, ini mungkin tersedia di repositori distribusi Anda, pada sistem berbasis Debian dapat diinstal dengan
sudo apt-get install sshpass
Saya tidak dapat memeriksa karena saya tidak memiliki mesin berbasis RedHat tetapi sejauh yang saya tahu dari pencarian di sini, itu harus dapat diinstal di Fedora dengan
sudo yum install sshpass
Setelah Anda menginstalnya, Anda cukup menjalankannya
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
-e
opsi memberitahu sshpass
untuk mendapatkan kata sandi dari SSHPASS
variabel. Ini sedikit lebih aman daripada memberikannya sebagai parameter dengan -p
pilihan.
PENTING:
Ini akan gagal secara diam-diam jika server yang Anda sambungkan tidak diketahui, jika kunci publiknya tidak disimpan di mesin Anda. Jika ini tampaknya tidak berhasil, cukup sambungkan sekali (ssh
atau scp
) ke mesin jarak jauh dan menerima kunci publiknya.
3. Gunakan pscp
sebagai gantinya
pscp
adalah alternatif untuk scp
yang menerima kata sandi sebagai parameter baris perintah. Pada sistem berbasis Debian, ini dapat diinstal dengan
sudo apt-get install putty-tools
Seperti yang saya katakan sebelumnya, saya tidak dapat memeriksanya tetapi harus dapat diinstal di Fedora dengan
sudo yum install putty
Anda kemudian dapat menyalin file Anda dengan
while read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt