sudo 명령을 실행하고 현재 로그온한 사용자의 환경 변수를 로드하려면 어떻게 해야 합니까?

sudo 명령을 실행하고 현재 로그온한 사용자의 환경 변수를 로드하려면 어떻게 해야 합니까?

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다음과 같은 경험을 하게 됩니다.~/.profileSSH를 사용할 때 로드되지 않습니다.. 그때 그것들을 넣는 것은 불합리하지 않습니다 ~/.bashrc.

또는 별도의 파일(예: )에 배치 ~/.special_env하고 파일 소스를 ~/.bashrc또는 ~/.profile기타 항목으로 지정할 수 있습니다. 장점은 기이함과 왜곡에 관계없이 요청에 따라 파일을 소싱할 수 있다는 것입니다.

ssh -i keyfile [email protected]  '. ~/.special_env; sh -v /opt/dir/script'

관련 정보