区分交互式登录和非交互式非登录shell

d a*_*s y 43 bash login

我试图区分这四个术语登录、非登录、交互式和非交互式

  • 交互式 - 登录外壳
  • 交互式 - 非登录 shell
  • 非交互式 - 登录外壳
  • 非交互式 - 非登录外壳

据我了解
交互式-非登录shell:启动系统,登录系统并打开终端和
非交互式登录shell:telnet到系统并登录

但是交互式登录外壳呢?
它是否登录系统,打开虚拟终端并登录?和
非交互式 - 非登录 shell,它是否在 crontab 中运行自动脚本?

ter*_*don 67

您似乎唯一真正的误解是关于非交互式登录 shell 的构成。

简要(参见此处了解更多详细信息),并附上示例:

  • 交互式登录 shell:您可以通过例如ssh. 另外,您也下降到一个tty本地计算机(上Ctrl+ Alt+ F1),并登录在那里。

  • 交互式非登录 shell:打开一个新终端。

  • 非交互式非登录 shell:运行脚本。所有脚本都在它们自己的子 shell 中运行,并且这个 shell 不是交互式的。它仅打开以执行脚本并在脚本完成后立即关闭。

  • 非交互式登录shell:这是非常罕见的,您不太可能遇到它。一种启动方式是echo command | ssh server. 当ssh在没有命令的情况下启动时(ssh而不是在远程 shell 上ssh command运行command),它会启动一个登录 shell。如果stdinssh是不是一个TTY,它启动一个非交互的shell。这就是为什么echo command | ssh server会启动非交互式登录 shell。您也可以从bash -l -c command.

如果你想玩这个,你可以测试各种类型的 shell,如下所示:

  • 这个 shell 是交互式的吗?

    检查$-变量的内容。对于交互式 shell,它将包括i

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
    
    Run Code Online (Sandbox Code Playgroud)
  • 这是登录外壳吗?

    没有可移植的方法检查这个,但是,对于bash,你可以检查login_shell选项设置:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on
    
    Run Code Online (Sandbox Code Playgroud)

将所有这些放在一起,这是每种可能的外壳类型之一:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 10

从本质上讲,shell 是否登录、交互与否很重要,原因只有一个:

初始化文件和默认选项设置取决于 shell 是否登录和交互。

相应地,shell 是登录与否或交互与否完全取决于所使用的调用- 确切的命令名称和选项。

这两个属性是正交的——shell 是否登录与确定它是否交互无关。

如果其中任何一个为真,Bash 将启动一个登录 shell:

  • argv[0],它被调用的命令的名称,以 -
  • -l选项已指定

类似地,如果其中任何一个为真,bash 将启动一个交互式 shell:

  • 它没有指定要执行的文件(即没有指定命令bash some/file)或要运行的命令字符串(bash -c 'foo')(实际情况有点复杂,请参阅手册)
  • -i选项已指定

值得注意的是(并且矛盾的是),后者意味着bash -ic 'foo'启动一个交互式 shell。

因此,以下启动了一个登录的交互式 shell,即使它没有任何交互性并且调用与登录无关:

bash -lic true
Run Code Online (Sandbox Code Playgroud)

通过控制台或 GUI 登录启动登录 shell(或可能不启动)完全是使用适当调用的登录过程的结果。

bash 手册中有关启动文件的部分详细描述了条件和效果。


一个主要的混淆来源是“登录”shell 有另一个常见的含义:

用户的登录 shell 是在该用户的passwd条目中定义的 shell (可能来自/etc/passwd、LDAP 或其他一些来源)。

login程序,SSH等启动这个shell作为登录在回答其余意味着感壳-以领先-的命令名称,通常。如果你想特别混乱,你可以说:

某些登录进程将用户的登录 shell 作为登录 shell 启动。

请注意,GUI 登录启动登录 shell 纯粹是因为开发人员认为它很方便 - LightDM 在登录时运行一个脚本,这显然不是交互式的,当然不依赖于用户的登录 shell(在第二种意义上)。不过,不要依赖于显示管理器启动登录 shell - 并非所有人都这样做,并且在 Wayland 和 GNOME 上,登录过程根本不使用 shell 脚本。