什么是登录和非登录 shell?

DUK*_*UKE 86 command-line bash login .profile

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

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

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

ish*_*ish 94

简单的说:

  • 如果您打开一个 shell 或终端(或切换到一个),并且它在给您提示之前要求您登录(用户名?密码?),则它是一个登录 shell。
  • 如果它没有(如gnome-terminal),并让您立即使用它,则它是一个非登录 shell。

如果您是 Ubuntu Desktop 的普通用户,那么唯一的登录 shell 就是……您的桌面(您输入密码才能进入,对吧;)?嗯,从技术上讲,它是一个启动 GUI 的登录 shell,但这已经成为行话了。是的,它会读取设置.profile

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


使用登录 shell 的其他一般情况包括:

  • 通过ssh(或本地连接ssh localhost)远程访问您的计算机
  • 使用bash -l(或sh -l)模拟初始登录shell
  • 模拟初始root登录 shellsudo -i
    • 或其他非用户sudo -u username -iroot
  • root使用(和他们的密码)作为另一个非用户进行身份验证su - username
  • 使用sudo login命令切换用户

  • @DUKE,不,这意味着当您使用桌面/GUI 与真正的仅限命令行的控制台系统时,需要*不同地* 设置环境变量。将您的 PATH 等放在 `~/.pam_environment` 中(只有变量,没有 bash 命令!),注销,登录,然后观察一切神奇地出现在桌面和 gnome-terminal 中! (2认同)

小智 11

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

登录外壳只是一个被告知是登录外壳的外壳。它平均壳你登录后弹出,虽然平时应用程序日志,你告诉壳它启动是一个登录shell。存在以下方法来告诉 shell 它应该是登录的:

  1. 使用-l--login参数运行 shell假设它知道它(我不知道任何不知道的 shell -l,但--login只有少数 shell 支持)。
  2. 使用argv[0]set to运行 shell -{some_string}(即在通常argv[0]或其他字符串前加上连字符减号)。这就是 ssh 和 su 所做的: su 只是使用-suas运行可执行文件argv[0](你好,每个人都认为argv[0]与当前运行的可执行文件名称有关),-zsh当用户设置/bin/zsh为他的 shell时,ssh 运行 zsh 。

shell 的登录与任何询问您密码或执行其他身份验证程序的人完全无关。一些程序,如 ssh 或 login(或一些终端模拟器,如 urxvt)使用argv[0]以连字符-减号开头的登录程序运行 shell 。有些像 su 或 sudo(或 zsh:请参阅 中的-预命令修饰符部分中描述的预命令修饰符man zshmisc)默认情况下不执行此操作,但可以被告知。有些人唯一的选择是使用它的参数(即bash -l)告诉 shell 作为登录者:ssh 和一个命令参数(明确告诉 ssh 在远程端运行什么)。

一般来说,最好先查阅用于调用 shell 的程序的文档以确定 shell 是否将成为登录名,然后执行一些测试以确定应用程序是否会启动登录 shell(例如通过添加echo.profile)。

  • 两者之间的功能区别是什么?这只是一个布尔标志吗? (2认同)