0

次のスクリプトをまとめました。

ssh -2 -l root devserver "cd /var/log/httpd; ls | grep -v 'gz' | xargs -- tail -n 15"

これは devserver にログオンし、chagnes ディレクトリを httpd ログに記録し、それらを一覧表示し、圧縮された何百もの履歴ローテーションを削除し、これを末尾にパイプします。

どのようなエラーが発生しているかを簡単に確認できます。これは、自分で ssh し、コマンドを引用符で囲んで実行すると機能します。ただし、これをスクリプトとして使用すると、プロダクションからの出力が文字化けし、開発者に通知が表示されます。出力を単純なテキストではなくコマンドのように扱っているようです。

私はいくつかのエスケープまたは何かが欠けていると確信しています。

注: - 通常の ssh ユーザーでは httpd ログを読み取ることができないため、root として SSH 接続します。-問題のディレクトリにいなかったときに、grepからパイプされたファイルをtailが見つけられなかったためです。

4

2 に答える 2

3

使用されているインタープリターを確認するには:

ssh risdevo0196 'echo $0'

ksh の場合:

tail -n 15 /var/log/httpd/!(*gz)

バッシュの場合

shopt -s extglob; tail -n 15 /var/log/httpd/!(*gz)

ただし、引数のリストが長すぎる場合は、find を使用する必要があります。

find /var/log/httpd/ \! -name '*gz' -exec tail -n 15 {} +
于 2012-10-29T09:16:49.487 に答える
1

findあなたの目標のために、回避策よりも簡単で良いと思いますls

ssh -2 -l root devserver 'find /var/log/httpd/ -type f ! -name "*.gz" -print0 | xargs -0 tail -n 15'

また

echo '
    find /var/log/httpd/ -type f ! -name "*.gz" -print0 |
        xargs -0 tail -n 15
  ' | ssh -2 -l root devserver

発生しているエラーの種類を簡単に確認したいので、私が時々使用する小さな方法があります: (警告: ログファイルが大きい場合、これはやり過ぎになる可能性があります。注意してください!!)

echo '
    find /var/log/httpd/ -type f ! -name "*.gz" -print0 |
        xargs -0 cat |
        sed -ne 's/^.\{20\}[^:]*://p' |
        sort |
        uniq -c |
        sort -n |
        tail -n 30
  ' | ssh -2 -l root devserver
于 2012-10-29T09:03:21.797 に答える