SSH 출력을 제외하고 발견된 오류만 기록합니다.

SSH 출력을 제외하고 발견된 오류만 기록합니다.
typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" > ${SSHTEMPFILE} 2>&1    

이 줄...Ssh에서 "User Authorization" 메시지를 제외할 수 없습니다...IFERROR는 추적해야 하는 값과 "!!! AUTHORIZED USE ONLY!!!"라는 메시지를 ssh에서 반환합니다...이미 비슷한 작업을 시도했지만 작동하지 않습니다.

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo "$IFERROR"" | grep -v "AUTHORIZED"  > ${SSHTEMPFILE} 2>&1    

답변1

제외하려는 메시지는 SSH 배너일 수 있습니다. 이는 위에 표시되어 있으므로 stderr스크립트 grep -v에서 작동하지 않습니다.

stderr다음으로 리디렉션해 보세요 .stdin 앞으로이것 grep. 작동해야합니다. 나는 당신의 명령을 잘 이해하지 못하지만 다음과 같습니다.

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); IFERROR=$(checkscript); echo "$IFERROR"" 2>&1 | grep -v "AUTHORIZED" > ${SSHTEMPFILE}

추신: 이것의 목적은 무엇입니까 $(cat)?

답변2

당신이 무엇을 하려는지 잘 모르겠지만 최소한 스크립트에 명백한 버그가 있습니다. 당신은

ssh "$(cat); …"$IFERROR"" | …

이 조각은 $IFERROR따옴표로 묶이지 않으며 실행될 SSH 명령을 빌드하기 위해 로컬 셸에 의해 확장됩니다. echo "$IFERROR"원격 측에서 실행 하려고 하므로 $로컬로 확장되지 않도록 인용문이 필요합니다.

typeset -f | sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "
  $(cat);
  IFERROR=$(checkscript);
  echo \"\$IFERROR\"" > ${SSHTEMPFILE} 2>&1

checkscript명령은 로컬에서도 실행됩니다. 원격으로 실행하려면 IFERROR=$(checkscript)로 변경하세요 IFERROR=\$(checkscript).

checkscript출력을 변수에 저장할 필요가 없습니다 . 그렇게 할 수는 있지만, 그렇게 하면 인생이 더 복잡해지고 아무 소용이 없습니다. 출력을 직접 얻으십시오.

typeset -f |
sshpass -e ssh -o StrictHostKeyChecking=no user@${IPADDRESS} "$(cat); checkscript" > ${SSHTEMPFILE} 2>&1

관련 정보