로그인 셸(bash) - 로그인 셸을 호출하는 방법

로그인 셸(bash) - 로그인 셸을 호출하는 방법

나는 로그인 쉘이 무엇인지, 로그인 쉘과 비로그인 쉘의 차이점을 알고 있습니다.

하지만 나를 혼란스럽게 하는 것은 그것이 어떻게 불리는지입니다. -매개변수 0으로 로그인 쉘을 호출한다고 합니다 .

인수 0이 쉘 자체의 이름인 경우 호출 쉘에 인수를 어떻게 전달합니까?

# -bash 
-bash: -bash: command not found

알았어 상관없어

# bash --login
# echo $0
# bash

나는 아직도 그것을 보지 못했다 -bash.

SSH를 통해 로그인한 경우에만 -bash게시할 때 볼 수 있습니다 echo $0. 하지만 원래 질문으로 돌아가서,

  1. Unix/Linux에서 로그인 쉘을 만드는 방법은 무엇입니까?
  2. 로그인 프로세스 중에 로그인 쉘을 생성하는 "사물"은 무엇입니까? 로그인 중에 bash 쉘을 호출하는 "로그인" 프로세스인 경우 매개변수 0을 -bash 쉘에 어떻게 전달합니까?

답변1

SSH, 및 기타 프로그램은 다음 명령을 사용하여 셸을 sudo시작합니다 .suexec시스템 호출 계열. 이러한 시스템 호출을 통해 호출 프로그램은 함수를 포함한 모든 매개변수를 지정할 수 있습니다. 예를 들어 다음을 sudo사용하여 로그인 셸을 시작합니다.

$ strace -fe execve -o sudo.log sudo -i
root:~ $ echo $0
-bash
root:~ $ logout
$ grep bash sudo.log 
19124 execve("/bin/bash", ["-bash"], [/* 31 vars */]) = 0
19140 execve("/bin/ls", ["ls", "/etc/bash_completion.d"], [/* 40 vars */]) = 0

첫 번째 호출에서 볼 수 있듯이 execve전달된 인수 배열 bash은 0 ["-bash"]이므로 인수 0도 마찬가지입니다 -bash.

답변2

이는 복제하기 쉽고 다음을 통해 호출 zsh에 대한 적절한 인수를 지정할 수 있습니다.exec(3)ARGV0

% ARGV0=-bash bash
-bash-4.1$ ps o cmd --pid=$$
CMD
-bash
-bash-4.1$ exit
% ARGV0=imnotaduck bash
$ ps o cmd --pid=$$
CMD
imnotaduck
$ exit
% 

C에서는 done 과 같이 login(1)코드가 다음을 실행합니다.

execlp("/usr/local/bin/bash", "-bash", ..., (char *) 0)

프로세스 이름에 하이픈을 삽입합니다. 이는 소스 코드를 실행하거나 login검사 하여 확인할 수 있습니다 .bashstracelogin

답변3

사용자 usertest로 로그인하려면 다음을 수행합니다(루트로):

root:~# login usertest
Password: 
usertest:~$ echo $0
-bash
usertest:~$ exit
root:~# _

이는 사용자가 로그인하는 공식적인 방법입니다.

물론 $0을 변경하는 명령은 언제든지 실행할 수 있습니다.

bash -c 'echo "hello"; echo $0;' mylogthisshell

항상 시작 대시가 있습니다

bash -c 'echo "hello"; echo $0;' -mylogthisshell

관련 정보