-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"