ssh -nq -t가 내 환경 변수를 볼 수 없는 이유는 무엇입니까?

ssh -nq -t가 내 환경 변수를 볼 수 없는 이유는 무엇입니까?

-t 플래그를 사용하여 원격 시스템에서 명령을 실행하고 있습니다(명령이 프롬프트를 "차단"하는 것을 방지하기 위해)(어쨌든 이렇게 작동합니다). 그래서 사용하고 있는데 ssh -nq -t root@ip이렇게 하면 스크립트가 내가 사용하고 있는 환경 변수를 찾을 수 없습니다.

왜 이런 일이 발생하며 이를 방지하는 방법은 무엇입니까?

답변1

편집하다

ssh컴퓨터에 들어가서 로그인 셸을 시작하는 명령을 실행하면 다음 정보가 유효합니다.

ssh root@ip
echo $XXXX_LICENSE_FILE

ssh명령( ssh root@ip echo $XXXX_LICENSE_FILE) 에서 직접 변수에 액세스하려고 하면비로그인, 비대화형이 경우 쉘은 읽지 ~/.bash_profile도 읽지도 않습니다 ~/.bashrc. bash매뉴얼 페이지 에서 :

   When bash is started non-interactively, to run a shell script,
   for  example,  it looks for the variable BASH_ENV in the envi‐
   ronment, expands its value if it appears there, and  uses  the
   expanded  value  as  the  name  of a file to read and execute.
   Bash behaves as if the following command were executed:
          if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
   but the value of the PATH variable is not used to  search  for
   the file name.

가장 쉬운 해결책은 단순히 ssh명령과 함께 변수를 선언하는 것입니다. 이렇게 하려면 원격 /etc/ssh/sshd_config파일에 다음 줄을 추가해야 합니다.

PermitUserEnvironment yes

그런 다음 로컬 컴퓨터에서 실행합니다.

XXXX_LICENSE_FILE=/etc/xxxx.lic && ssh -nq -t -t -t root@$ip /etc/init.d/xxxx.rc start

여기서 문제는 로그인 쉘과 대화형 쉘의 차이점입니다. 바라보다여기좋은 요약입니다.

~/.bashrc시작 시 읽기 전용인터렉티브(비로그인) 쉘. ssh원격 컴퓨터에 들어가면 실행 중입니다 .로그인쉘 so ~/.bash_profile또는 ~/.bash_login또는 ~/.profile(순서대로)을 읽습니다. bash원격 서버에 로그인한 후 실행하여 이를 확인할 수 있습니다 . 그러면 ~/.bashrc환경 변수를 읽고 설정하는 대화형 셸이 시작됩니다.

이 문제를 해결하려면 대신에 이것을 추가 ~/.bash_profile하십시오 ~/.bashrc.


.bashrc변수를 로컬이 아닌 원격으로 설정한다고 가정합니다 . 수출하고 싶다면현지의변수 끝 ssh, 참조협회게시자: Frederik Deweerdt. 가장 쉬운 방법은 호출에 변수를 포함시키는 것입니다 ssh.

ssh -nq -t root@ip "FOO=foo BAR=bar"

관련 정보