ssh 종료 명령의 실행 상태를 확인하는 방법은 무엇입니까?

ssh 종료 명령의 실행 상태를 확인하는 방법은 무엇입니까?

exitSSH 세션에서 명령이 성공적으로 실행되었는지 확인하고 싶습니다 .

내 첫 번째 시도는 다음 명령을 사용했습니다.

exit && echo $? || echo $?`.The `echo $? || echo $?

0성공적으로 종료되면 인쇄되어야 합니다. 문제는 echo실행이 성공하더라도 exit연결이 끊어지고 후속 명령이 손실되기 때문에 실행되지 않는다는 것입니다.

두 번째 시도는 명령을 다음과 같이 두 개의 명령으로 분할하는 것이었습니다.

$ exit
$ echo $?

echo $?0exit실행이 성공 하면 그래야 합니다. 그러나 너무 빨리 전송되어 실행되기 전에 원격 SSH 호스트에 도달하기 echo $?때문에 또 다른 문제가 삼킬 수 있습니다 .exit

exit그렇다면 다음 명령이 전송되기 전에 원격 호스트에서 실행되는지 어떻게 확인할 수 있습니까 ?

업데이트 #1

사용 단계는 프로그램 언어로 쉘 명령을 실행하고 SSH 파이프 스트림을 통해 메시지를 보내는 것입니다. 따라서 exit명령이 언제 실행되는지 알 수 없습니다 . 명령이 완료되지 않으면 exit후속 명령이 기존 호스트로 전송될 때 무시됩니다.
그렇기 때문에 exit실행된 명령에 관심이 있습니다.

업데이트 #2

1. 어느 단계에서 문제가 발생했습니까?

처음에는 문제를 최대한 간단하게 설명하려고 했는데 더 혼란스러워 보입니다. 저는 Scala로 SSH 라이브러리를 작성 중입니다.자식 라이브러리.

대화형 터미널이 아닙니다. 원격 호스트의 응답 메시지는 네트워크 IO 스트림으로, 프로그램에 의해 저장되고 결과는 문자열로 구문 분석됩니다. 즉, 각 문자 코드를 처리하고 궁극적으로 명령 실행의 성공 또는 실패를 결정해야 합니다.

일부 샘플 코드는 다음과 같습니다.

//create a ssh by JSch library which is a SSH implement by Java Language.
val shell = Shell(Auth("host", "username", 22, "mypassword"))

//execute shell command as we do at terminal for example.
val rst1 = shell.exc("ls")

//create a new shell based on this shell.
val newShell = shell.newShell(Auth("xxx.xxx.xxx.xxx", "username2", 22, "mypassword"))

//do something on the new shell
val rst2 = newShell.exc("touch somefile")

//exit from new shell
newShell.exit()

sent 일반 명령에 의해 newShell생성 되므로 마술이 아닙니다. 예를 들어 일반적인 명령을 보내는 것과 같습니다. sshpass -p 'password' ssh -T username@hostnameJSchls

문제는 exit()메서드 구현에 있습니다. Scala 코드를 무시하면 다음과 같은 셸 명령이 됩니다.

$ echo '' && echo 'some-splitter-string' && exit
$ echo $? && echo 'some-splitter-string'

해당 명령을 원격 호스트에 보낸 후 응답이 다음과 같을 것으로 예상했지만 그렇지 않았고 \n직접 읽을 수 있도록 문자를 명시적으로 추가했습니다.

\n
some-splitter-string\n
0\n
some-splitter-string\n

이는 IO 스트림을 절반으로 분할 some-splitter-string하고 내부적으로 0(아마도 다른 사람이) exit명령 실행이 완료되었음을 결정하도록 할 수 있음을 의미합니다. 이는 쉘 명령의 결과를 디코딩하기 위한 프로토콜입니다.

2. 문제가 정확히 무엇입니까?

실제로 exit()명령은 나에게 응답합니다.

\n  
some-splitter-string\n

두 번째 명령이 echo $? && echo 'some-splitter-string'누락되었습니다! 이는 명령이 $ echo $? && echo 'some-splitter-string'newShell 호스트에도 전송되기 때문입니다.

그러나 exit완료 후 명령은 newShell 호스트에 의해 무시되었습니다. 이 명령을 간단히 생각해 보십시오 exit && touch somefile. 후자는 touch somefile결코 실행될 수 없습니다.

내 현재 솔루션은 명령을 보낸 후 1초 동안 잠을 자는 것입니다 echo '' && echo 'some-splitter-string' && exit. 더 우아해야 합니다. 따라서 실행을 보장하는 방법을 찾고 싶고 exit프로토콜을 완료하기 위해 두 번째 명령을 보내겠습니다.

3. 설명이 필요한 몇 가지 질문:

  1. 어떻게 종료 "실행"이 실패할 수 있습니까?
    현재로서는 실패나 성공에 전적으로 초점을 맞추지 않습니다. 즉 exit, 실패할 수 없다면 완료되었음을 알려주세요.

  2. 여기서 쉘 종료에 대해 이야기하고 있습니까?
    예, 질문의 목적은 SSH 파이프라인 환경에서 완전한 종료 명령을 수행하기로 결정하는 방법을 찾는 것입니다.

관련 정보