Linuxマシンでいっぱいのネットワークがあります。このネットワークには、 user1というユーザーがいます。 パスワードをパスワードとして すべてのマシンで。
user1のホームディレクトリにファイルを配置するための次のスクリプトがあります ネットワークのすべてのマシンで。
#!/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
問題は、「can't read line. No such variable
「。ただし、回線変数の代わりにIPアドレスを直接使用すると、ファイルを転送できます。
編集 :IPlistfile.txtには、ネットワーク内のIPアドレスのリストが含まれています。各行には単一のIPアドレスが含まれています。
承認された回答:
これを行うにはいくつかの方法が考えられますが、パスワードなしのssh
を設定することを強くお勧めします。 アクセス、後で私に感謝します。
1。マシンへのパスワードなしのアクセスを設定します。
これは、マシンに再度接続する必要があるため、これがはるかに最良の方法であり、これにより、作業がはるかに楽になります。また、暗号化されていないパスワードを投げかけることがないため、空のパスフレーズを使用することを選択した場合でも、他のオプションよりもはるかに安全です。
まず、パブリックssh
を作成します マシンのキー:
ssh-keygen -t rsa
最初のを入力するように求められるパスフレーズを求められます ログインするたびにsshコマンドを実行する時間。これは、複数のssh
の場合を意味します またはscp
コマンドを入力する必要があるのは1回だけです。それでも、完全にパスワードなしでアクセスできるように、空のままにしておくことができます。
公開鍵を生成したら、それをコピーします(user1
として) )ネットワーク内の各コンピューターへ:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip
done < IPlistfile.txt
各IPのパスワードを手動で入力する必要があります(この手順でも以下の解決策のいずれかを使用する場合を除く)が、一度入力すると、次の簡単な方法でこれらのマシンのいずれかにファイルをコピーできるようになります。
while read ip; do
scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
sshpass
をお持ちの場合 インストールすると、これを自動化できるため、マシンごとにパスワードを入力する必要がありません。
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
2。 sshpass
をインストールします
これは、ssh
を渡すことができる気の利いた小さなプログラムです。 コマンドラインパラメータとしてのパスワード。これは明らかに安全性の高いソリューションではないため、man sshpass
の「セキュリティに関する考慮事項」セクションを読むことを強くお勧めします。 。
とにかく、それはおそらくあなたのディストリビューションのリポジトリで利用可能であり、Debianベースのシステムではそれをインストールすることができます
sudo apt-get install sshpass
RedHatベースのマシンを持っていないため確認できませんが、ここで検索するとわかる限り、Fedoraにインストールできるはずです
sudo yum install sshpass
インストールしたら、簡単に実行できます
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
-e
オプションはsshpass
に指示します SSHPASS
からパスワードを取得するには 変数。これは、-p
を使用してパラメーターとして指定するよりも少し安全です。 オプション。
重要:
接続しているサーバーが不明で、その公開鍵がマシンに保存されていない場合、これはサイレントに失敗します。これが機能していないように思われる場合は、一度接続するだけです(ssh
またはscp
)リモートマシンに送信し、その公開鍵を受け入れます。
3。 pscp
を使用する 代わりに
pscp
scp
の代替です これは、パスワードをコマンドラインパラメーターとして受け入れます。 Debianベースのシステムでは、これは
sudo apt-get install putty-tools
前に言ったように、確認することはできませんが、Fedoraにインストールできるはずです
sudo yum install putty
その後、
を使用してファイルをコピーできます。while read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt