web-dev-qa-db-ja.com

ネットワークでscpを自動化するスクリプト

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アドレスが含まれています。

3
Ramesh

これを行う方法はいくつか考えられますが、パスワードなしのsshアクセスを設定することを強くお勧めします。後で感謝します。

1.マシンへのパスワードなしのアクセスを設定します。

これは、マシンに再び接続する必要があるため、断然最良の方法であり、これにより人生がはるかに簡単になります。また、暗号化されていない状態でパスワードを投げないため、空のパスフレーズを使用することを選択した場合でも、他のオプションよりもはるかに安全です。

まず、マシンに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

2.インストール 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)接続し、その公開鍵を受け入れます。

3.代わりに 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
6
terdon

これをチェックしてください http://www.edwardawebb.com/web-development/keys-PuTTY-cygwin-passwordless-login-ssh-scp 、多くのサーバーで簡単に実行できるスクリプトがあります。

0
Gustavo