원격 Bash 소스가 .bashrc 대신 .bash_profile인 이유는 무엇입니까?

원격 Bash 소스가 .bashrc 대신 .bash_profile인 이유는 무엇입니까?

배쉬 매뉴얼설명하다:

rshdBash는 원격 쉘 데몬(보통 쉘 데몬 )이나 보안 쉘 데몬 에 의해 실행되는 경우와 같이 네트워크 연결에 연결된 표준 입력을 사용하여 실행 중인지 확인하려고 시도합니다 sshd. Bash가 이런 방식으로 실행 중이라고 판단하면 ~/.bashrc파일이 존재하고 읽을 수 있으면 명령을 읽고 실행합니다 .

이 Bash 소스는 다음 ~/.bashrc과 같습니다.

ssh user@host :

하지만 이 Bash 소스는 다음과 같습니다 ~/.bash_profile.

ssh user@host

사양에 따르면 이 두 명령 사이에는 아무런 차이가 없습니다. 두 경우 모두 표준 입력이 네트워크 연결에 연결되어 있지 않습니까?

답변1

로그인 쉘은 먼저 를 읽은 /etc/profile다음 을 읽습니다 ~/.bash_profile.

비로그인 쉘을 읽은 /etc/bash.bashrc다음 ~/.bashrc.

이것이 왜 중요합니까?

다음 줄 때문에 man ssh:

만약에주문하다지정되면 로그인 쉘이 아닌 원격 호스트에서 실행됩니다.

즉, ssh 명령에 명령이 아닌 옵션만 있는 경우 예를 들면 다음과 같습니다.

ssh user@host

로그인 쉘이 시작되고 로그인 쉘이 읽습니다 ~/.bash_profile.

SSH 명령에는주문하다, 좋다:

ssh user@host :

명령이 가는 곳 :(또는 아무것도 하지 않는 곳).
그럴 것이다아니요~/.bashrc내용을 읽을 수 있도록 로그인 셸을 시작합니다 .


원격 표준 입력

원격 시스템의 /dev/stdin에 제공되는 tty 연결은 실제 tty이거나 다른 것일 수 있습니다.

을 위한:

$ ssh isaac@localhost
/etc/profile sourced

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

$ ls -la /proc/self/fd/0
lrwx------ 1 isaac isaac 64 Dec 24 19:34 /proc/self/fd/0 -> /dev/pts/3

$ ls -la /dev/pts/3
crw--w---- 1 isaac tty 136, 3 Dec 24 19:35 /dev/pts/3

시작된 bash에서 볼 수 있듯이 TTY(네트워크 연결 아님)로 끝납니다.

명령을 사용하여 SSH 연결의 경우:

$ ssh isaac@localhost 'ls -la /dev/stdin'
isaac@localhost's password: 
lrwxrwxrwx 1 root root 15 Dec 24 03:35 /dev/stdin -> /proc/self/fd/0

TTY 목록은 동일하게 시작되지만 /etc/profile은 소스가 아닙니다.

$ ssh isaac@localhost 'ls -la /proc/self/fd/0'
isaac@localhost's password:
lr-x------ 1 isaac isaac 64 Dec 24 19:39 /proc/self/fd/0 -> pipe:[6579259]

이는 연결이 파이프(네트워크 연결이 아님)임을 쉘에 알려줍니다.

따라서 두 테스트 사례 모두에서 쉘은 연결이 네트워크에서 오는지 알 수 없으므로 읽지 않습니다 ~/.bashrc(네트워크 연결에 대해서만 이야기하는 경우). ~/.bashrc를 읽지만 다른 이유가 있습니다.

답변2

'어떻게'가 아니라 '왜'라고 물으셨으니, 그런 관점에서 답변해 보도록 하겠습니다. 과거에 일어난 일이 오늘날 일어나는 일로 이어진 이유에 대한 자세한 설명은 다음과 같습니다.


두 개의 서로 다른 시작 파일("profile"과 "rc")이 있는 이유는 과거에 컴퓨터에서 일이 작동했던 일반적인 방식이 다음과 같았기 때문입니다.

  1. 실제 터미널이나 다른 워크스테이션에서 로그인하여로그인 쉘. 쉘은 사용자를 위한 환경을 호출 /etc/profile하고 설정합니다.~/.profile

  2. 사용자가 들어가고 싶은 환경을 호출합니다. 환경은 Xorg일 수도 있지만 대부분의 경우 GNU 화면과 같은 멀티플렉서입니다.

  3. 그런 다음 환경(예: GNU 화면)은 상위 로그인 쉘에서 환경을 상속하는 추가(비로그인) 쉘을 호출합니다.

csh이는 개발 중에 UNIX 시스템에 로그인하는 일반적인 방법입니다 bash. 그래서~/.profile다시 읽는 것은 낭비로 간주됩니다어쨌든 환경을 상속받는 쉘에서.

bash그런 다음 ~/.bashrc이러한 비로그인 셸에 대한 추가 구성을 추가합니다. csh(및 tcsh) 비로그인 쉘에는 어떠한 종류의 "rc" 파일도 추가하지 마십시오. csh/ 는 tcshBourne 쉘(POSIX의 일부)과 호환되는 쉘이 아니지만 Bourne 쉘과 호환됩니다 bash. 또 다른 Bourne 호환 쉘은 정의된 경우 비로그인 실행 명령("rc") 파일로 사용되는 ksh환경 변수( 라고 함)를 추가합니다 .ENVksh

그렇습니다. 최신 버전의 Bourne 셸에는 GNU 화면(또는 유사한 화면)과 혼합된 셸에 표시되지만 사용자의 화면에는 표시되지 않는 별칭 및 기타 빠른 옵션의 사용을 용이하게 하기 위해 추가 구성 파일이 추가됩니다. 처음 들어갈 때 받아요. 기계.

GDM(그래픽 디스플레이 관리자)이 등장하면서 GDM에는 자체 초기화 파일(예: ~/.xinit~/.xsession)이 있기 때문에 "프로필" 파일과 "rc" 파일 간의 구별이 의미가 없게 되었습니다. 그런 다음 GDM 내부에 선언된 쉘은 사용자의 희망에 따라 로그인 쉘 또는 비로그인 쉘이 될 수 있으며, 비로그인 쉘이 항상 로그인 쉘의 상위를 갖는 상황은 더 이상 유효하지 않습니다.

추가의

내 것 중 하나좋아하는 테이블쉘 시작 파일을 비교하면 Bourne 쉘 호환 쉘이 이러한 profile파일을 사용하는 반면 다른 쉘은 사용하지 않는 방법을 알 수 있습니다. 과거에는 초기 셸(먹서를 시작한 셸)이 Bourne 호환 셸이어야 했기 때문입니다.

관련 정보