Linuxマシンでいっぱいのネットワークがあります。このネットワークでは、すべてのマシンでser1としてユーザーを使用し、パスワードとしてpasswordを使用しています。
ネットワークのすべてのマシンのser1のホームディレクトリにファイルを配置する次のスクリプトがあります。
#!/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 user1@${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "password\r"
}
}
interact
done
問題は、「can't read line. No such variable
"。ただし、line変数の代わりにIPアドレスを直接使用すると、ファイルを転送できます。
編集:IPlistfile.txtには、ネットワーク内のIPアドレスのリストが含まれています。各行には単一のIPアドレスが含まれています。
これを行う方法はいくつか考えられますが、パスワードなしのssh
アクセスを設定することを強くお勧めします。後で感謝します。
これは、マシンに再び接続する必要があるため、断然最良の方法であり、これにより人生がはるかに簡単になります。また、暗号化されていない状態でパスワードを投げないため、空のパスフレーズを使用することを選択した場合でも、他のオプションよりもはるかに安全です。
まず、マシンにssh
公開鍵を作成します。
ssh-keygen -t rsa
各ログイン後にsshコマンドを実行するfirst時間を入力するように求められるパスフレーズを求められます。これは、複数のssh
またはscp
コマンドの場合、一度だけ入力する必要があることを意味します。それでも、完全にパスワードなしでアクセスできるように、空のままにしておくことができます。
公開鍵を生成したら、それを(user1
として)ネットワーク内の各コンピューターにコピーします。
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
各IPのパスワードを手動で入力する必要があります(この手順で以下のソリューションのいずれかを使用する場合を除く)。ただし、これを実行すると、簡単な方法でファイルをこれらのマシンのいずれかにコピーできます。
while read ip; do
scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
sshpass
をインストールしている場合は、これを自動化できるため、各マシンのパスワードを入力する必要はありません。
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
sshpass
これは、コマンドラインパラメータとしてssh
パスワードを渡すことができる気の利いた小さなプログラムです。これは明らかに非常に安全なソリューションではありません。man sshpass
の「セキュリティに関する考慮事項」セクションを読むことを強くお勧めします。
とにかく、それはおそらくあなたのディストリビューションのリポジトリで利用可能です。Debianベースのシステムでは、
Sudo apt-get install sshpass
RedHatベースのマシンを持っていないので確認できませんが、検索からわかる限り here で、Fedoraにインストールできます
Sudo yum install sshpass
インストールしたら、簡単に実行できます
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
-e
オプションは、sshpass
変数からパスワードを取得するようにSSHPASS
に指示します。これは、-p
オプションを使用してパラメーターとして指定するよりも少し安全です。
接続先のサーバーが不明で、公開鍵がマシンに保存されていない場合、これは警告なしに失敗します。これが機能していないように見える場合は、リモートマシンに1回(ssh
またはscp
)接続し、その公開鍵を受け入れます。
pscp
を使用しますpscp
は、パスワードをコマンドラインパラメータとして受け入れるscp
の代替です。 Debianベースのシステムでは、これは
Sudo apt-get install PuTTY-tools
前に言ったように、私はチェックできませんが、Fedoraでは installable でなければなりません
Sudo yum install PuTTY
次に、ファイルをコピーできます
while read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt user1@$ip:~/Desktop
done < IPlistfile.txt
これをチェックしてください http://www.edwardawebb.com/web-development/keys-PuTTY-cygwin-passwordless-login-ssh-scp 、多くのサーバーで簡単に実行できるスクリプトがあります。