특정 호스트에서 시스템에 SSH로 접속하여 입력하면 다음과 같은 결과가 echo $PATH
나타납니다.
/home/wxy/bin64:/home/wxy/bin:/usr/kerberos/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin:/usr/bin
실행하면 ssh host 'echo $PATH'
다음이 표시됩니다.
/usr/local/bin:/bin:/usr/bin
왜 그런 차이가 있습니까?
또한 후자의 명령을 사용하여 이전 결과를 보려면 어떻게 해야 합니까?
답변1
첫 번째 시나리오에서는 시스템에 로그인하여 호출된 작업을 수행합니다.로그인연결 타입. 로그인은 스크립트를 가져오고 $HOME/.bashrc
, $HOME/.bash_profile
로그인한 경우 쉘은 Bash입니다. 이 두 스크립트는 일반적으로 파일 /etc/bashrc
과 /etc/profile.d/*.sh
.
두 번째 경우에는 파일을 가져옵니다 $HOME/.bashrc
. 이러한 유형의 로그인을 이라고 합니다.인터렉티브.
이에 대한 자세한 내용은 다음에서 확인할 수 있습니다.부르다부분배쉬 매뉴얼 페이지.
이 동작을 변경하려면 $HOME/.bashrc_profile을 대화형 실행의 일부로 포함하여 원하는 동작을 얻을 수 있습니다.
$ ssh user@remotehost '. $HOME/.bash_profile; echo $PATH'
-또는-
$ ssh user@remotehost 'source $HOME/.bash_profile; echo $PATH'
인용하다
답변2
히스테리적인 역사적 이유로 세션 초기화 파일이 이상합니다.
오래 전에 콘솔에 로그인했습니다. 로그인하면 일부 초기화 파일을 로드하는 쉘이 나타납니다. Bourne 스타일 쉘의 경우 ( /etc/profile
모든 사용자용) 및 ~/.profile
(각 사용자용)의 두 가지 초기화 파일이 있습니다. 초기화 파일은 PATH
각 세션에서 실행할 애플리케이션(예: 메일 표시기) 로드 등과 같은 환경 변수를 설정할 수 있습니다. 쉘이 아닌 경우로그인 쉘, 아무것도 시작하거나 환경 변수를 설정할 필요가 없으므로 초기화 파일을 실행할 필요가 없습니다. 기필코 아니다...
실제로 쉘은 점차적으로 대화형 기능을 획득했기 때문에 대화형 쉘을 위한 초기화 파일이 필요했습니다. Ksh에도 있고 ~/.kshrc
, bash에도 있고 ~/.bashrc
, zsh에도 있습니다 ~/.zshrc
.
실행하기 위한 원격 대화형 로그인 /etc/profile
및 ~/.profile
. 그러나 이는 비대화형 프로그램을 시작할 수 있으므로 비대화형 로그인에는 적합하지 않습니다. 불행하게도 비대화형 로그인에 대한 초기화 파일에 대한 표준은 나오지 않았습니다.
출력이 생성되지 않거나 프로그램이 시작되지 않는다고 확신하는 경우 수동으로 실행 /etc/profile
하고 환경 변수만 설정할 수 있습니다.~/.profile
ssh foo '. /etc/profile; . ~/.profile; somecommand'
.profile
대화형 세션에서만 의미가 있는 부분이 있는 경우 이를 조건부 지시문에 넣을 수 있습니다.
## (in ~/.profile)
case $- in
*i*) # the shell is interactive
newmail;;
esac
로그인 셸이 bash인 경우 특이한 점을 활용할 수 있습니다. 초기화 파일은 ~/.bashrc
대화형 셸뿐만 아니라 rshd
상위 프로세스가 호출되는 비대화형 셸 또는 에서도 읽습니다 sshd
. 다른 껍질에는 이런 특징이 없습니다.
## (in ~/.bashrc)
case $- in
*i*) # interactive shell: set prompt, completion settings, key bindings, etc.
…;;
*) # non-interactive shell: our parent must be rshd or sshd
. ~/.profile;;
esac
답변3
Bash를 사용하는 경우 /etc/profile
호스트가 예상한 출력을 얻지 못하고 있는지 확인하세요. Bash는 먼저 이 파일 /etc/profile
이 존재하는 경우 명령을 읽고 실행합니다 . 파일을 읽은 후 ~/.bash_profile
, ~/.bash_login
, 를 순서대로 찾아 존재 ~/.profile
하고 읽을 수 있는 첫 번째 파일부터 명령을 읽고 실행합니다.