什么是登录和非登录外壳?


78

据说非登录shell进入.bashrc文件的设置和登录shell进入.profile文件的设置。

登录和非登录shell的真正含义是什么?

请尽量不使用技术术语进行解释。

Answers:


83

简单的说:

  • 如果您打开外壳或终端(或切换到一个外壳),并要求您登录(用户名?密码?),然后提示您,则它是登录外壳。
  • 如果不是(例如gnome-terminal),并且可以立即使用它,则它是非登录外壳。

如果您是Ubuntu桌面的普通用户,则唯一的登录shell是...您的桌面(您输入密码进入,对吗?)?嗯,从技术上讲,这是一个启动GUI的登录Shell,但这已经成为行话了。是的,它将读取.profile

你(普通用户)唯一的一次,可能会看到一个登录外壳,看起来像一个登录shell是,如果你有一些问题与您的桌面,并切换到同一个虚拟终端Ctrl+ Alt+ F1快捷键。


具有登录外壳的其他一般情况包括:

  • 通过ssh(或通过本地连接ssh localhost)远程访问计算机
  • 使用bash -l(或sh -l)模拟初始登录外壳
  • 使用以下命令模拟初始root登录外壳sudo -i
    • 或其他非用户sudo -u username -iroot
  • 使用另一个非root用户身份验证(及其密码)su - username
  • 使用sudo login命令切换用户

如果我从终端启动Eclipse IDE,它将按预期打开,但是如果我尝试通过单击Eclipse图标将其打开,则它将无法识别Java位置(除非在.profile文件中设置了Java的PATH)。这意味着单击Eclipse图标需要登录外壳,为什么?
DUKE 2012年

2
@DUKE,否,这意味着当您使用桌面/ GUI或真正的仅命令行控制台系统时,需要对环境变量进行不同的设置。将您的PATH等放入~/.pam_environment(仅变量,其中没有bash命令!),注销,登录,并观看神奇地出现在桌面以及gnome终端中的所有内容!
ish 2012年

1
通过ssh登录不会调用登录shell。它不会加载/etc/profile/etc/profile.d~/.profile
xuhdev 2014年


@xuhdev通过ssh登录确实会调用登录shell,并且会加载/etc/profile、/etc/profile.d和〜/ .bash_profile。
MichaelZ 2015年

9

我认为没有“技术术语”就不能给出正确的答案。由于此问题是Google在查询“什么是登录外壳”中弹出的第一个问题,因此我在下面提供了一个更正确的答案:

登录外壳只是一个被告知是登录外壳的外壳。它并不意味着外壳弹出你登录后,虽然平时的应用程序,让您登录告诉贝它启动是一个登录shell。有以下几种方法可以告诉Shell应该是登录用户:

  1. 使用-l--login参数假设知道它的情况下运行shell (我不知道任何不知道的shell -l,但--login仅受少数shell支持)。
  2. argv[0]设置为的运行外壳程序-{some_string}(即,将HYPHEN-MINUS设置为通常的argv[0]字符串或其他字符串)。这就是ssh和su的作用:su只是使用-suas 运行可执行文件argv[0](大家都认为argv[0]与当前运行的可执行文件名称有关),-zsh当用户将/bin/zshshell 设置为shell 时,ssh运行zsh 。

Shell的Loginess与要求您输入密码或执行其他身份验证过程的任何人都没有任何关系。诸如ssh或login之类的某些程序(或诸如urxvt之类的某些终端模拟器)将shell作为登录程序运行,使用argv[0]以HYPHEN-MINUS开头的外壳程序。诸如su或sudo(或zsh:请参见-参考资料中的PRECOMMAND MODIFIERS部分中描述的precommand修饰符man zshmisc)之类的默认情况下不会执行此操作,但可以这样告知。有些人只能使用其参数(即bash -l)告诉shell是登录用户:ssh和命令参数(明确告诉ssh在远程端运行什么)。

通常最好是先咨询用于调用壳的程序的文档,以确定壳是否将登录一个和第二执行一些测试,以确定应用是否将启动一个登录壳(例如,通过添加echo.profile)。


我对第二个选项感兴趣:在调用bash之前(或之后),我实际上如何更改argv [0]?可以从命令行完成吗?
VeryHardCoder 16'Mar

@VeryHardCoder这取决于您用于运行命令的应用程序。在C代码是通过直接供应做argv[0]对的一个exec*功能,自然和必然的:你总是提供 argv[0]和路径实际使用命令时运行exec*的功能,即使你没有想argv[0]从运行的命令不同。其他语言提供了自己的方式。特别是bash允许使用exec -a new_argv0 bash,但这当然会用您exec编辑的内容替换当前正在运行的shell ,因此您可能需要使用subshel​​l((exec -a -zsh zsh)
ZyX

好的,我知道了!实际上,它甚至可以用一种更简单的方式来完成:(exec -l bash)...
VeryHardCoder

1
两者之间的功能区别是什么?这仅仅是一个布尔标志吗?
Alexey

@Alexey主要功能差异是启动时使用的一组配置文件。$0,并且可能还设置了其他内容(变量,设置等),以便可以在配置文件中检测到外壳的逻辑性,但是实际上谁会检测到它,这有什么不同呢?这是我所知道的一切。
ZyX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.