비대화형 로그인 쉘을 사용할 수 있습니까?

비대화형 로그인 쉘을 사용할 수 있습니까?

통역하다이 흐름도

여기에 이미지 설명을 입력하세요.

나는 man bash에서 다음을 발견했습니다.

bash가 --login 옵션을 사용하여 대화형 로그인 셸 또는 비대화형 셸로 호출되면 먼저 /etc/profile 파일(파일이 있는 경우)에서 명령을 읽고 실행합니다.

이는 다음을 나타냅니다.대화형 로그인셸 읽기 /etc/profile(--noprofile 제외)

반품,비대화형옵션 --login읽기 가 포함된 쉘/etc/profile

이것은 약간의 가능성을 남겨둔 것 같습니다.로그인쉘( $0로 시작 -)비대화형(아마도 이것처럼 간단한 스크립트를 실행하면 date) (source)를 읽지 못할 수도 있습니다 /etc/profile.

아이디어를 확인하거나 거부합니다.

su -l -먼저 a를 첫 번째 문자로 사용하여 로그인 셸을 시작하는 를 사용해 보았지만 -이를 비대화형으로 만드는 데 실패했습니다(그리고 이를 감지하는 테스트를 제공할 수 있었습니다).

다음과 같이 전화하십시오.

$ 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 입니다. 이는 값에 -(대화식으로) 존재하지 않지만 a(-u)로 보고되지 않습니다. 이 경우 /etc/profile은 읽혀지지 않지만 이것이 올바른 테스트인지는 확실하지 않습니다.i$-login_shell


또한 "희귀한 비대화형 로그인 쉘"도 언급되어 있습니다.이 답변에서이 질문에 대해서는 구체적이지 않습니다.


이것이 사람의 결론항상 읽혀 집니다 /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 [email protected]      # interactive login shell, `~/.profile`
$ ssh [email protected] env  # non-interactive non-login shell, `~/.bashrc`

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


간단히 말해서:

가질 수 있습니까?비대화형 로그인쉘(--login 또는 -l 없이 호출됨)?

/etc/profiletrue인 경우 파일을 읽고 있습니까 ?

위의 내용이 사실이라면 다음과 같이 결론을 내려야 합니다.모두로그인 쉘[대화형(또는 비대화형)]은 /etc/profile을 읽습니다( --noprofile옵션 없음).

참고: /etc/profile을 읽고 있는지 확인하려면 파일 시작 부분에 다음 명령을 추가하면 됩니다.

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

답변1

그래픽 로그인 환경이 다음을 수행하는 것을 보았습니다.

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( <<임시 일반 파일 또는 쉘 종속 파이프로 구현됨)가 아니므로 쉘은 대화형이 아닙니다(대화형의 정의는 사람이 상호 작용할 때입니다).

답변2

예, 비대화형 로그인 셸을 사용할 수 있습니다.

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

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

$

답변3

비대화형 로그인 쉘은 덜 일반적이지만 가능합니다. 0번째 인수(일반적으로 실행 파일 이름)를 a로 시작하는 문자열로 설정하여 쉘을 시작하면 -대화형인지 여부에 관계없이 로그인 쉘입니다.

$ 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대신 0 번째 인수는 입니다 -bash. Bash가 시작되면 변수를 0번째 인수가 아닌 $0로 설정 -bash하지만 0번째 인수가 중요합니다.

su -l비대화형 로그인 셸을 사용하거나 실행할 수 있지만 su -표준 입력이 터미널이 아닌 다른 것이 되도록 준비하면서 인증을 받을 수 있어야 합니다(비밀번호를 입력하거나 시작 부분에 비밀번호를 정렬하지 않고). 입력). sudo: run을 사용하여 자격 증명을 가져온 sudo true다음 자격 증명이 여전히 유효한 동안 실행하는 것이 더 쉬울 수 있습니다 echo 'shopt -p login_shell; echo $-' | sudo -i.

당신은 또한 볼 수 있습니다로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?

답변4

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

예.

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

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

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

$ su - someuser -c somecommand

/etc/profile그러나 이는 구현되지 않았다는 사실에 직면합니다.

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

/* 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포함하지 않는 다른 껍질을 발견했습니다.

관련 정보