ssh(stderr および stdout) の出力を別のコマンドにパイプします。

ssh(stderr および stdout) の出力を別のコマンドにパイプします。

私はsshとrsyncに関連する一種のバックアップ用のスクリプトを書いています。スクリプトを実行するたびに、すべての出力をログファイルにリダイレクトします。ログエントリを標準化するために、タイムスタンプとログレベルを追加するログ関数を作成しました。私の考えは、各コマンドラインのstdoutとstderrを1行ずつ読み、対応するログ関数を呼び出すことです。だから以下の答えに従いました。https://serverfault.com/questions/526592/pipe-stderr-and-stdout-to- Different-commands-not-just-to-files

私のスクリプトは次のとおりです(使用されているすべての変数が正しく設定されていると仮定すると縮小されます)。

#!/bin/bash

# function: print a formatted log message including timestamp with given level and message to stdout 
# arguments: <LEVEL> <MESSAGE>
log()
{
    timestamp=$(date +"%F %T.%3N")
    level=$1
    message=$2
    echo $timestamp $level: $message
}

# function: read command output from stdin and log it with given level
# arguments: <LEVEL>
logoutput()
{
    sed 1d | \
    while read i
    do
        log "$1" "$i"
    done
}

log INFO "START ssh"
(ssh $connection mkdir -p $destStaticDirectory | logoutput INFO) 3>&1 1>&2 2>&3 | logoutput ERROR

log INFO "START rsync"
(rsync $rsyncArguments $linkDest $fromDirectory $connection:$destStaticDirectory | logoutput INFO) 3>&1 1>&2 2>&3 | logoutput ERROR

この機能はlog()ログエントリをエコーするために使用され、この機能は1行ずつ読み込み、各行を記録するために使用さlogoutput()れます。stdout

これで問題は、すべてがrsyncコマンドによって期待どおりに機能することです。しかし、sshコマンドでは機能しません。ssh $connection mkdir -p $destStaticDirectory正しく呼び出されると、stdoutに出力がないことがわかります。だから私はsshを未知のホストに接続してテストしましたが、結果はssh: Could not resolve hostname XXX: Name or service not known...しかし何もありません。また、すべての出力を期待どおりに印刷する同じsshコマンド "unwrapped"をスクリプトに追加しました。最後に、SSHの詳細モードをオンにしてエラーログエントリが発生しました。しかし、私のログにSSHのバグメッセージが表示されたくないので、これはオプションではありません。

私は何を逃したことがありませんか? sshが行うのと同じ奇妙なstdout、err処理がありますが、私が知らないのでしょうか?私がやろうとしていることが明らかになったことを願っています。

ベストアンサー1

問題は、「sed 1d」が探している出力を削除するログ出力機能で発生する可能性が高いです。 「sed 1d」行を削除し、スクリプトが期待どおりに実行されていることを確認してください。

おすすめ記事