SSH를 통해 원격 서버로부터 정보를 수신하는 함수로 스크립트를 만들었습니다.
session_check() {
ssh -o BatchMode=yes $USER@$SERVER my_command | grep "value" > /dev/null
}
계획대로 액세스에서는 키를 사용하지만 키가 원격 시스템에 로드되지 않으면 다음과 같은 결과가 나타납니다.
Permission denied (publickey,password)
서버 접근에 성공했지만 명령이 실패하면 같은 방식으로 1이 반환되기 때문에 return 0이나 1을 사용할 수 없습니다. 어떻게든 "권한 거부됨" 메시지를 숨기고 그러한 메시지가 수신될 때만 충족되는 조건을 설정해야 합니다.
분명하게 썼기를 바랍니다. 미리 감사드립니다!
고쳐 쓰다
stderr() 사용법을 알아냈는데 2>> (grep "value")
, 위의 함수와는 아직 사용이 안되네요. 따라서 나중에 사용할 수 있도록 stderr를 어딘가로 리디렉션해야 합니다. 그러나 어떻게든 서버에서 명령을 실행하지 못하도록 ruselt를 얻으려면(서버에 연결할 수 있는 경우) 일반적으로 단일 명령으로는 이것이 가능하지 않다고 생각합니다. 명령을 실행하기 전에 연결이 성공했는지 확인해야 합니다. 어떻게 생각하나요?
답변1
my_command
스크립트에서 파이프를 사용하고 있으므로 종료 상태를 무시했습니다 . 파이프라인의 종료 상태는 파이프라인의 마지막 명령의 종료 상태가 됩니다.
그러나 Bash를 사용하면 파이프라인에 있는 모든 명령의 종료 코드를 확인할 수 있습니다. 이제 원격 명령이 항상 성공하는지 확인하기만 하면 됩니다. 종료 상태를 무시했기 때문에 새로운 오류가 발생하지 않습니다.
session_check() {
ssh -o BatchMode=yes $USER@$SERVER 'my_command; exit 0' | grep -q "value"
local rc=$?
if [[ ${PIPESTATUS[0]} != 0 ]]; then
return 127
fi
return $rc
}
종료 상태도 얻으려면 my_command
더 어려울 수 있습니다. 그러면 두 개의 개별 명령으로 나눌 수 있습니다.
session_check() {
status=$(ssh -o BatchMode=yes $USER@$SERVER 'my_command; echo $?') &&
sed '$d' <<<"$status" | grep -q "value"
return $(sed -n '$p' <<<"$status")
}
ssh
명령에서 출력된 텍스트의 마지막 줄로 종료 코드를 몰래 빼낸 다음 이를 반복적으로 반복하는 방법에 주목하세요 . 이는 효율성을 위해 리팩터링되어야 하지만 최소한 필요한 경우 이를 구현하는 방법을 보여줍니다.
여기서는 몇 가지 Bash 전용 기능을 사용하고 있습니다. 스크립트는 shebang #!/bin/bash
이 아니라 거기에 있어야 합니다 .#!/bin/sh
이러한 속임수가 필요하다는 것은 쉘 처리 모델에서 제어된 오류 처리 측면에서 실현 가능성의 가장자리에 접근하고 있음을 나타냅니다. 어쩌면 Python과 같은 최신 스크립팅 언어로 일부 또는 전부를 다시 작성하고 싶을 수도 있습니다.