애플리케이션 시나리오:

애플리케이션 시나리오:

대화형 쉘과 비대화형 쉘의 기본적인 차이점을 이해합니다. 그러면 로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?

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 터미널 버퍼, 다른 쉘 등)에서 쉘을 시작하면대화형, 비로그인껍데기. 쉘은 쉘 구성 파일( ~/.bashrcbash 호출의 경우 bash, zsh 및 csh /etc/zshrc의 경우 , POSIX/XSI 호환 쉘의 변수로 표시된 파일, 예 를 들어 호출 시 설정된 경우 및 mksh 등의 경우)을 읽을 수 있습니다.~/.zshrc/etc/csh.cshrc~/.cshrcENVsh$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은 가져오지 않습니다.

관련 정보