IT story

SSH 원격 명령이 수동으로 실행될 때 환경 변수가 더 적은 이유는 무엇입니까?

hot-time 2020. 4. 21. 08:22
반응형

SSH 원격 명령이 수동으로 실행될 때 환경 변수가 더 적은 이유는 무엇입니까? [닫은]


컴퓨터에 ssh하고 실행하면 정상적으로 실행되는 명령이 있지만 다음과 같은 원격 ssh 명령을 사용하여 실행하려고하면 실패합니다.

ssh user@IP <command>

두 가지 방법을 모두 사용하여 "env"의 출력을 비교하면 다른 환경에서 다시 시작됩니다. 수동으로 컴퓨터에 로그인하고 env를 실행하면 다음을 실행할 때 훨씬 더 많은 환경 변수가 나타납니다.

ssh user@IP "env"

왜 그런지 알아?


다른 유형의 껍질이 있습니다. SSH 명령 실행 셸은 비 대화식 셸이지만 일반 셸은 로그인 셸 또는 대화식 셸입니다. man bash의 설명은 다음과 같습니다.

       로그인 쉘은 인수의 첫 문자
       0은-이거나 --login 옵션으로 시작한 것입니다.

       대화식 쉘은 옵션이 아닌 시작된 쉘입니다.
       표준 입력의 -c 옵션이없는 인수
       오류는 모두 터미널에 연결되어 있습니다 (결정된대로)
       isatty (3)) 또는 -i 옵션으로 시작합니다. PS1은
       bash가 대화식 인 경우 set 및 $-i를 포함하여
       이 상태를 테스트하기 위해 쉘 스크립트 또는 시작 파일.

       다음 단락은 bash가 어떻게 실행되는지 설명합니다.
       시작 파일. 파일이 있지만 존재하지 않는 경우
       bash는 오류를보고합니다. 틸드는 파일에서 확장됩니다
       아래의 Tilde Expansion 아래에 설명 된 이름
       확장 섹션.

       bash가 대화식 로그인 쉘로 호출되거나
       --login 옵션이있는 비 대화식 쉘
       / etc / profile 파일에서 명령을 읽고 실행합니다.
       해당 파일이 존재합니다. 해당 파일을 읽은 후
       ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile
       첫 번째 명령을 읽고 명령을 읽고 실행합니다.
       존재하고 읽을 수 있습니다. --noprofile 옵션은
       쉘이이 동작을 막기 시작했을 때 사용
       ior.

       로그인 쉘이 종료되면 bash는 명령을 읽고 실행합니다.
       ~ / .bash_logout 파일에서 존재합니다.

       로그인 쉘이 아닌 대화식 쉘이
       bash는 ~ / .bashrc에서 명령을 읽고 실행합니다.
       해당 파일이 존재하는 경우 이를 사용하여 억제 할 수 있습니다.
       --norc 옵션. --rcfile 파일 옵션은 강타를 강요합니다
       파일 대신 명령을 읽고 실행
       ~ / .bashrc.

       bash가 비 대화식으로 시작될 때 쉘을 실행하려면
       예를 들어 스크립트는 BASH_ENV 변수를 찾습니다.
       환경이 나타나면 그 가치가 확대되고
       확장 된 값을 읽을 파일 이름으로 사용합니다.
       실행하십시오. Bash는 다음 명령처럼 동작합니다
       처형 :
              [-n "$ BASH_ENV"] 인 경우; 그때. "$ BASH_ENV"; fi
       그러나 PATH 변수의 값은 검색에 사용되지 않습니다
       파일 이름으로


명령을 실행하기 전에 프로파일을 소싱하는 것은 어떻습니까?

ssh user@host "source /etc/profile; /path/script.sh"

당신은 그 변경하도록 최선을 찾을 수있는 ~/.bash_profile, ~/.bashrc또는 무엇 이건.

( 여기서 (linuxquestions.org) )


원격 ssh 명령을 실행할 때 쉘 환경이로드되지 않습니다. ssh 환경 파일을 편집 할 수 있습니다.

vi ~/.ssh/environment

형식은 다음과 같습니다.

VAR1=VALUE1
VAR2=VALUE2

또한 PermitUserEnvironment = yes 옵션에 대한 sshd 구성을 확인하십시오.


비슷한 문제가 있었지만 결국 ~ / .bashrc가 내가 필요한 전부라는 것을 알았습니다.

그러나 우분투에서는 ~ / .bashrc 처리를 중지하는 줄을 주석 처리해야했습니다.

#If not running interactively, don't do anything
[ -z "$PS1" ] && return

이 문제에 대한 쉬운 해결책은 대상 시스템에서 실행하려는 script.sh 파일의 맨 위에 source / etc / profile을 추가하는 것입니다. 여기 시스템에서 이로 인해 script.sh에 필요한 환경 변수가 로그인 쉘에서 실행되는 것처럼 구성되었습니다.

이전 응답 중 하나에서 ~ / .bashr_profile 등을 사용하는 것이 좋습니다. 나는 이것에 많은 시간을 소비하지 않았지만, 이것의 문제는 당신이 로그인 한 소스 시스템의 쉘과 다른 타겟 시스템의 다른 사용자에게 ssh하면 이것이 소스 시스템 사용자를 일으키는 것으로 나에게 나타났습니다 ~에 사용될 이름.


~ / .bashrc에서 비 대화식 셸 검사보다 원하는 환경 변수를 내보내십시오.

참고 : https://stackoverflow.com/questions/216202/why-does-an-ssh-remote-command-get-fewer-environment-variables-then-when-run-man

반응형