非交互式非登录 shell 很容易理解,只需在终端中执行 shell 脚本就会启动一个非交互式非登录 shell,该 shell 将运行该 shell 脚本。
但我不明白非交互式登录shell是如何工作的,如果shell是非交互式的,那么在执行shell时你无法输入你的登录凭据,所以你是否将你的登录凭据放在shell脚本或其他东西中?
答案1
我还记得第一次开始深入研究 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 本身对您的凭据一无所知。它只是一个普通的程序(也许是一个复杂的程序),在交互模式下运行时读取标准输入并写信给标准输出。可以在非交互模式下使用同一程序来读取和写入文件、管道或套接字。
原则上,您可以编写自己的 shell,从输入中读取一行,用空格分割单词,然后分叉一个子进程来调用execvpe()
和执行程序。 (实际上,有很多额外的障碍需要克服,例如不拆分带引号的字符串、直接在父级中操作chdir
( ) 以及信号。)cd