대화식이 아닌 로그인 쉘이있을 수 있습니까?


11

이 순서도 해석에서

여기에 이미지 설명을 입력하십시오

나는 남자 배쉬에서 그것을 발견했다.

bash가 대화식 로그인 쉘 또는 --login 옵션을 사용하는 비 대화식 쉘로 호출되면 해당 파일이 존재하는 경우 먼저 / etc / profile 파일에서 명령을 읽고 실행합니다.

것을 그 상태 대화 형 로그인 쉘 읽기 /etc/profile(--noprofile없이)

또한 read 옵션이있는 비 대화식--login/etc/profile

즉 몇 가지 가능한 떠날 것 같다 로그인 쉘 (있는 $0로 시작을 -)되고 있음을 비 대화 형이 (어쩌면 간단 등의 스크립트를 실행 date) 읽을 수 있습니다 (소스) /etc/profile.

이 아이디어를 확인하거나 거부하려면

먼저을 사용 su -l -하여 로그인 쉘을 -첫 번째 문자로 시작했지만 비 대화식으로 만들지 못했습니다 (테스트를 표시하여 테스트 할 수 없음).

같은 것을 호출

$ bash -c 'date' -bash

로그인 쉘로보고하지 않습니다 (첫 번째 문자가 인 경우에도 -).

세부 사항을 밝히려면 이것을 시도하십시오.

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0A가 가지고 -첫 번째 문자로, 전혀 없다 i의 값 (상호 작용) $-하지만이보고되지 login_shell합니다 (-u). 이 경우 / etc / profile을 읽지 못했지만 이것이 올바른 테스트인지 확실하지 않습니다.


이 질문에 " 특별하지 않은 드문 비 대화식 로그인 쉘" 대한 언급도 있습니다 .


이 사람결론/etc/profile 은 항상 읽었다 는 것 입니다.

요약 테이블 읽기 : 대화식 및 비 대화식 로그인 쉘 모두 읽기 /etc/profile


그리고, 경우 이 페이지에서 예 올바른지 :

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

읽은 exec su - bob -c 'env'보고서 테스트 /etc/profile.


한마디로 :

그것은 가질 수 있습니다 비 대화 형 로그인 (또는 -l --login 호출되지 않음) 쉘을?

그리고 사실이라면 /etc/profile파일을 읽고 있습니까?

위의 내용이 사실이라면 모든 로그인 셸 (대화 형)이 / etc / profile ( --noprofile옵션 없이 )을 읽는 다고 결론을 내립니다 .

참고 : / etc / profile을 읽고 있음을 감지하려면 파일의 맨 앞에 다음 명령을 추가하십시오.

echo "'/etc/profile' is being read"

답변:


2

비 대화식 로그인 쉘은 드물지만 가능합니다. 0 번째 인수 (보통 실행 파일 이름)를 사용하여 셸을 시작하면으로 시작하는 문자열로 설정되며 -대화식 여부에 관계없이 로그인 셸입니다.

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

bash -c date -bash쉘이 로그인 쉘이라고 말하지 않기 때문에 시도 가 작동하지 않았습니다. 제로 인수는 bash아닙니다 -bash. bash가 시작된 후에는 변수 $0-bash0 번째 인수 대신으로 설정 하지만 0 번째 인수가 중요합니다.

당신이 가진 비 대화식 로그인 쉘 실행할 수 있습니다 su -l또는 su -, 그러나 당신은하지 터미널 동안은 여전히 수있는 권한을 부여하는 (암호를 입력 할 필요없이, 또는 암호의 시작이 될 수 있도록 배열로 표준 입력을 준비 할 필요가 입력). sudo true존재 자격 증명을 얻기 위해 sudo : run 을 사용하는 것이 더 쉬울 수 있으며 자격 증명이 여전히 유효한 run echo 'shopt -p login_shell; echo $-' | sudo -i입니다.

로그인 셸과 비 로그인 셸의 차이점을 참조하십시오 .


4

