/etc/profile.d의 스크립트는 언제 실행됩니까?

/etc/profile.d의 스크립트는 언제 실행됩니까?

profile.d의 작동 방식을 이해하는 데 문제가 있습니다. 내가 아는 한, 사용자가 로그인할 때마다 스크립트가 실행됩니다. 현재 내 서버에서 CentOS 6.10을 실행하고 있는데 다음과 같은 이상한 동작이 발생합니다.

관리자 이메일 주소로 이메일을 보내도록 설계된 /etc/profile.d스크립트가 있습니다 . 누군가 이 스크립트를 통해 로그인하면 스크립트가 올바르게 실행되고 이메일이 전송됩니다. 그러나 스크립트의 실행 여부는 로그인 방법에 따라 다릅니다. 효과적인 방법은 다음과 같습니다logchk.sh/bin/mailssh user@serveradress

  • ssh user@serveradress호스트 시스템에 관계없이 사용자에 관계없이
  • git pull user@repoadress이메일 스크립트는 실행되지만 다음 경우에만 가능합니다.일부호스트 시스템에 관계없이 사용자

다음은 작동하지 않습니다

  • git pull user@repoadress일부 사용자의 경우
  • SSH를 프로토콜로 사용하여 filezilla를 통해 연결

따라서 서버에 연결된 사용자에 따라 git pullFileZilla는 스크립트를 트리거하지 않지만 다른 사용자에게는 스크립트를 트리거합니다. 모든 사용자는 bash 쉘을 사용하며 사용자에게 루트 권한이 있는지 여부에 관계없이 동작은 동일합니다.

요약하자면, 이 스크립트는 전역 구성이므로 일부 사용자에게는 실행되고 다른 사용자에게는 실행되지 않는 이유를 이해할 수 없습니다. 누군가가 /etc/profile.d스크립트가 실행되는 시기에 대한 세부 정보를 제공할 수 있다면 기쁠 것입니다.

답변1

배쉬에 관한 모든 것

bash매뉴얼 페이지에서 이 점부터 시작해 보겠습니다 .

bash가 대화형 로그인 셸 또는 options 가 포함된 비대화형 셸로 호출되면 --login먼저 /etc/profile 파일(파일이 있는 경우)에서 명령을 읽고 실행합니다. 파일을 읽은 후 ~/.bash_profile, ~/.bash_login, 를 순서대로 찾아 존재 ~/.profile하고 읽을 수 있는 첫 번째 파일부터 명령을 읽고 실행합니다. --noprofile이 옵션을 사용하면 쉘이 시작될 때 이 동작을 비활성화할 수 있습니다.

[...]

로그인 쉘이 아닌 대화형 쉘을 시작하면 bash는 ~/.bashrc파일이 존재하는 경우 명령을 읽고 실행합니다. --norc이 옵션을 사용하면 이를 억제할 수 있습니다. file --rcfile옵션은 bash가 ~/.bashrc.

그리고:

rshdBash는 과거 원격 셸 데몬(보통 ) 또는 보안 셸 데몬 에 의해 실행될 때와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다 sshd. bash가 이러한 방식으로 비대화형으로 실행 중이라고 판단하면 ~/.bashrc(파일이 존재하고 읽을 수 있는 경우) 명령을 읽고 실행합니다. 그렇지 않을 것이다

SSH에 대한 모든 것

명령을 지정하지 않고 원격 서버에 SSH로 접속하면...

ssh [email protected]

/etc/profile...이것은 서비스를 받을 수 있도록 로그인 셸을 시작합니다 .

반면에 명시적으로(에서와 같이) 또는 암시적으로(ssh 연결을 통해 실행되는 다른 도구를 사용하여) 명령을 실행하면ssh [email protected] somecommandgitrsync비대화형쉘이므로 서비스를 받을 수 없습니다 /etc/profile. 위에서 발췌한 세 번째 매뉴얼 페이지에서 볼 수 있듯이 bash파일은 비대화형 쉘임에도 불구하고 계속 읽혀집니다.~/.bashrc

도트 파일에 관한 모든 것

이 섹션에서 언급한 도트 파일의 특정 구성은 Fedora(및 아마도 대부분의 RHEL 파생 제품)에만 적용되지만가능한다른 배포판에도 동일하게 적용됩니다.

로그인 셸을 시작하면 bash는 를 읽습니다 /etc/profile. 스크립트에는 일반적으로 의 파일이 포함되어 있습니다 /etc/profile.d. 따라서 누군가가 를 실행하면 ssh user@serveraddress대화형 로그인 셸이 시작되어 bash가 를 읽게 되므로 스크립트 /etc/profile가 실행됩니다 logchk.sh.

대화형 비로그인 셸을 시작할 때또는예를 들어 네트워크 연결을 통해 비대화형 쉘을 시작하면 sshbash는 ~/.bashrc파일을 읽습니다. .bashrc사용자 계정에 대해 생성된 기본 파일은 다음과 같습니다.

if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

그리고/etc/bashrc 반품소스 스크립트는 에서 제공됩니다 /etc/profile.d.

따라서 누군가 기본 .bashrc파일을 가지고 있는 경우 SSH를 통해 명령을 실행하면(예: 실행 git pull user@repoaddress) 스크립트도 실행됩니다 logchk.sh. 그러나 ~/.bashrc계정의 기본 파일을 대체하거나 수정하여 더 이상 소스가 제공되지 않는 경우 명시적으로 결정하지 않는 한 /etc/bashrc스크립트를 실행하지 않습니다 ./etc/profile.d

이는 일부 사용자의 행동이 다른 이유를 설명할 수 있습니다.

관련 정보