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


23

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

내가 이렇게하면 :

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 기능을 계속 사용하여 모든 출력을 형식화하고 파일, syslog 및 화면으로 전송하는 모든 출력을 캡처하고 싶습니다.

var에서 결과를 캡처하고 원격 스크립트에서 올바른 종료 코드를 얻는 방법은 무엇입니까?


답변:


37

올바른 오류 코드를 얻지 못하는 이유 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

8

"로컬"이 문제인 것 같습니다. 이것은 나를 위해 작동합니다 :

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

당신도 옳았지만 요담이 더 빨랐습니다!
mconlin

예, 26 초
Hauke ​​Laging

5
영어 수업은 아니지만 '더 빨리'라고 말하는 것은 잘못입니다.
mtahmed

5
농담 이었어 내가 생각하는 나쁜 것. 인터넷에서는 아무도 당신이 개라는 것을 알지 못합니다.
mconlin

또한 jordanm의 답변은 왜 이것이 문제인지 설명합니다 :)
Doktor J

2

실제로 위의 답변 중 어느 것도 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 && doExit $exit_code $err_msg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.