대화식 로그인 및 비 대화식 비 로그인 셸 차별화


25

로그인, 비 로그인, 대화식 및 비 대화식 이라는 네 가지 용어를 차별화하려고합니다 .

  • 대화식-로그인 쉘
  • 대화식-비 로그인 쉘
  • 비 대화식-로그인 쉘
  • 비 대화식-비 로그인 셸


대화식-비 로그인 쉘 이해 : 시스템을 시작하고 시스템에 로그인 한 후 터미널 및
비 대화식 로그인 쉘을 엽니 다 : telnet to system and login

그러나 대화식 로그인 쉘은 어떻습니까?
시스템에 로그인하고 가상 터미널을 열고 로그인합니까? 및
비 대화 형 - 비 로그인 쉘, 그것은의 crontab에 스크립트를 자동으로 실행하고 있습니까?

답변:


38

당신이 가진 유일한 오해는 비 대화식 로그인 쉘을 구성하는 것에 관한 것입니다.

간단한 예 ( 자세한 내용 은 여기 참조) :

  • 대화식 로그인 셸 : 예를 들어을 통해 원격 컴퓨터에 로그인 ssh합니다. 또는 로컬 컴퓨터의 tty ( Ctrl+ Alt+ F1)로 드롭하여 로그인하십시오.

  • 대화식 비 로그인 쉘 : 새 터미널을 엽니 다.

  • 비 대화식 비 로그인 셸 : 스크립트를 실행합니다. 모든 스크립트는 자체 서브 쉘에서 실행되며이 쉘은 대화식이 아닙니다. 스크립트를 실행하기 위해 열리고 스크립트가 완료되면 즉시 닫힙니다.

  • 비 대화식 로그인 셸 : 이것은 매우 드물기 때문에 발생하지 않을 것입니다. 하나를 시작하는 한 가지 방법은입니다 echo command | ssh server. 때 ssh명령없이 실행됩니다 (그래서 ssh대신 ssh command하는 실행 command원격 쉘)는 로그인 쉘을 시작합니다. 는 IF stdin의가 ssh청각 장애 아니라, 비 대화 형 쉘을 시작합니다. 이것이 echo command | ssh server비 대화식 로그인 쉘을 시작하는 이유 입니다. 로 시작할 수도 있습니다 bash -l -c command.

이 문제를 해결하려면 다음과 같이 다양한 유형의 쉘을 테스트 할 수 있습니다.

  • 이 쉘은 대화식입니까?

    $-변수 의 내용을 확인하십시오 . 대화식 쉘의 경우 다음이 포함됩니다 i.

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
  • 이것은 로그인 쉘입니까?

    없다 아무 휴대용 방법 배쉬를 들어,이 경우 확인할 수 있습니다,이 검사는하지만 login_shell옵션이 설정됩니다

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on

이 모든 것을 종합하면 가능한 각 쉘 유형 중 하나가 있습니다.

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on

1) 저에게 gui에 로그인하는 것은 시스템을 시작하고 시스템에 로그인하고 터미널을 여는 것을 의미합니다. 2) telnet 또는 ssh는 대화 형 로그인 셸 non-interactive login shell입니다.
데이지

설명을위한 @daisy 감사합니다; 답변이 수정되었습니다.
terdon

괜찮 및 GUI 관련이없는, 대화 형 비 로그인 쉘은 다음과 같습니다 단지 텔넷 또는 SSH를 통해 로컬 또는 원격으로 새 터미널을 엽니 다
데이지

@daisy yep, 맞습니다. 그러나 Muru의 대답을 주의 깊게 읽으십시오 . 기본적으로 이것은 의미의 문제이며 셸에서 시작 파일을 읽는 데만 영향을 미친다는 점을 설명합니다. 다양한 쉘 유형에 대한보다 포괄적 인 개요는 여기 를 참조 하십시오 .
terdon

비 대화식 로그인 쉘은 드문 일이 아닙니다. 예를 들어 git은 IIRC를 사용합니다.
quazgar

6

본질적으로 쉘이 로그인했는지 아닌지, 대화 형인지 또는 정확히 한 가지 이유로 중요하지 않은지 여부 :

초기화 파일 및 기본 옵션 세트는 쉘의 로그인 여부와 대화식 여부에 따라 다릅니다.

이에 따라 쉘이 로그인인지 아닌지 대화식인지 아닌지 여부는 사용 된 호출 ( 정확한 명령 이름 및 옵션) 에 따라 다릅니다 .

두 가지 속성은 쉘이 로그인했는지 여부에 관계없이 쉘이 대화식인지 아닌지를 결정하는 것과 관련이 없는지 여부에 관계없이 직교합니다.

다음 중 하나라도 해당되면 Bash가 로그인 쉘을 시작합니다.

  • argv[0]호출 된 명령의 이름은 -
  • -l옵션이 지정

