私の使命は、約300台のデバイスにログインし、次のコマンドを実行して出力をファイルにコピーすることです。
SSHはログイン方法として使用でき、事前定義されたユーザー名とパスワードを提供できます。
デバイスを使用すると、エキスパートモードにログインし、事前定義されたパスワードを入力する必要があります。
$ expert
>>> provide password
$ lspci | egrep -i --color 'network|ethernet'
出力をファイルにコピー
次のスクリプトを準備しました。
#!/bin/bash
username=XXXX
passwd=XXX
cd /tmp
for host in `cat servers.txt`;
do
ssh $username@$host $passwd;
expert
echo "### $host ###" >> output.txt
lspci | egrep -i --color 'network|ethernet' >> output.txt
done
パスワードの入力を求められたら、次の情報が表示されます。
Running commands is not allowed
./fibertest.sh: line 9: expert: command not found
コマンドをリモートで実行するのではなく、ローカルコンピュータで実行しているようです。
答え1
あなたは与えることができますpssh(並列SSHとも呼ばれる)一度試してみてください。複数のコンピュータでコマンドを実行し、ローカルフォルダから結果/出力を取得します。
答え2
Expectを試してください。 Expectは、リモートシステムと対話する目的(ただし、実際にはリモートコマンドや出力解析などのものとやり取りするなど)のために作成されたtclベースの言語です。
非常に簡単な期待スクリプトを作成し、多くを達成することができます。試してみてください。 PerlとPython用のモジュールもあるので、その言語でスクリプトを書いたい場合はそれを行うことができます。
ここではExpectの本当に良いチュートリアルのリストです。http://wiki.tcl.tk/11584
私はExpectを使用して、約40台のサーバー、さまざまな管理タスク、定義された間隔でコマンド出力を収集するなどを管理しています。
たとえば、コンピュータがSSHキー認証を使用せずにsshpassなどのプログラムを使用したくない場合でも、スクリプトを介して(人との対話なしで自動的に)ログインできるようにしたい場合に最適です。これは単なる例ですが、Expectはそれよりはるかに強力です。
答え3
SSHを使用してサーバー上でコマンドを実行するには、SSHコマンドと同じ行にコマンドを入力する必要があります。
はい
編集:しばらくすると、サーバーはそれをコマンドとして実行しようとしたため、sshコマンドから$ passwordを削除しました。パスワードを取得するには、SSHキーを設定するか、それをExpectスクリプトと組み合わせる必要があります。
ssh $username@$host "expert; echo \"### $host ###\" >> output.txt; lspci | egrep -i --color 'network|ethernet' >> output.txt; scp output.txt $ADMIN_SERVER:$host-output.txt"
cat *-output.txt > output.txt
このコード行は少し長いですが、コマンドを引用符で囲み、セミコロンで区切るだけです。このとき、内部コマンドで使用されている引用符をエスケープする必要があります。また、スクリプトフォームを実行するたびに出力ファイルを管理サーバーにコピーしてから、すべてリンクする必要があることに注意してください。