로그인시 제공되는 스크립트 순서


41

내 모든 로그인 구성을에 집중하고 싶습니다 ~/.bash_profile. 거기에 있었다 ~/.bashrc가 기본적으로 그러나 나는 그것을 대체 ~/.bash_profile.

그러나 로그인 ~/.bash_profile하면 소스가 나오기 전에 무언가 가 다음과 같이 표시됩니다.

Linux ubnt10-dev1 2.6.32-38-server #83-Ubuntu SMP Wed Jan 4 11:26:59 UTC 2012 x86_64 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to the Ubuntu Server!
 * Documentation:  http://www.ubuntu.com/server/doc

  System information as of Fri May  9 12:17:39 EDT 2014

  System load:  0.01              Processes:           74
  Usage of /:   5.5% of 18.58GB   Users logged in:     0
  Memory usage: 4%                IP address for eth0: 123.x.x.x
  Swap usage:   0%

  Graph this data and manage this system at https://landscape.canonical.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Fri May  9 12:11:52 2014 from 123.x.x.x

내 Get에 정의 된 내 스플래시 인사말 만 표시되도록 제거하고 ~/.bash_profile싶지만 사용자가 로그인 할 때 소스 / 실행 된 스크립트의 논리 / 시퀀스에 대해 잘 모르겠습니다.

보너스로, 사용자가 로그인하여 세션을 시작할 때뿐만 아니라 시스템이 시작될 때 자동 소싱 / 실행 순서를 알고 싶습니다. 지금은 중요하지 않습니다.

답변:


53

이것은 복잡한 것입니다. 우선, 세부 사항은 실행중인 쉘의 종류에 따라 다릅니다. 자신표절 하기 :

  • gnome-terminal예를 들어 터미널 에뮬레이터를 열면 대화 형 비 로그인 셸이 실행됩니다.

  • 명령 행에서 머신에 로그인 하거나과 같은 명령 su - username을 실행하면 대화식 로그인 쉘 이 실행 됩니다.

  • 그래픽으로 로그인하면 완전히 다른 것을 실행하게됩니다. 세부 사항은 시스템 및 그래픽 환경에 따라 다르지만 일반적으로 로그인을 처리하는 것은 그래픽 쉘 입니다. (우분투 기본 포함) 많은 그래픽 쉘은 읽을 수 있지만 /etc/profile~/.profile그 모든는 않습니다.

  • 마지막으로 쉘 스크립트를 실행할 때 비 대화식 비 로그인 쉘에서 실행 됩니다.

bash가 시작될 때 읽을 파일은 실행중인 쉘의 유형에 따라 다릅니다. 다음은 man bash(강조 광산) 의 INVOCATION 섹션에서 발췌 한 것입니다 .

bash가 대화식 로그인 쉘 또는 --login 옵션을 사용하는 비 대화식 쉘로 호출 되면 파일이 존재하는 경우 먼저 / etc / profile 파일에서 명령을 읽고 실행 합니다. 해당 파일을 읽은 후 ~ / .bash_profile, ~ / .bash_login 및 ~ / .profile을 순서대로 찾고 존재하고 읽을 수있는 첫 번째 파일에서 명령을 읽고 실행합니다. 이 동작을 막기 위해 쉘을 시작할 때 --noprofile 옵션을 사용할 수 있습니다.

대화 형 쉘 입니다 로그인 쉘되지는 시작, bash는 읽기와에서 실행하는 명령을 /etc/bash.bashrc~ / .bashrc에 이 파일이 존재하는 경우. --norc 옵션을 사용하여이를 방지 할 수 있습니다. --rcfile 파일 옵션은 bash가 /etc/bash.bashrc 및 ~ / .bashrc 대신 파일에서 명령을 읽고 실행하도록합니다.

그것들은 초기화 파일입니다. 또한이 /etc/environment전역 환경 변수를 설정할 수 있지만 (이 실행하지만 변수 정의가 설정되어 있지 않습니다 내에서 명령) 그의는 공급보다는 읽어 보시기 바랍니다.

