$ PATH를 올바르게 지정 했는데도 Bash가 명령을 찾을 수없는 이유는 무엇입니까?


9

/ etc / profile 파일에서 명령의 경로를 지정하고 있습니다 .

export PATH=$PATH:/usr/app/cpn/bin

내 명령은 다음 위치에 있습니다.

$ which ydisplay 
/usr/app/cpn/bin/ydisplay

따라서 "echo $ PATH"출력을 수행하면 다음과 같습니다.

$ echo $PATH
...:/usr/app/cpn/bin

그리고 모든 것이 정상이지만 SSH를 통해 명령을 실행하려고하면 오류가 발생합니다.

$ ssh 127.0.0.1 ydisplay
$ bash: ydisplay: command not found

그러나 내 길은 여전히 ​​존재합니다 :

$ ssh 127.0.0.1 echo $PATH
...:/usr/app/cpn/bin

Bash가 SSH 세션 중에 ydisplay를 찾을 수없는 이유와이 문제를 피하기 위해 SSH를 올바르게 구성하는 방법을 설명하십시오.

또한 현재 사용자의 로컬 파일 .bashrc에 $ PATH를 지정하면 모두 올바르게 작동합니다. 그러나 각 사용자마다 많은 파일을 지정하는 대신 하나의 파일 만 수정하고 싶습니다. 이것이 내가 묻는 이유입니다.


1
그냥 ydisplay작동합니까? 않는 ssh 127.0.0.1 /usr/app/cpn/bin/ydisplay일을?
Bananguin

@ user1129682 예, 전체 이름이 지정된 ydisplay가 작동하고 ydisplay가 작동합니다
SIGSEGV

로그되지 않았을 때 (원격 세션이 없음) 원격으로 명령을 보내는 경우 .bashrc / .profile 파일이 실행되지 않기 때문에 동일한 방식으로 환경 변수에 액세스 할 수 없습니다. 이것이 현재 세션의 변수 설정을 담당하는 이유입니다.
mnmnc

14
단지 참고 : ssh 127.0.0.1 echo $PATH당신이 생각하는 것을하지 않습니다 : 쉘은 ssh가 실행되기 전에 $ PATH를 확장하므로 아무것도 입증하거나 반증하지 않습니다.
Ulrich Schwarz

2
이 stackoverflow 질문 이 도움이 될 수도 있습니다
bsd

답변:


5

tl; dr

대신 ssh 127.0.0.1 ydisplay소스를 실행하십시오 . 대신 경로를 변경하십시오 .~/.bashrc/etc/profile~/.bashrc

세부

유일한 시간 /etc/profile쉘은 "로그인 쉘"인 경우 읽기입니다.

로부터 배쉬 참조 설명서 :

bash가 로그인 쉘로 호출되면 .... 먼저 / etc / profile 파일에서 명령을 읽고 실행합니다.

실행할 때 ssh 127.0.0.1 ydisplay, bash로그인 쉘로 시작되지 않습니다. 그러나 다른 시작 파일을 읽습니다. 배쉬 참조 설명서는 말한다 :

... sshd에 의해 실행될 때. ...에서 명령을 읽고 실행합니다.~/.bashrc

따라서 PATH설정을에 넣어야합니다 ~/.bashrc.

대부분의 시스템, ~/.bash_profile소스 ~/.bashrc에서 설정 ~/.bashrc을 두 파일 모두에 저장하지 않고 입력 만 할 수 있습니다.

이 모든 사용자에 대한 설정을 변경하는 표준 방법은 없지만 대부분의 시스템은이 /etc/bashrc, /etc/bash.bashrc또는 유사한.

실패 pam_env하면 PATH설정을 설정 하고에 넣으십시오 /etc/environment.

또한보십시오:


1

역사적으로 프로필 파일 ( /etc/profile~/.profile)은 텍스트 콘솔에 로그인했을 때 호출되었으며 다른 용도로 사용되었습니다.

  • 세션에 대한 환경 변수 및 기타 매개 변수 (예 : umask)를 설정하십시오.
  • 세션 시작시 추가 프로그램을 실행하십시오 (예 : 이메일 알림).
  • 쉘과 다른 경우 세션에 대한 프로그램을 실행하십시오 (예 : 다른 쉘 또는 X Window).
  • 터미널 매개 변수를 설정하십시오 (예 :) stty.
  • 쉘 매개 변수 (예 : 별명)를 설정하십시오.

이 모든 목적은 나중에 야 별개로 식별되지 않았습니다. 프로파일 스크립트는 대화식 세션 (터미널 상호 작용, 다른 프로그램 시작)에서만 의미가있는 작업을 수행 할 수 있기 때문에 원격 쉘 호출 ( rsh )이 도입 되었을 때 rsh는 원격 쉘을 로그인 쉘로 호출하지 않기로 결정했습니다. 프로필 스크립트가 실행되지 않도록합니다. (일부 버전의 rshd경우 원격 쉘을 로그인 쉘로 실행할 수있는 옵션이 있습니다.) Ssh는 rsh를 대체 할 수 있도록이 동작을 복사했습니다.

프로파일 스크립트를 실행하려면 명시 적으로 호출 할 수 있습니다.

ssh 127.0.0.1 '. /etc/profile; . ~/.profile; ydisplay'

.쉘 내에서 프로파일 스크립트를로드 하는 명령 에 유의하십시오 . 이들은 외부 프로그램이 아니라 해당 쉘 내에서 실행되는 명령입니다.

모든 사용자에 대해 전 세계적으로 환경 변수를 설정하려면, 많은 시스템에 또 다른 방법이있다 : 대신 그것을에서 정의하는 /etc/profile, 그것을 정의한다 /etc/environment. 이 파일은 pam_env모듈을 통해 읽습니다 . 대부분의 Linux 배포판은이를 읽도록 설정되어 있습니다.

로그인 쉘이 bash이면 추가 가능성이 있습니다. 일반적으로 환경 변수를 설정해서는 안됩니다.bashrc (대화식 쉘이있는 터미널을 통과하는 경우를 제외하고는 X 세션에서 설정되지 않기 때문에 텍스트 콘솔 이상에서 대화 형으로 로그인하면 설정되지 않기 때문에 환경 변수를 설정하지 않아야 함) ssh는 다른 프로그램에서 쉘을 호출하면 사용자 정의 설정을 무시하므로). 그러나 bash에는 내가 이해하지 못한 이상한 기능 ~/.bashrc이 있습니다. 두 가지 관련이없는 상황에서 읽습니다 .

  • 로그인 쉘이 아닌 대화식 쉘에서;
  • bash가 rshdor에 의해 호출되었다고 생각하면 로그인 쉘이 아닌 비 대화식 쉘에서 sshd.

ssh를 통해 명령을 실행하면 두 번째 경우입니다. 당신은 당신의 프로필을 읽고 읽고 주선 할 수 /etc/profile.profile에서 .bashrc. 에 다음 코드를 포함하십시오 ~/.bashrc.

case $- in
  *i*) :;; # this is an interactive shell, fine
  *) # This is not an interactive shell! This must be a non-interactive remote shell session.
    . /etc/profile; . ~/.profile
    return;;
esac
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.