나에게 잘 맞는 여러 사용자 정의 유틸리티가 포함된 원격 SSH 서버가 있습니다. 그러나 때로는 게으른 느낌이 들고 단일 명령을 실행하기 위해 전체 SSH 세션을 시작하고 싶지 않습니다.
이로 인해 호출된 이름을 확인하고 내 서버에서 일치하는 명령을 실행하고 내가 제공한 인수를 전달할 수 있는 심볼릭 링크를 만들 수 있는 BusyBox와 유사한 다중 호출 스크립트를 만들게 되었습니다.
나는 이것을 처음으로 생각했습니다.
#!/bin/bash
exec ssh -q -t my-server "$(basename "$0")" "${@@Q}"
하지만 이것은 PATH
내 설정을 올바르게 설정하지 않아서 모든 프로그램을 사용할 수 없습니다.
다음으로 bash를 로그인 셸로 사용해 보았습니다.
exec ssh -q -t my-server bash -l "$(basename "$0")" "${@@Q}"
하지만 bash 스크립트가 아닌 것을 실행할 때마다 다음과 같은 오류가 발생합니다.
/bin/ls: /bin/ls: cannot execute binary file
bash에 명령 문자열을 전달하려고 합니다.
exec ssh -q -t my-server bash -l -c "$(basename "$0")" "${@@Q}"
이렇게 하면 PATH가 올바르게 설정되고 바이너리가 실행되지만 바이너리에 전달한 모든 인수는 손실됩니다.
매개변수를 다음 문자열로 전달해 보았습니다.
exec ssh -q -t my-server bash -l <<< "$(basename "$0") ${*@Q}"
하지만 대화형 프로그램은 즉시 종료됩니다.
내가 하고 싶은 일이 가능한 일인가? SSH를 통해 비표준 임의 원격 명령을 실행 PATH
하고 정상적으로 로그인한 것처럼 동작하게 하려면 어떻게 해야 합니까?
답변1
bash가 명령을 올바르게 실행하려면 또 다른 수준의 이스케이프된 따옴표를 추가해야 하는 것 같습니다. 지금까지 이것은 내가 원하는 방식으로 정확하게 작동합니다.
#!/bin/bash
exec ssh -q -t eng-vm bash -l -c \""$(basename "$0") ${*@Q}"\"