자, 당신이 보는 인사는 또 다른 것입니다. 이 설정되어 /etc/motd를 통해 표시됩니다 pam_motd. 에 설명 된대로 man motd:

/ etc / motd의 내용은 로그인 성공 후 로그인 쉘을 실행하기 직전에 pam_motd (8)에 의해 표시됩니다.

약어 "motd"는 "오늘의 메시지"를 나타내며,이 파일은 전통적으로 정확하게 사용되었습니다 (모든 사용자에게 보내는 메일보다 디스크 공간이 훨씬 적게 필요합니다).

데비안 GNU / 리눅스에서는 /run/motd.dynamic의 내용도 표시됩니다. 이 파일은 부팅시 /etc/init.d/motd에 의해 생성됩니다.

메시지를 제거하려면 /etc/motd파일을 비우고 /etc/init.d/motd존재 하는 경우 아무것도 생성되지 않는지 확인하십시오 .


어쨌든, 당신이 보여주는 결과에 따라, 당신은 대화 형 로그인 쉘을ssh 실행한다는 것을 통해 로그인하는 것처럼 보입니다 . 이것의 의미는 위를 참조하십시오. 요약하면, 로그인 할 때 관심이있는 것은 다음과 같은 순서로 제공됩니다.

  1. pam_motdPAM 라이브러리 의 모듈을 통한 SSH 데몬 은의 내용을 표시합니다 /etc/motd. pam_env모듈을 통해 /etc/environment및 에서 환경 변수를 설정합니다 ~/.pam_environment.
  2. 로그인 쉘이 시작되고 다음 파일을 순서대로 읽습니다.
    1. /etc/profile
    2. /etc/bash.bashrc(기본 우분투 /etc/profile소스 /etc/bash.bashrc).
    3. ~/.bash_profile. 여기에서 읽을 수있는 다른 파일 ( ~/.profile~/.bash_login)은 ~/.bash_profile존재 하므로 무시 됩니다.

5
이 문제를 스스로 발견하는 좋은 방법은 센티넬 변수를 배치하는 것입니다. 나는 내가 넣어 의미 export SET_IN_ETC_PROFILE=yes에서 /etc/profile, export SET_IN_HOME_ZSHRC=yes~/.zhshrc(내가 zsh을 사용자 오전) 재부팅 그리고 ... 등, 그리고 좋은는 env|grep SET_IN당신에게 모든 이야기를 말할 것이다. 데스크탑 응용 프로그램 (터미널을 사용하지 않고 대시 또는 WM에서 실행하는 변수)에 표시되는 변수를 보려면 askubuntu.com/a/356973/16395
Rmano

1
그래서 당신이 ssh 할 때, 그것은 대화식 쉘 일 것입니다. 맞습니까?
amphibient

@amphibient 대화식 로그인 셸, 예. 로컬 컴퓨터 둘러보기에서 터미널을 열면 비 대화식 대화 형 쉘입니다.
terdon

@Rmano 귀하의 의견을 표명했습니다. 그러나 잠시 후에 env명령의 순서가 실행 순서와 관련이 없다는 것을 알았습니다 .
Penghe Geng

2
@xiaobai는 물론 아닙니다. 요점은 SET_IN읽은 순서가 아니라 읽은 파일을 보여줍니다. 순서는 표준이며 내 답변에있는 맨 페이지 발췌 부분에 표시되어 있습니다.
terdon

1

ssh를 통해 로그인 할 때 표시되는 정보는 / etc / profile을보기 전에 생성됩니다. /etc/update-motd.d의 파일 순서를 살펴보십시오. 보고있는 메시지가 다양한 스크립트에 의해 생성되는 위치를 보여줍니다.


1
이것은 이미 최고 답변에 포함되어 있지만 귀하의 간결함에 감사드립니다. +1 :)
wjandrea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.