首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解非交互式登录shell?

问如何理解非交互式登录shell?
EN

Unix & Linux用户
提问于 2017-09-25 10:28:46
回答 1查看 930关注 0票数 1

非交互式的非登录shell很容易理解,只要在终端中执行一个shell脚本,就会启动一个非交互式的、非登录的shell,它将运行这个shell脚本。

但是我不明白非交互式登录shell是如何工作的,如果shell是非交互式的,那么在执行shell时您不能输入登录凭据,那么您是否将登录凭据放入shell脚本或其他什么?

EN

回答 1

Unix & Linux用户

发布于 2017-09-25 11:16:30

我还记得我自己第一次开始研究UNIX系统的内部结构时的困惑。这是一个非常简单的解释;理解现代系统需要大量的背景知识,这些背景知识太广,无法适应像这样的StackExchange答案。

登录凭据是由名为login的特权进程请求的,您可以看到带有ls -l /bin/login的可执行文件。(当然也有资料来源。)更多信息来自man login。

除其他外,此过程将使用多个库调用(通过PAM库,请参见man 7 pam)检查凭据,确保没有时间限制,确保主目录存在等等。当满足所有条件时,它将放弃其特权并启动首选shell的副本。这通常(但不完全)被定义为/etc/passwd中的最后一个字段。

您可以使用getent命令看到您自己的密码条目(也许奇怪的是,它甚至不包括密码的加密副本):

代码语言:javascript
复制
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)和信号。)

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/394293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档