にリストされているすべてのサーバーにログインするためのスクリプトを生成する必要があります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ドキュメントを構成します。この記事では、はじめに段落とhostname >> /find.txt
コードhostname >> /agentnotthere.txt
のコメントに記載されているように、(リモート)ホスト名をリモートコンピュータのファイルではなくローカルファイルに書き込むことを望みます。明らかに、リモートシステムからのコマンドがファイルに書き込まれます。command >> filename
リモートコンピュータから。
ssh
リモートシステムでいくつかのコマンドを実行するために使用されるスクリプトが、リモートシステムで実行されたテスト結果に基づいてローカルファイルに出力を書き込むようにするにはどうすればよいですか。
ベストアンサー1
欲しいものを達成する簡単な方法はないと思います。これは、リモートシステムで実行されるスクリプトとは別に、ローカルホストにファイルを作成することを意味します。
ただし、スクリプト出力をローカルファイルに簡単にパイプできます。
ssh host << EOF > output_file
some commands
to be executed
EOF
これにより、スクリプトを複数回実行するように再構成できます(これによりオーバーヘッドが追加されますが、構成ファイルでこれを使用するとほとんどを減らすことssh
ができます)。ssh
ControlPersist
ssh
したがって、次のような結果が出ます(pseudo-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
これはあなたのユースケースでうまく機能します:)
スクリプト自体に関する私の2つの考え:
- これには、bashスクリプトを作成するよりも、Ansibleまたは他の構成管理ツールのいずれかが適しています。
- セキュリティの観点から、鍵認証の代わりにSSHパスワードを使用することはお勧めできません。しかし、会社の方針/これをサポートしていない古い埋め込みコンテンツなどのため、これが不可能な状況に直面しました。
ps aux | grep -v grep | grep something
pgrep
以前の定型句を使用する代わりにpkill
。これは標準coreutils
であるため、非常に古いシステムを使用しない限り正常に動作します。