什么是登录和非登录shell?
据说非登录shell的设置要进入.bashrc
文件和登录shell设置进入.profile
文件。
登录和非登录shell的真正含义是什么?
请尽量使用技术术语解释。
简单的说:
- 如果您打开一个shell或终端(或切换到一个),它会要求您在提示之前登录(用户名?密码?),这是一个登录shell。
- 如果它没有(像gnome-terminal ),并允许你直接使用它,它是一个非登录shell。
如果您是Ubuntu Desktop的普通用户,那么唯一的登录shell就是……您的桌面(您输入的密码是正确的;); 好吧,从技术上讲,它是一个启动GUI的登录shell,但这已经进入行话。 是的,它将读取.profile
的设置
您(普通用户)可能只会看到一个看起来像登录shell的登录shell,如果您的桌面出现问题并且使用Ctrl + Alt + F1快捷键切换到虚拟终端。
拥有登录shell的其他一般情况包括:
- 通过
ssh
远程访问您的计算机(或使用ssh localhost
本地连接) - 使用
bash -l
(或sh -l
)模拟初始登录shell - 使用
sudo -i
模拟初始root
登录shell- 或
sudo -u username -i
为另一个非root
用户
- 或
- 使用
su - username
( 及其密码)作为另一个非root
用户进行身份validation - 使用
sudo login
命令切换用户
如果没有“技术术语”,我认为不能给出正确的答案。 由于这个问题是第一个出现在谷歌查询“什么是登录shell”的问题,我在下面提供了一个更正确的答案:
登录shell只是一个被告知是登录shell的shell。 它并不意味着在您登录后弹出的shell,但通常记录您的应用程序告诉shell它将启动为登录shell。 有以下方法告诉shell它应该是一个登录的:
- 使用
-l
或--login
参数运行shell,假设它知道它(我不知道任何不知道-l
shell,但是--login
只支持几个shell)。 - 运行shell,
argv[0]
设置为-{some_string}
(即HYPHEN-MINUS前置于通常的argv[0]
或其他字符串)。 这就是ssh和su所做的:su只用-su
作为argv[0]
运行可执行文件(对于每个人都认为argv[0]
与当前运行的可执行文件名称有关),当用户设置时ssh运行zsh和-zsh
/bin/zsh
作为他的shell。
shell的loginess与任何要求您输入密码或执行其他身份validation程序的人完全无关。 一些程序,如ssh或login(或某些终端模拟器,如urxvt)使用以HYPHEN-MINUS开头的argv[0]
运行shell作为登录。 有些像su或sudo(或者zsh:see -
在man zshmisc
PRECOMMAND MODIFIERS部分中描述的precommand修饰符)默认情况下不这样做,但可以这样说。 有些人有唯一的选择,即使用其参数告诉shell为登录者(即bash -l
):带有命令参数的ssh(明确告诉ssh在远程端运行什么)。
通常最好首先查看用于调用shell的程序的文档,以确定shell是否为登录名,然后执行一些测试以确定app是否将启动登录shell(例如,通过向.profile
添加echo
)。