
ssh sudo 명령을 실행해야 합니다.
명령은 다음과 같습니다:
ssh -i keyfile [email protected] 'sh -v /opt/dir/script'
스크립트에는 다음이 포함됩니다.
sudo -E node some.js
-E 인수를 사용하는 이유는 명령이 userA에 의해 실행되고 있기 때문입니다.그리고시작되는 프로세스는 다음에서 정의를 로드해야 합니다.
/user/userA/.bashrc
위 명령은 다음에 정의된 변수를 로드하지 않습니다.
/user/userA/.bashrc
-E가 아무 작업도 수행하지 않는 것처럼 실제로 실행되고 있습니다. 즉, 모든 변수가 정의되지 않은 것으로 표시됩니다.
userA로 대화형으로 원격 시스템에 로그인하고 동일한 명령을 실행하면
sudo -E node some.js
변수가 올바르게 로드되었으며 예상되는 동작이 표시됩니다.
내가 다르게 해야 할 일을 누구든지 볼 수 있나요?
답변1
쉘이 source 로 예상되므로 ~/.bashrc
쉘이 Bash라고 가정합니다.
트위스트 번호 1: SSH 서버는 쉘 코드를 비대화형 쉘에 전달합니다. 비대화형 Bash하지 않습니다읽다 ~/.bashrc
.
트위스트 2번: Bash는 SSH 서버에 의해 실행될 때와 같이 네트워크 연결에 연결된 표준 입력으로 실행되는 시기를 확인하려고 시도합니다. Bash가 이러한 방식으로 실행되고 있다고 판단하면하다에서 명령을 읽고 실행합니다 ~/.bashrc
.
트위스트 번호 3: 많은 배포판(Ubuntu 포함)에서 기본값(골격)은 ~/.bashrc
셸이 비대화형인 경우 반환되는 코드로 시작합니다. 실제로 파일의 나머지 부분은출처가 아님.
귀하의 경우에는 관련 환경 변수가 이 코드 뒤에 정의되어 있는 것 같습니다. 코드는 다음과 같습니다.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
간단한 해결책은 할당을 이동하여 다음과 같이 하는 것입니다.~ 전에이 코드. 더 많은 echo
작업(예: 작업 실행) 을 수행하는 명령을 이동하려면 원격 파일 전송이 중단될 수 있으므로 매우 주의해야 합니다. 읽다bashrc
현재 쉘이 대화형인지 확인하는 이유는 무엇입니까 ?변수에 관한 것이라면 안전해야합니다.
일반적으로 환경에서 정의되어야 합니다.~/.profile
대신에 ~/.bashrc
할당을 이동한 경우 ~/.profile
다음과 같은 경험을 하게 됩니다.~/.profile
SSH를 사용할 때 로드되지 않습니다.. 그때 그것들을 넣는 것은 불합리하지 않습니다 ~/.bashrc
.
또는 별도의 파일(예: )에 배치 ~/.special_env
하고 파일 소스를 ~/.bashrc
또는 ~/.profile
기타 항목으로 지정할 수 있습니다. 장점은 기이함과 왜곡에 관계없이 요청에 따라 파일을 소싱할 수 있다는 것입니다.
ssh -i keyfile [email protected] '. ~/.special_env; sh -v /opt/dir/script'