SSH戻りコードの状態とエラー処理

SSH戻りコードの状態とエラー処理

SSHを使ってリモートサーバーのファイル数が0であることを確認したいと思います。

以下のコードはファイルのみを確認します(.dmpで終わるファイルが存在します)。

if ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp
    then
      echo "Files still exist after cleanup"
      exit -9991
    else
      echo "Files cleaned up"
   fi

以下の "then" 部分は、実際のエラーが "ls: could access /apps/oracle/home/DB_1201/*.dmp: No such file or Directory" の場合 $?=0 として実行されます。

if [ `ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp | wc -l` -eq 0 ]
   then
      echo  "[INFO  ] Dumps Files Cleaned Up on Remote Host"
    else
      echo  "[ERROR ] issue in Remote Host"
      exit -9992
fi  

"ls /apps/oracle/home/DB_1201/*.dmp |wc -l" 0 または N 番号を出力する必要があります。ディレクトリが存在しない場合(該当するファイルやディレクトリはありません)

ファイル数0または28を返すか、ディレクトリが見つかりませんエラーをキャッチする必要があります。

SCPを実行し、後でステータスを確認する正しい方法を教えてください。

ローカルサーバーの最後のコマンド状態を取得している間にいくつかのエラーが発生しても、以下は常に0を返します。

   scp -rp /apps/oracle/home/DB_1201/*.dmp      oracle@v0021x91:/apps/oracle/home/DB_1201/
   if [ $? != 0 ]
    then
     echo -e "[ERROR ] Can't copy files from Source to Remote"
     exit -9995
   fi
  
   if    scp -rp /apps/oracle/home/DB_1201/*dmp oracle@v0021x91:/apps/oracle/home/DB_1201/
   then
     echo -e "[INFO ] SCP Success"
      else
     echo -e "[ERROR ] Can't copy files from Source to Remote"
     exit -9995
   fi

ありがとう、ベラ

ベストアンサー1

  1. if [ `ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp | wc -l` -eq 0 ]

    評価順序はワイルドカードが評価されることです。今後コマンドがssh実行されます。/apps/oracle/home/DB_1202/*.dmp1つ以上のファイルに一致するものがある場合地元のホストはこれらのファイルの名前に置き換えられます。それ以外の場合は、アスタリスクが保持され、リテラルとしてリモート側に渡されます。

    その後、リモートシェルはlsコマンドを実行する前にパターンを評価し、1つ以上の一致するファイルに展開するか、文字通りアスタリスクのままにします。

    一致するファイルが存在しない場合、ファイルが見つかりませんlsエラーが発生します/apps/oracle/home/DB_1201/*.dmp(ファイル名の最初の文字にリテラルアスタリスクが表示されます)。副作用としてファイルは出力されず、wc -l予想される正しい結果としてゼロが表示されます。

    結局のところ、テストは0個のファイルと作成されたエラーとを一致させます。標準エラー、またはゼロ以外の数のファイル。

    現代的なコーディングの観点からに[ `command` ]変更することを検討してください[ "$(command)" ]bash[[ "$(command)" ]]

  2. exit -9991

    終了コードは、0(成功、正常)または1〜127の範囲になければなりません。大きいまたは負の数を使用することは間違っており、誤解を招く可能性があります。

  3. if [ $? != 0 ]

    数値に文字列比較を使用しています。実際には大丈夫かもしれませんが、代わりに[ $? -ne 0 ]orを使用する必要があります[ $? -gt 0 ]

  4. if scp -rp /apps/oracle/home/DB_1201/*dmp oracle @ v0021x91:/apps/oracle/home/DB_1201/*dmp

    • ターゲットコンポーネントのスペースはどうなりますか?
    • 実際に使用しない限り、ターゲットにワイルドカード文字を指定しないでください。本物何をしているのかを知る

    ほぼ確実にoracle@v0021x91:/apps/oracle/home/dB_1202/

  5. if ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp

    #1と同様に一致するファイルがない場合は、エラーメッセージが表示されます*.dmp。リモートシステムのパスに一致するファイルが1つ以上ある場合は、エラーメッセージが表示され、予期しない問題が発生します。地元のマシン。

ローカルシステムでのワイルドカード拡張を防ぐには、に渡すコマンドを引用してくださいssh。したがって、#5の場合などをif ssh v0021x91 'ls /apps/oracle/home/DB_1201/*.dmp'作成する必要があります。

おすすめ記事