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/*.dmp하나 이상의 파일에 일치하는 항목이 있는 경우현지의호스트는 이러한 파일의 이름으로 대체됩니다. 그렇지 않으면 별표가 유지되어 리터럴로 원격 측에 전달됩니다.

    그러면 원격 셸은 ls명령을 실행하기 전에 패턴을 평가하여 하나 이상의 일치하는 파일로 확장하거나 문자 그대로 별표로 남겨둡니다.

    일치하는 파일이 없으면 ls파일을 찾을 수 없음 오류가 발생합니다 /apps/oracle/home/DB_1201/*.dmp(파일 이름의 첫 번째 문자에 리터럴 별표가 표시됨). 부작용으로 파일이 출력되지 않으며 wc -l예상되는 올바른 결과로 0이 표시됩니다.

    결국 테스트는 0개의 파일과 작성된 오류를 일치시킵니다.표준 에러, 또는 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. 원격 시스템의 경로와 일치하는 파일이 하나 이상 있으면 오류 메시지가 표시되며 예상치 못한 문제가 발생합니다.현지의기계.

로컬 시스템에서 와일드카드 확장을 방지하려면 에 전달하는 명령을 인용하십시오 ssh. 따라서 #5의 경우 if ssh v0021x91 'ls /apps/oracle/home/DB_1201/*.dmp'등을 작성해야 합니다 .

답변2

-9991과 같은 종료 코드는 모든 종류의 스크립트에서 의미가 없습니다. 모듈로 256으로 잘리고 0-255 범위의 양수 값을 반환합니다. 128 이상의 값은 일반적인 의미(신호로 종료됨)를 가지며 대략 124에서 127 사이의 값은 쉘 프로세스 오류에 사용됩니다. 또한 카운터의 상태 코드를 안정적으로 사용할 수 없습니다.

ssh 및 scp는 자체 상태를 반환합니다. 원격 시스템에 액세스할 수 있습니까? 자격 증명이 정확합니까? 원격 서비스가 실행 중입니까? 원격 명령 상태를 반환하는 메커니즘이 없습니다. 모든 정보(예: 원격 스크립트 결과)를 원격 명령에서 반환된 데이터로 다시 전달해야 하므로 STATUS::9991원하는 방식으로 실제 데이터가 아닌 것으로 식별할 수 있습니다.

원격 명령의 stderr을 캡처하려면 2>&1ssh 명령에서 이를 리디렉션해야 할 수도 있습니다.

답변3

첫 번째 코드 조각의 유일한 문제점은 glob 모드의 실행을 지연시키기 위해 원격 "ls" 명령 주위에 작은따옴표를 배치해야 한다는 것입니다. 기본 접근 방식은 정확합니다. SSH 맨페이지에 따르면 ssh 명령의 종료 상태는 원격 명령의 종료 코드입니다.

또한 종료 상태는 0 - 255 범위로 제한됩니다.

이 시도:

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

관련 정보