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 ドキュメントを形成します。その 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使用することでその大部分を軽減できます)。ControlPersistssh

代わりに、次のようなものになります (疑似 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使用できます。これらは標準 にあるため、非常に古いシステムを使用しない限り、使用できるはずです。pgreppkillcoreutils

関連情報