
にリストされているすべてのサーバーにログインするスクリプトを作成する必要がありますservers.txt
。パスワードを使用し、パスワードなしは使用しません。ログイン後、変数を設定してif
- then
- を実行する必要がありますelse
。作業が完了したら、リモート マシンではなく、ローカル マシンにファイルを作成する必要があります。(ローカル) ファイルには、特定のプロセスが実行されていなかったマシンのホスト名が含まれます。
一般的な考え方は次のとおりです。
#!/bin/bash
while read line
do
sshpass -p ******** ssh "mydomain1\admin1"@$line bash -s << EOF
pwd=*********
var=$"(ps -ef | grep http | grep -v grep | wc -l)"
if (( var > 0 ))
then
echo "$pwd" | sudo -S ps -ef | grep patrol | grep -v grep | awk '{print $2}' | xargs kill
echo "$pwd" | sudo -S rm -rf /data/abc /etc/efg
#need to create the log on local machine, not on remote machine
hostname >> /find.txt
else
#need to create the log on local machine, not on the remote machine
hostname >> /agentnotthere.txt
fi
EOF
#servers.txt contains server names
done < servers.txt
明らかに、上記の 5 行目から 16 行目は、リモート ホストで実行するコマンドを含む here ドキュメントを形成します。その here ドキュメントには、コマンドhostname >> /find.txt
とがありますhostname >> /agentnotthere.txt
。導入段落で述べたように、またコード内のコメントでも述べたように、(リモート) ホスト名は、リモート マシン上のファイルではなく、ローカル ファイルに書き込まれる必要があります。明らかに、リモート マシン上のコマンドはファイルに書き込まれます。command >> filename
リモートマシン上。
ssh
リモート マシンでいくつかのコマンドを実行するスクリプトを使用して、リモート マシンで実行されたテストの結果に基づいてローカル ファイルに出力を書き込むにはどうすればよいですか?
答え1
あなたが望んでいること、つまりリモート マシンで実行されているスクリプトとは別のファイルに書き込むという作業を簡単に実行できる方法はないと思います。
ただし、スクリプトの出力を 1 つのローカル ファイルに簡単にパイプできます。
ssh host << EOF > output_file
some commands
to be executed
EOF
これにより、スクリプトを再構築してssh
複数回実行することができます (これによりオーバーヘッドが増加しますが、構成ファイルで をssh
使用することでその大部分を軽減できます)。ControlPersist
ssh
代わりに、次のようなものになります (疑似 bash):
echo "get the output of var script" | ssh host > var_value
if var read from the file is more than zero; then
echo "the thing you want" | ssh host >> /find.txt
else
echo "the other thing you want" | ssh host >> /agentnotthere.txt
fi
これはあなたのユースケースにぴったり合うはずです :)
スクリプト自体についての私の意見:
- このタスクには、bashスクリプトを書くよりも、Ansibleや他の構成管理ツールの方が適している可能性があります。
- セキュリティの観点から、キー認証の代わりに SSH パスワードを使用することは良くありません。しかし、会社のポリシーや、それをサポートしていない古い組み込みのものなどの理由で、それを実装できない状況に遭遇したことがあります。
- 古い定型句を使用する代わりに、と を
ps aux | grep -v grep | grep something
使用できます。これらは標準 にあるため、非常に古いシステムを使用しない限り、使用できるはずです。pgrep
pkill
coreutils