다음과 같은 그래픽 로그인 환경을 보았습니다.

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

또는 이에 상응하는 것 :

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

따라서 세션 초기화 파일 ( ~/.profileBourne과 같은 쉘 (및 /etc일부 는 해당 쉘 ))을 읽고 적용 할 수 있습니다.

첫 번째는 모든 쉘에서 작동하지 않습니다. -l은 많은 수의 쉘에서 지원하지만 전부 는 아니지만 csh/ 과 같은 일부 tcsh에서는와 함께 사용할 수 없습니다 -c. 의 첫 번째 문자 argv[0]의 존재는 -그 무엇의로,하지만 모든 쉘에 의해 이해 login가 로그인 쉘있는 쉘에게 사용합니다.

두 번째 경우, 해당 쉘의 stdin은 tty장치 가 아닌 다른 것 ( <<임시 일반 파일 또는 쉘에 따라 파이프로 구현 됨)이므로 쉘은 대화식이 아닙니다 (인간 상호 작용시 대화식 정의) 그것으로).


첫 번째는 --login옵션을 사용하는 것입니다. 두 번째로, exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"(C qoutes로 인코딩 됨) $'/etc/profile read\nshopt -s login_shell\nbash himBH'그렇게하면 로그인이지만 대화 형입니다. 로그인과 비대화식이 필요합니다 . 내가 무엇을 놓치고 있습니까?

@sorontar와 <<<"$-"그, $-때문에 큰 따옴표의 호출 쉘에 의해 확장됩니다. 호출 된 쉘은 stdin이 tty가 아니므로 대화식이 아닙니다.
Stéphane Chazelas

아 맞아요, 선생님 그러나 실수를 수정하면 다음과 같이 할 수 있습니다. exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOF확인을 받으려면 : $'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB'비 대화식 로그인 셸이 가능하며 여전히 읽습니다 /etc/profile. 모든 로그인 쉘이 읽었다 고 결론 내릴 /etc/profile까요?

KSH 그것이이다 꽤 명확 있음을하게 비 대화 형 로그인 쉘 , 시도 exec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF:).

1
@ sorontar, 나는 대부분의 쉘 구현이 로그인 쉘로 호출 될 때 세션 초기화 파일을 읽을 것으로 기대할 수 있다고 생각합니다. 그것들은 쉘 구현과 버전에 달려 있습니다. 의 경우 bash시작 파일 처리가 상당히 엉망인 IMO이므로 일부 시스템은 더 많은 변형을 추가하여보다 합리적인 동작을하도록 패치했습니다.
Stéphane Chazelas

3

예, 비대화 형 로그인 셸이 가능합니다

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

이는 다음과 유사합니다 su -c 'echo hello' -.. 우리가 필요한 것을 테스트 su -c 'echo $0 $-; shopt -p login_shell' -하기 위해 다음 과 같이 작성해야합니다. 이 확실한 답을 얻으려면 (C 따옴표로 인코딩) : $'/etc/profile read \n -su hBc \n shopt -s login_shell'. 이는 비 대화식 로그인 로그인 이 수행되었고 프로세스에서 / etc / profile을 읽었 음을 확인합니다. 감사.

0

비 대화식 로그인 셸을 사용할 수 있습니까 (--login 또는 -l과 함께 호출되지 않음)?

예.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

그러나 인수가 제공 /etc/profile되지 않으면 비 대화식 로그인 쉘에는 사용되지 않습니다 --login.

비 대화식 로그인 셸을 호출하는 일반적인 관용구는 다음과 같습니다.

$ su - someuser -c somecommand

그러나 이것은 /etc/profile실행되지 않는 사실을 겪습니다 .

이 동작을 변경할 수는 있지만 config-top.h 에있는 옵션의 주석 처리를 제거하여 컴파일시 Bash 소스 코드를 사용자 정의해야합니다 .

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

나는이 때 이 연구 su이상 , 나는 다른 쉘을 포함 발견 zsh하고 dash이러한 차이가 없습니다.

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