마찬가지로 bash는 다음 중 하나에 해당하는 경우 대화식 쉘을 시작합니다.

  • 실행할 파일 (예 : 명령이 아니었다 bash some/file) 또는 실행할 명령 문자열 ( bash -c 'foo') 이 지정되지 않았습니다 (실제 조건은 좀 더 복잡합니다. 매뉴얼 참조).
  • -i옵션 지정

특히 (역설적으로) 후자 bash -ic 'foo'는 대화식 쉘 을 시작 한다는 것을 의미합니다 .

따라서 다음은 대화식 쉘에 로그인이 시작되고 호출과는 아무런 관련이 없지만 대화식 쉘은 로그인을 시작합니다.

bash -lic true

콘솔이나 GUI를 통해 로그인하면 로그인 셸이 시작되거나 로그인이 전적으로 적절한 호출을 사용하여 로그인 프로세스의 영향을받습니다.

조건과 효과는 bash 매뉴얼의 시작 파일 섹션에 자세히 설명되어 있습니다.


혼동의 주요 원인은 "로그인"쉘에 대한 또 다른 공통의 의미가 있다는 것입니다.

사용자의 로그인 쉘은 해당 사용자 passwd항목에 정의 된 쉘입니다 ( /etc/passwdLDAP 또는 다른 소스 에서 제공 될 수 있음 ).

login프로그램, SSH 등은 등이 쉘 시작 로그인 답의 나머지 부분에서 의미 의미에서 쉘 - 선도적으로 -명령 이름으로, 일반적으로. 특히 혼란 스러우 길 원한다면 다음과 같이 말할 수 있습니다.

일부 로그인 프로세스는 사용자의 로그인 쉘을 로그인 쉘로 시작합니다.

GUI 로그인은 개발자가 편리하다고 생각했기 때문에 순수하게 로그인 셸을 시작한다는 점에 유의하십시오. LightDM은 분명히 대화식이 아니며 사용자의 로그인 셸 (두 번째 의미)에 의존하지 않는 로그인시 스크립트를 실행합니다. 로그인 셸을 시작하는 디스플레이 관리자에 의존하지 마십시오. 모든 로그인 관리자가 아니라 Wayland 및 GNOME에서는 로그인 프로세스가 셸 스크립트를 전혀 사용하지 않습니다.


3

로그인 쉘 :

세션에 로그인 할 때 사용자 ID로 실행되는 첫 번째 프로세스입니다. 로그인 프로세스는 쉘이 다음과 같은 규칙을 사용하여 로그인 쉘로 동작하도록 지시합니다. 인수 0 (일반적으로 쉘 실행 파일의 이름이며 "-"문자가 앞에 붙음)

대화식 쉘 :

tty의 사용자 입력에서 명령을 읽습니다. 무엇보다도 이러한 셸은 활성화시 시작 파일을 읽고 프롬프트를 표시하며 기본적으로 작업 제어를 활성화합니다. 사용자는 쉘과 상호 작용할 수 있습니다. 스크립트를 실행하는 쉘은 항상 비 대화식 쉘입니다.

간단히 말해 : 대화식 쉘에는 사용자 입력이 필요하지만 비 대화식 쉘은 스크립트에 의해 실행되며 사용자 입력이 필요하지 않습니다.


따라서 올바른 예가 제공됩니다.
데이지

예, 당신의 올바른 장소에 데이지.
George Udosen 's

1
@ 데이 지아! GUI는 그것과 전혀 관련이 없습니다. 이것은 그래픽 셸이 아닌 명령 줄 셸에 관한 것입니다 (이것은 존재하지만 다른 짐승입니다).
terdon

1
@George 아니오, 두 가지 실수가 있습니다 : GUI를 통해 로그인하면 로그인 쉘 (또는 다른 종류의 관련 쉘)이 시작되지 않고 텔넷을 통해 원격 시스템에 로그인하면 텔넷 쉘이 시작되지만 ssh를 통해 대화 형 로그인이 시작됩니다 껍질.
terdon

1
@George 사실, 나는 정정되었다. 일부 GUI 로그인 관리자는 로그인 쉘을 시작하여 읽을 수 있습니다 .profile( .profile수동으로 소스를 작성했다고 생각 하지만 잘못되었을 수 있습니다 ).
terdon

0

다음과 같은 방법으로 대화 형 로그인 셸을 시작할 수 있습니다.

  1. sudo /bin/login자격 증명 실행 및 입력
  2. 실행 exec -l /bin/bash
  3. 실행 su -
  4. 위의 답변과 같이 ssh를 사용하여 원격 시스템에 로그인하십시오.

또한 입력하여 쉘이 로그인했는지 (bash에서) 확인할 수 echo $0있고 출력이 dash로 시작 -하면 로그인 쉘입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.