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
또는 무엇 이건.
원격 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에서 비 대화식 셸 검사보다 원하는 환경 변수를 내보내십시오.
'IT story' 카테고리의 다른 글
정규식-특정 문자를 포함하지 않습니다 (0) | 2020.04.21 |
---|---|
장기간 실행되는 Linux 프로세스의 시작 시간을 얻는 방법은 무엇입니까? (0) | 2020.04.21 |
ostream에 << 연산자를 올바르게 오버로드하는 방법은 무엇입니까? (0) | 2020.04.21 |
GitHub 저장소에 파일과 폴더를 추가하려면 어떻게합니까? (0) | 2020.04.21 |
YouTube 및지도와 같은 iPhone 앱에 http + 도메인 기반 URL 체계를 등록 할 수 있습니까? (0) | 2020.04.21 |