이상한 문제가 있습니다. Computer A
알 수 있습니다 Computer B
. Computer B
알 수 있지만 Computer C
알 Computer 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-code
ssh
A의 현재 쉘, B의 사용자 로그인 쉘, C의 사용자 로그인 쉘이 bash
모두 동일한 버전(또는 일부 코드에 비ASCII 문자가 포함된 경우 동일한 로케일)이고 C 코드에서 실행될 코드를 $CODE
포함하는 경우 bash
, 다음을 수행할 수 있습니다.
printf -v quoted_CODE %q "$CODE"
ssh B "ssh C $quoted_CODE"
어떤 사용자의 로그인 셸이 B 또는 C에 있는지 확인할 수 없고 bash
stdin을 통해 아무것도 전달할 필요가 없는 경우 간단히 다음을 수행할 수 있습니다.
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"'\'