非交互式的非登录shell很容易理解,只要在终端中执行一个shell脚本,就会启动一个非交互式的、非登录的shell,它将运行这个shell脚本。
但是我不明白非交互式登录shell是如何工作的,如果shell是非交互式的,那么在执行shell时您不能输入登录凭据,那么您是否将登录凭据放入shell脚本或其他什么?
发布于 2017-09-25 11:16:30
我还记得我自己第一次开始研究UNIX系统的内部结构时的困惑。这是一个非常简单的解释;理解现代系统需要大量的背景知识,这些背景知识太广,无法适应像这样的StackExchange答案。
登录凭据是由名为login的特权进程请求的,您可以看到带有ls -l /bin/login的可执行文件。(当然也有资料来源。)更多信息来自man login。
除其他外,此过程将使用多个库调用(通过PAM库,请参见man 7 pam)检查凭据,确保没有时间限制,确保主目录存在等等。当满足所有条件时,它将放弃其特权并启动首选shell的副本。这通常(但不完全)被定义为/etc/passwd中的最后一个字段。
您可以使用getent命令看到您自己的密码条目(也许奇怪的是,它甚至不包括密码的加密副本):
getent passwd "$USER"
roaima:x:1001:1001:Roaima:/home/roaima:/bin/bash有关此文件结构的更多信息可以在man 5 passwd中找到。
注意,没有硬性和快速的要求您的shell是/bin/bash。它可能完全是自定义的,因为它只以您自己的帐户特权运行。
希望这说明了shell本身对您的凭据一无所知。在交互模式下运行时,它只是一个正常的程序(可能是一个复杂的程序),它从stdin读取并写入stdout。同样的程序可以在非交互模式下用于对文件、管道或套接字进行读写。
原则上,没有什么可以阻止您编写自己的shell,从它的输入读取一行,用空格拆分单词,然后分叉一个子进程来调用execvpe()并执行程序。(实际上还有许多额外的障碍需要克服,例如不分割引用的字符串、直接在父字符串中激活chdir (cd)和信号。)
https://unix.stackexchange.com/questions/394293
复制相似问题