![로그인 셸(bash) - 로그인 셸을 호출하는 방법](https://linux55.com/image/70905/%EB%A1%9C%EA%B7%B8%EC%9D%B8%20%EC%85%B8(bash)%20-%20%EB%A1%9C%EA%B7%B8%EC%9D%B8%20%EC%85%B8%EC%9D%84%20%ED%98%B8%EC%B6%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 로그인 쉘이 무엇인지, 로그인 쉘과 비로그인 쉘의 차이점을 알고 있습니다.
하지만 나를 혼란스럽게 하는 것은 그것이 어떻게 불리는지입니다. -
매개변수 0으로 로그인 쉘을 호출한다고 합니다 .
인수 0이 쉘 자체의 이름인 경우 호출 쉘에 인수를 어떻게 전달합니까?
# -bash
-bash: -bash: command not found
알았어 상관없어
# bash --login
# echo $0
# bash
나는 아직도 그것을 보지 못했다 -bash
.
SSH를 통해 로그인한 경우에만 -bash
게시할 때 볼 수 있습니다 echo $0
. 하지만 원래 질문으로 돌아가서,
- Unix/Linux에서 로그인 쉘을 만드는 방법은 무엇입니까?
- 로그인 프로세스 중에 로그인 쉘을 생성하는 "사물"은 무엇입니까? 로그인 중에 bash 쉘을 호출하는 "로그인" 프로세스인 경우 매개변수 0을
-
bash 쉘에 어떻게 전달합니까?
답변1
SSH, 및 기타 프로그램은 다음 명령을 사용하여 셸을 sudo
시작합니다 .su
exec
시스템 호출 계열. 이러한 시스템 호출을 통해 호출 프로그램은 함수를 포함한 모든 매개변수를 지정할 수 있습니다. 예를 들어 다음을 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
검사 하여 확인할 수 있습니다 .bash
strace
login
답변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