スクリプトはsshを呼び出してローカルシステムにログを生成しようとします。

スクリプトはsshを呼び出してローカルシステムにログを生成しようとします。

にリストされているすべてのサーバーにログインするためのスクリプトを生成する必要があります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ができます)。sshControlPersistssh

したがって、次のような結果が出ます(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 somethingpgrep以前の定型句を使用する代わりにpkill。これは標準coreutilsであるため、非常に古いシステムを使用しない限り正常に動作します。

おすすめ記事