$PATH가 올바르게 지정되었음에도 불구하고 Bash가 명령을 찾을 수 없는 이유는 무엇입니까?

$PATH가 올바르게 지정되었음에도 불구하고 Bash가 명령을 찾을 수 없는 이유는 무엇입니까?

파일에 명령 경로를 지정합니다./etc/구성 파일:

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

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

게다가 현재 사용자의 로컬 파일 .bashrc에 $PATH를 지정하면 모든 것이 잘 작동합니다. 하지만 각 사용자에 대해 여러 파일을 지정하는 대신 하나의 파일만 수정하고 싶습니다. 그래서 내가 묻는다.

답변1

너무 길어요.

대신 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_profilesource 설정을 두 개의 파일에 넣는 대신 ~/.bashrc설정을 넣을 수 있습니다 .~/.bashrc

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

실패하면 설정을 지정 pam_env하고 .PATH/etc/environment

또한보십시오:

답변2

역사적으로 프로필( /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가 rshd또는 에 의해 호출 되었다고 생각하는 경우 sshd.

SSH를 통해 명령을 실행하면 두 번째 상황이 됩니다. read /etc/profile및 from 을 통해 .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

답변3

나는 전에이 문제를 겪었습니다. 이유는 간단해요.

두 개의 실행 파일이 동일한 이름을 공유하고 서로 다른 두 디렉터리에 있는 경우 셸은 $PATH의 첫 번째 디렉터리에서 파일을 실행합니다.

원천:Linux에서 PATH에 디렉토리를 추가하는 방법

Pointwise라는 애플리케이션이 있습니다. 실행 파일의 위치를 ​​확인했을 때 다음 사항을 발견했습니다.

:~> which pointwise
/usr/local/bin/pointwise

비어 있지만 설치 시 디렉터리가 생성되었습니다. 확인하면 $PATH다음과 같은 결과가 나타납니다.

/usr/bin/path:/home/mendezj/bin:/usr/local/bin:/usr/bin:/bin:/opt/pbs/bin:/opt/sim_pkgs/working/apps/POINTWISE

/etc/profile실행 파일의 실제 경로를 변경하고 추가했습니다 . 문제를 해결하기 위해 실행 파일의 위치를 ​​변경했습니다. 변수의 시작 부분으로 가져옵니다 $PATH.

그것은:

PATH="$PATH:/opt/sim_pkgs/working/apps/POINTWISE"

나는 그것을 다음과 같이 변경했습니다 :

PATH="/opt/sim_pkgs/working/apps/POINTWISE:$PATH"

이동하기 전에 첫 번째 항목을 보면 문제가 해결됩니다 /usr/local/bin.

관련 정보