bash 쉘 - SSH 원격 스크립트 출력 및 종료 코드 캡처?

bash 쉘 - SSH 원격 스크립트 출력 및 종료 코드 캡처?

쉘을 사용하여 원격 서버에서 스크립트를 호출하고 싶습니다. 이 스크립트의 출력(로그 메시지)과 반환되는 종료 코드를 캡처하고 싶습니다.

내가 이렇게 하면:

ssh user@server /usr/local/scripts/test_ping.sh
echo "$?"

종료 코드를 받았지만 원격 로깅 메시지를 캡처할 수 없습니다.

내가 이렇게 하면:

local RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo "$?" 
LOG "${RESULTS}";

LOG 함수를 사용하여 출력을 기록하고 있지만 올바른 종료 코드를 얻을 수 없는 것 같습니다. 내가 얻은 코드는 변수 할당을 위한 코드라고 가정합니다.

계속해서 LOG 기능을 사용하여 형식을 지정하고 콘텐츠를 파일, 시스템 로그 및 화면으로 보내는 모든 출력을 캡처하고 싶습니다.

var에 결과를 캡처하고 원격 스크립트에서 올바른 종료 코드를 얻으려면 어떻게 해야 합니까?

답변1

올바른 오류 코드를 얻지 못하는 이유는 local실제로 마지막으로 실행된 것이기 때문입니다. 명령을 실행하기 전에 변수를 로컬 변수로 선언해야 합니다.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

여기에서 문제를 볼 수 있습니다.

$ bar() { foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2
$ bar() { local foo=$(ls asdkjasd 2>&1); echo $?; }; bar
0
$ bar() { local foo; foo=$(ls asdkjasd 2>&1); echo $?; }; bar
2

답변2

'로컬'이 문제인 것 같습니다. 이것은 나에게 효과적입니다.

local RESULTS
RESULTS=$(ssh user@server /usr/local/scripts/test_ping.sh)
echo $?

답변3

실제로 위의 답변 중 어느 것도 ssh 오류 코드와 메시지를 캡처하지 않습니다. 이는 다음과 같이 수행할 수 있습니다(사용자 정의 변수 및 함수 무시).

# move the deployment package from the tmp dir
msg=$(ssh -i "$(eval echo $identity_file)" -o ConnectTimeout=5 "$ssh_user"'@'"$ssh_server" \
sudo -iu "$etl_user" bash "$tgt_deployment_dir"'/src/bash/'"$run_unit/$run_unit"'.sh' \
    -a create-relative-package 2>&1)

# fail on any non-success
export exit_code=$?
export err_msg="network error: ""$msg"
test $exit_code -ne 0 && echo "$err_msg" && exit $exit_code

관련 정보