대화형 쉘과 비대화형 쉘의 기본적인 차이점을 이해합니다. 그러면 로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?
a의 사용 예를 들어주실 수 있나요?비로그인 상호작용껍데기?
답변1
로그인 쉘은 대화형 세션에 로그인할 때 사용자 ID로 실행되는 첫 번째 프로세스입니다. 로그인 프로세스는 쉘이 로그인 쉘로 작동하도록 지시하고 다음 규칙을 따릅니다. 일반적으로 -
문자(예 -bash
: 일반적으로 bash
) 가 앞에 붙는 쉘 실행 파일의 이름인 인수 0을 전달합니다 . 로그인 쉘은 일반적으로 환경 변수 설정과 같은 작업을 수행하는 파일을 읽습니다. 기존 Bourne 쉘 /etc/profile
의 경우 bash † , zsh † 및 csh 등이 있습니다 .~/.profile
~/.bash_profile
/etc/zprofile
~/.zprofile
/etc/csh.login
~/.login
텍스트 콘솔에 로그인하거나 SSH를 통해 또는 다음 su -
을 사용하여 로그인하는 경우대화형 로그인껍데기. 그래픽 모드(inX 디스플레이 관리자), 로그인 셸은 없지만 세션 관리자 또는 창 관리자는 제공됩니다.
하나를 실행하는 경우는 거의 없습니다.비대화형 로그인쉘이지만 일부 X 설정에서는 디스플레이 관리자를 사용하여 로그인할 때 구성 파일을 읽을 수 있도록 이 작업을 수행합니다. 다른 설정(배포 및 디스플레이 관리자에 따라 다름)은 명시적으로 읽 /etc/profile
거나 ~/.profile
읽지 않습니다. 비대화형 로그인 쉘을 얻는 또 다른 방법은 터미널이 아닌 표준 입력을 통해 전달된 명령을 사용하여 원격으로 로그인하는 것입니다( ssh example.com <my-script-which-is-stored-locally
비대화형, 비로그인 쉘을 실행하는 것과 반대).ssh example.com my-script-which-is-on-the-remote-machine
기존 세션의 터미널(screen, X 터미널, Emacs 터미널 버퍼, 다른 쉘 등)에서 쉘을 시작하면대화형, 비로그인껍데기. 쉘은 쉘 구성 파일( ~/.bashrc
bash 호출의 경우 bash
, zsh 및 csh /etc/zshrc
의 경우 , POSIX/XSI 호환 쉘의 변수로 표시된 파일, 예 를 들어 호출 시 설정된 경우 및 mksh 등의 경우)을 읽을 수 있습니다.~/.zshrc
/etc/csh.cshrc
~/.cshrc
ENV
sh
$ENV
~/.mkshrc
쉘이 명령줄에 전달된 스크립트나 명령을 실행할 때,비대화형, 비로그인껍데기. 이러한 쉘은 항상 실행됩니다. 프로그램이 다른 프로그램을 호출할 때 실제로 다른 프로그램을 호출하는 쉘에서 작은 스크립트를 실행하는 것은 매우 일반적입니다. 이 경우 일부 쉘은 시작 파일을 읽습니다(bash는 변수로 표시된 파일을 실행하고 BASH_ENV
, zsh는 /etc/zshenv
및 를 실행합니다 ~/.zshenv
). 그러나 이는 위험합니다. 쉘은 다양한 컨텍스트에서 호출될 수 있으며 그럴 가능성은 거의 없습니다. 할 수 있는 일이 아닙니다. 뭔가를 깨뜨려보세요.
† 조금 단순화했습니다. 자세한 내용은 설명서를 참조하세요.
답변2
로그인 셸에 있는지 확인합니다.
prompt> echo $0
-bash # "-" is the first character. Therefore, this is a login shell.
prompt> echo $0
bash # "-" is NOT the first character. This is NOT a login shell.
Bash에서는 다음을 사용할 수도 있습니다.shopt login_shell
:
prompt> shopt login_shell
login_shell off
(또는 on
로그인 쉘에서).
man bash
(검색통화)에서 정보를 확인하실 수 있습니다 . 다음은 발췌 내용입니다:
로그인 쉘에 대한 인수가 없는 첫 번째 문자는 -이거나 --login 옵션으로 시작됩니다.
직접 테스트해 볼 수 있습니다. SSH를 사용할 때마다 로그인 셸을 사용하게 됩니다. 예를 들어:
prompt> ssh user@localhost
user@localhost's password:
prompt> echo $0
-bash
로그인 쉘 사용의 중요성은 로그인 쉘의 모든 설정이 /home/user/.bash_profile
적용된다는 것입니다. 관심이 있으시면 여기에서 자세한 정보를 확인하세요( 를 통해 man bash
).
"bash가 --login 옵션을 사용하여 대화형 로그인 셸 또는 비대화형 셸로 호출되면 먼저 /etc/profile 파일(파일이 있는 경우)에서 명령을 읽고 실행합니다. 파일을 읽은 후 for
~/.bash_profile
,~/.bash_login
, , 순서대로~/.profile
존재하고 읽을 수 있는 첫 번째 명령에서 명령을 읽고 실행합니다. 이 동작을 억제하려면 셸을 시작할 때 --noprofile 옵션을 사용할 수 있습니다.
답변3
Gilles의 탁월한 답변에 대해 자세히 설명하고 이를 로그인 셸 유형을 확인하는 Timothy의 방법과 결합하겠습니다.
직접 보고 싶다면 아래 클립과 장면을 시청해 보세요.
쉘이 (비)대화형인지 확인하십시오.
if tty -s; then echo 'This is interactive shell.'; else echo 'This is non-interactive shell.'; fi
쉘이 로그인되어 있는지 확인하십시오.
출력이 echo $0
로 시작 하면 -
로그인 쉘입니다( echo $0
예: 출력: ) -bash
. 그렇지 않으면 비로그인 쉘입니다( echo $0
예제 출력: ) bash
.
if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "This is login shell."; else echo "This is non-login shell."; fi;
위의 두 가지를 결합하여 한 번에 두 가지 정보를 얻습니다.
THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
THIS_SHELL_LOGIN_TYPE='non-login';
if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"
애플리케이션 시나리오:
특별한 옵션이 없는 일반적인 SSH 세션
ssh [email protected]
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_INTERACTIVE_TYPE='non-interactive';
ubuntu@ip-172-31-0-70:~$ THIS_SHELL_LOGIN_TYPE='non-login';
ubuntu@ip-172-31-0-70:~$ if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi;
ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
ubuntu@ip-172-31-0-70:~$ echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"
interactive/login
스크립트를 실행하거나 새 셸을 통해 명시적으로 실행합니다.
ubuntu@ip-172-31-0-70:~$ bash -c 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi;
echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
interactive/non-login
원격으로 로컬 스크립트 실행
ssh [email protected] < checkmy.sh
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1083-aws x86_64)
non-interactive/login
SSH를 통해 원격으로 명령 실행
ssh [email protected] 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
non-interactive/non-login
-t
스위치를 사용하여 SSH를 통해 원격으로 명령 실행
-t
스위치를 사용하여 SSH를 통해 원격으로 명령을 실행하려는 경우 대화형 셸을 명시적으로 요청할 수 있습니다.
ssh [email protected] -t 'THIS_SHELL_INTERACTIVE_TYPE='non-interactive'; THIS_SHELL_LOGIN_TYPE='non-login'; if tty -s; then THIS_SHELL_INTERACTIVE_TYPE='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then THIS_SHELL_LOGIN_TYPE='login'; fi; echo "$THIS_SHELL_INTERACTIVE_TYPE/$THIS_SHELL_LOGIN_TYPE"'
interactive/non-login
참고: 명령이 원격으로 실행되는 이유에 대한 login shell
추가 정보 는 없습니다.여기.
답변4
GUI의 새 터미널에서 시작된 쉘은 로그인이 아닌 대화형 쉘이 됩니다. 예를 들어 .bashrc는 가져오지만 .profile은 가져오지 않습니다.