SSH 명령을 통해 원격 스크립트 실행

SSH 명령을 통해 원격 스크립트 실행

원격 Debian 서버 시스템에 다음을 호출하여 명령을 실행하려는 스크립트가 있습니다.

ssh server "find.sh"

내 거find.sh스크립트는 다음 위치에 있습니다.

/home/user/bin

먼저, 나는 달렸다SSH 서버 "echo $PATH"다음 경로로 응답합니다.

/home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

따라서 PATH 변수는 괜찮은 것처럼 보이지만 작동하지 않습니다. 작동하게 할 수 있는 유일한 방법은 전체 경로를 호출하는 것입니다.

ssh server "/home/user/bin/find.sh"

전체 경로를 지정하지 않고 쉽게 작동시킬 수 있는 방법이 있습니까?

답변1

대상 서버의 파일 $PATH에서 파일 시작 부분에 정의해야 합니다 ~/.bashrc.

export PATH=$PATH:/home/user/bin

https://stackoverflow.com/questions/940533/how-do-i-set-path-such-that-ssh-userhost-command-works:

Bash는 비대화형 모드에서 ~/.bashrc 파일을 읽습니다.

답변2

ssh server "echo $PATH"다양한 작동 모드 ssh server "find.sh". 첫 번째는 쉘 메타 문자(특히 공백)를 포함하므로 "sh -c 'specified_command')"에 의해 실행되고 두 번째는 그렇지 않으므로 "exec('specified_command')"에 의해 실행됩니다. 차이점은 미묘하지만 이 경우(환경 변수를 설정하는 쉘이기 때문에) 예상하지 못한 부작용이 있을 수 있습니다.

다음과 같은 작업을 수행하여 쉘을 강제로 실행할 수 있습니다.ssh server 'bash -c "find.sh"'

답변3

입력이 로컬로 확장 ssh server "echo $PATH"됩니다 PATH. 따라서 실제로 실행하는 명령은 이며 , 서버는 서버 측에 있는 내용 ssh server "echo /home/user/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"에 관계없이 이를 수신할 때마다 동일한 출력을 생성합니다 . 서버 측에서 확장 PATH하려면 대신 :을 사용할 수 있습니다. 로컬 확장을 방지하기 위해 작은따옴표가 사용된다는 점에 유의하세요 .PATHssh server 'echo "$PATH"'$PATH

관련 정보