Bash 스크립트에서 SSH 중첩 원격 호출을 사용할 수 있습니까? [복사]

Bash 스크립트에서 SSH 중첩 원격 호출을 사용할 수 있습니까? [복사]

이상한 문제가 있습니다. Computer A알 수 있습니다 Computer B. Computer B알 수 있지만 Computer CComputer A수 있습니다.아니요바라보다 Computer C.

A나는 그것에 대해 임의의 명령을 호출할 수 있는 bash 스크립트를 만들고 싶지만 C큰따옴표가 작동하지 않는 것 같습니다. 아이디어는 다음과 같습니다.

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
ssh -t username@ComputerB "ssh -t username@ComputerC "$AMB_CMD""

B무엇을 실행할지 해결하면 다음과 같은 문제가 해결될 것이라고 생각합니다 .

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
B_CMD=ssh -t username@ComputerC "$AMB_CMD"
ssh -t username@ComputerB "$B_CMD"

하지만 여전히 문제가 있습니다.

답변1

내가 아는 한 실제 명령을 인용할 필요는 없습니다.

ssh username@ComputerB ssh username@ComputerC make clean all

또는,

ssh -J username@ComputerB username@ComputerC make clean all

ComputerB이는 에 연결할 점프 호스트 로 사용됩니다 ComputerC.

OpenSSH 7.3+에서는 구성 옵션을 사용하여 다음 ProxyJump위치에서 점프 호스트를 구성할 수 있습니다 ~/.ssh/config.

Host ComputerC
    User username
    ProxyJump username@ComputerB

...그래서 명령은 다음과 같이 줄어듭니다.

ssh ComputerC make clean all

make문제의 실제 구성에 따라(질문에 오류 메시지가 언급되지 않음) 잘못된 디렉터리에서 실행하는 것과 관련이 있을 수 있습니다. cd실행하기 전에 올바른 디렉토리에 들어가려면 유틸리티 make-C옵션을 사용하십시오.

ssh username@ComputerC make -C path/to/build/dir clean all

또한 실제 명령을 변수에 저장하려면 단일 문자열이 아닌 bash배열을 사용하십시오.

cmd=( make -C "path/to/build/dir" clean all )

ssh ... "${cmd[@]}"

답변2

ssh에 전달된 인수가 연결되어 형식을 형성한다는 점을 인식하는 것이 중요합니다.쉘 명령줄다음과 같이 해석됩니다.로그인 쉘원격 사용자의.

따라서 B에 대한 ssh 연결을 통해 C에서 실행하려면 B 사용자의 로그인 셸이 이를 올바르게 해석하여 있는 그대로 전달할 수 some-shell-code있도록 B에 대한 명령줄을 작성해야 합니다 .some-shell-codessh

A의 현재 쉘, B의 사용자 로그인 쉘, C의 사용자 로그인 쉘이 bash모두 동일한 버전(또는 일부 코드에 비ASCII 문자가 포함된 경우 동일한 로케일)이고 C 코드에서 실행될 코드를 $CODE포함하는 경우 bash, 다음을 수행할 수 있습니다.

printf -v quoted_CODE %q "$CODE"
ssh B "ssh C $quoted_CODE"

어떤 사용자의 로그인 셸이 B 또는 C에 있는지 확인할 수 없고 bashstdin을 통해 아무것도 전달할 필요가 없는 경우 간단히 다음을 수행할 수 있습니다.

ssh B ssh C bash <<< "$CODE"

sshd또는 A와 B에서 들어오는 변수가 허용된다는 것을 알고 있는 경우 LC_*( AcceptEnv LC_*공통 sshd_config):

LC_CODE=$CODE ssh -o SendEnv=LC_CODE B '
  ssh -o SendEnv=LC_CODE C bash -c '\'' eval "$LC_CODE"'\'

관련 정보