비 대화식 로그인 셸이 있습니까? 및 로그인 / 비 로그인 쉘의 차이점이

대화 형 / 비 대화 형 및 로그인 / 비 로그인 쉘의 차이점이 무엇인지 알고 있지만 실제로 는 스크립트 와 같은 것이 없으면 실제로는 비 대화 형 로그인 쉘이없는 /bin/bash --login some-script.sh것처럼 보입니다. 조금 이상합니다). 이것이 맞습니까, 아니면 더 흔합니까?



답변

맨 페이지 의 호출 섹션에 설명 된대로 Bash의 로그인 개념과 비 로그인 및 대화 형 및 비대화 형 Bash 쉘에 대해 이야기한다고 가정합니다 . (이것은 파일 에서 “쉘”(또는 사용자 명령 해석기)로 사용 된 임의의 명령에 대한 James Youngman의 답변 해석 passwd(5)과 해당 프로그램이 사용자 입력을 허용하는지 여부와 는 다릅니다 /usr/sbin/nologin. )

당신은 올바른 /bin/bash --login some-script.sh비 대화식 로그인 배쉬 호출을 생성 할 것이다, 이것은 아마도 병적 인 예이다. 비대화 형 로그인 쉘을 생성하는 경우는 드물지만 실제로 이상하지 않은 경우가 있습니다 ssh somehost < some-file. 여기 sshd에 강타를 시작 argv[0]으로 일련의 -bash표준 입력이 단자에 연결되어 있지 않기 때문에, 배쉬 자체가 로그인 쉘 고려하는 원인이 실행하는 명령을 제공하지 있기 때문에,하지만, 배쉬는 대화 형 모드로 자신을 설정하지 않습니다 ( $-포함되지 않습니다 i) .

(개인적으로,이 경우는 대화식보다 훨씬 합리적 입니다. 이는 위와 같이 ssh somehost somecommand새로 로그인하더라도 “로그인 쉘”로 간주되지 않습니다 somehost.)

나는 최근에 내가 오래 전에해야했던 일을하고 Bash의 모드 테이블과 init 파일이 실행되는 것을 정리했습니다 . 당신이 그것을 혼란스럽게 생각한다면, 적어도 나도 그렇게 생각하십시오. 그것은 언제 .bashrc실행될 때에 관한 규칙을 가지고 그들의 원래 목표가 무엇인지를 신비하게 만듭니다.


답변

새로 설치된 시스템의 개수에 따른 대부분의 로그인 쉘은 실제로 비 대화식입니다.

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

분명 /bin/bash하고 /bin/sh기존의 포탄 그리고 그들은 대화 형입니다. 그러나이 목록의 다른 모든 항목은 대화식이 아닙니다. 목록을 읽고 있는데 그 중 하나가 무엇인지 모른다면 매뉴얼 페이지를 찾아보십시오 (예 : man nologin또는 man sync).

명령이 실제로하는 일

Captain Man의 게시 기록을 보면 Unix에 대한 경험이 부족하다는 것을 알 수 있습니다. 따라서 단순히 출력이 아니라 대답의 맨 위에있는 명령 줄과 관련이 없다는 주석의 질문 일 수 있습니다. 이 질문에 대해서는 주제가 아닌 내용이더라도 명령 줄에 대해서도 설명하겠습니다.

명령은 유닉스 파이프 라인 입니다. 파이프 라인은 일련의 명령입니다. 왼쪽에서 오른쪽으로 읽으면 첫 번째 명령의 출력이 두 번째의 입력이되고 두 번째의 출력이 세 번째의 입력이됩니다. 파이프 라인의 끝. 마지막 프로세스의 출력은 리디렉션되지 않은 경우 터미널에 표시됩니다. 자세한 정보 는 쉘 파이프 라인의 Wikipedia 항목 을 참조하십시오.

파이프 라인이 무엇을하고 있는지 이해하지 못하는 경우 간단히 파이프 라인으로 실행하여 현재 상황을 확인할 수 있습니다. 사용중인 명령 (여기서 awk, sortuniq)에 대한 매뉴얼 페이지를 읽을 수도 있습니다 . 사실, 지금해야합니다. 기다릴게.

파이프 라인 단계를 점진적으로 실행 해 봅시다 (자신의 유닉스 시스템에서 안전하게 수행 할 수 있습니다).

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

위의 결과는 단순히 /etc/passwd파일 의 일곱 번째 필드 내용입니다 . 그것은 모든 사람의 로그인 쉘이 무엇인지 시스템에 알려주는 (플랫 텍스트 파일) 데이터베이스입니다. 당신이 그것에 대해 더 자세히 알고 싶다면 /etc/passwd그냥 읽으십시오 (세계가 읽을 수있는). 그리고 매뉴얼 페이지를보십시오 (man 5 passwd).

따라서 전체 목록을 읽으면 인기있는 항목이 무엇인지 알 수 있지만이 질문에 대한 대답에는 적합하지 않습니다. 질문은 실제로 비 대화식 쉘이 얼마나 일반적인 지에 관한 것이기 때문입니다. 세어 보자. 가장 간단한 방법은 항목을 먼저 정렬하는 것입니다.

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

이 프로그램 uniq을 사용 하여 고유 한 항목 만 표시 할 수 있습니다 .

~ $ awk -F : ‘{print $ 7}'</ etc / passwd | 정렬 | 유니크 | sed -e ‘s / ^ / /’/ bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin

하지만 잠깐, 그건 쓸모가 없습니다. 각각 몇 개나 있었습니까? 물어 보자 uniq(man 페이지를 읽어보십시오!) :

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

그것은 물론 우리가 답의 맨 위에서 본 결과입니다. 항목을 순서대로 보려면 다시 정렬하십시오.

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

잠깐만 요, 맞지 않아요, 17은 23 다음에 1과 5 앞에옵니다. 문제는 항목들이 사전 식 으로 정렬되어 있다는 것 입니다. sort그것들을 숫자와 역순으로 정렬 하도록 요청합시다 :

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

나는 그것이 원래 답변의 모든 것을 설명한다고 생각합니다. 해당 명령이 수행하는 작업에 대한 세부 사항이 여전히 확실하지 않은 경우 매뉴얼 페이지를 읽을 수 있습니다. 아직도 무슨 일이 일어나고 있는지에 대해 잘 모를 경우, 유닉스와 리눅스를 설명하는 책 (온라인 또는 종이)을 읽는 것이 좋습니다.