是否有非交互式登录 shell?

是否有非交互式登录 shell?

我知道之间有什么区别交互式/非交互式登录/非登录贝壳是,但在实践中似乎永远不会有- 交互式登录shell 除非你有类似/bin/bash --login some-script.sh脚本的东西(甚至这看起来有点奇怪)。这是正确的还是更常见?

答案1

我假设您正在谈论 Bash 的登录与非登录以及交互式与非交互式 Bash shell 的概念,如祈求联机帮助页的部分。 (这与中的解释不同詹姆斯·杨曼的回答用作“shell”(或用户命令解释器)的任何任意命令passwd(5)文件以及该程序是否接受用户输入;有些,例如/usr/sbin/nologin,显然不是。)

你是对的,这/bin/bash --login some-script.sh将产生一个非交互式登录 Bash 调用,这可能是一个病态的例子。有一种情况,可能不常见,但并不奇怪,会产生一个非交互式登录 shell:ssh somehost < some-file。这里sshd将启动 Bashargv[0]设置为-bash因为没有给它运行命令,导致 Bash 认为自己是一个登录 shell,但是,因为 stdin 没有连接到终端,Bash 不会将自己设置为交互模式($-不会包含i) 。

(就个人而言,这种情况似乎比相反的情况更合理,ssh somehost somecommand尽管它是一个新的登录,但不被视为“登录 shell” somehost。)

我最近做了我早就应该做的事情并整理了一个Bash 模式表以及运行的初始化文件。如果你觉得这很令人困惑,请放心,至少我也是这样。让我感到困惑的是,他们最初的目的是关于何时.bashrc执行的规则。

答案2

实际上,新安装的系统上的大多数登录 shell 都是非交互式的:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

显然/bin/bash,它们/bin/sh是传统的 shell,并且是交互式的。但该列表中的所有其他项目都是非交互式的。如果您正在阅读该列表,但不知道其中一个的作用,您可以查找其手册页(例如man nologinman sync)。

该命令实际上做了什么

看看 Captain Man 的发帖历史,我发现他们对 Unix 相当缺乏经验。因此,评论中关于不关注的问题可能与答案顶部的命令行有关,而不仅仅是输出。因此,我也会解释命令行,尽管它对于这个问题来说确实是题外话。

该命令是一个Unix管道。管道是一系列命令 - 从左到右阅读 - 其中第一个命令的输出成为第二个命令的输入,第二个命令的输出成为第三个命令的输入,依此类推,直到管道末端。最后一个进程的输出显示在终端上(除非已重定向)。看维基百科有关 shell 管道的条目了解更多信息。

如果您不了解管道正在做什么,您可以简单地分段运行它以查看发生了什么。您还可以阅读正在使用的命令的手册页(此处为 、awksortuniq。事实上,你现在就应该这样做。我会等待。

让我们逐步运行管道的各个阶段(您可以在自己的 Unix 系统上安全地执行此操作):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

上面的输出只是/etc/passwd文件中第七个字段的内容。这是(平面文本文件)数据库,它告诉系统每个人的登录 shell 是什么。如果您想了解更多信息,/etc/passwd请阅读它(它是世界可读的)并查看它的手册页(man 5 passwd)

因此,阅读整个列表,您可以了解流行的项目是什么,但这并不是回答这个问题的好格式,因为问题实际上是关于非交互式 shell 的常见程度。让我们来数一数。最简单的方法是首先对项目进行排序:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

我们可以使用该程序uniq仅向我们展示独特的项目:

~$ awk -F: '{print $7}' < /etc/passwd |排序|优衣库 | sed -e 's/^/ /' /bin/bash /bin/false /bin/sh /bin/sync /usr/sbin/nologin

但是等等,这没有用,每个人有多少?让我们问一下uniq(阅读手册页!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

当然,这就是我们在答案顶部看到的输出。让我们再次排序以按顺序查看条目:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

等等,这不对,17 在 1 之前,5 在 23 之后。问题是项目正在排序按字典顺序。让我们要求sort按数字和相反的顺序对它们进行排序:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

我认为这解释了原始答案中的所有内容。如果您仍然不清楚这些命令的详细信息,可以阅读手册页。如果您仍然不清楚正在发生的事情的原理,那么最好先阅读一本解释 Unix 和 Linux 的书(在线或纸质)。

相关内容