是否有非交互式登录外壳?


14

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


7
telnet towel.blinkenlights.nl对于非交互式登录外壳;-)
Martin Tournoij


@CaptainMan:查看答案,我们有两个侧重于“交互”的完全不同的含义。有鉴于此,您能否扩大回答范围,以解释问问题时使用的含义?
Curt J. Sampson

Answers:


10

我假设您正在谈论Bash的登录vs.非登录以及交互式vs.非交互式Bash shell的概念,如联机帮助页的“ 调用”部分所述。(这与James Youngman回答中关于用作文件中“外壳”(或用户命令解释器)的任意命令的解释passwd(5)以及该程序是否接受用户输入的解释不同;有些/usr/sbin/nologin显然不接受。 )

您是正确的,/bin/bash --login some-script.sh它将产生非交互式登录Bash调用,这也许是一个病理示例。还有一种情况,也许罕见的,但不是真正的怪异,产生一个非交互式登录shell: ssh somehost < some-file。这里sshd将以argv[0]设置为Bash开头,-bash因为没有给它运行命令,从而使Bash认为自己是登录shell,但是由于stdin没有连接到终端,Bash不会将自己设置为交互模式($-将不包含i) 。

(从个人角度来看,这种情况似乎比相反的情况要合理得多,ssh somehost somecommand尽管与上述情况相反,该情况也不算是“登录外壳” somehost)。

最近,我做了我很早以前应该做的事情,并汇总了Bash模式表以及运行了哪些init文件。如果您发现它令人困惑,至少也要相信我。这使我迷惑了它们的最初目标与.bashrc执行时间的规则有关。


1

按新安装的系统上的数量计,大多数登录外壳是非交互式的,实际上是:

$ 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它们是传统的外壳,它们是交互式的。但是该列表中的所有其他项目都是非交互的。如果您正在阅读列表,但不知道其中一个是做什么的,则可以查找其手册页(例如man nologinman sync)。

该命令的实际作用

查看Man Captain的发布历史,我发现他们对Unix缺乏经验。因此,也许注释中有关不遵循的问题与答案顶部的命令行有关,而不仅仅是输出。因此,即使这个问题确实不在主题之列,我也将对其进行解释。

该命令是Unix管道。管道是一连串的命令-从左到右阅读-在其中,第一个命令的输出成为第二个命令的输入,第二个命令的输出成为第三个命令的输入,依此类推,直到管道末端。最后一个进程的输出显示在终端上(除非已被重定向)。有关更多信息,请参见外壳程序管道上的Wikipedia条目

如果您不了解管道在做什么,则可以简单地分段运行它以查看发生了什么。您还可以阅读的手册页正在使用(这里的命令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文件中第七个字段的内容。那就是(纯文本文件)数据库,它告诉系统每个人的登录外壳是什么。如果您想了解更多信息/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 | 排序 uniq | 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的书。


你能再解释一下吗?我不确定我会遵循我的阅读内容。
曼队长

/bin/sync贝壳?那么任何实用程序都是外壳程序吗?
eloone '16

@eloone“壳”有两个(也许三个)含义。一种是在密码数据库中配置为登录外壳的程序。这是短语“非交互式登录外壳”所指的单词的含义。另一个含义是“适合在Unix系统上进行日常交互工作的REPL”。这些是互动的。但是,在REPL上下文中可用的大多数程序也支持非交互式用作某种脚本语言的解释器(尽管“ shell脚本”几乎普遍表示“ Bourne-family-shell脚本”)。
James Youngman

2
您似乎在回答另一个问题。您只是列出了可用的shell,并指出其中一些永远不会是交互式的。我相信OP正在询问是否曾经在野外遇到非交互式登录外壳。因此,是否可以交互的外壳(例如bash)是否会启动非交互的登录外壳。换句话说,这里的“登录外壳”并不表示“用户的默认登录外壳”,而是表示已作为登录外壳启动的外壳。参见unix.stackexchange.com/a/46856/22222
terdon

1
也许,考虑到发帖人明确地bash --login在问题中写了,他正在特别地询问bash没有i设置选项的过程。(这些来自诸如ssh somehost < script.sh;之类的命令,按照Bash手册页的INVOCATION部分中指定的方式,是“登录,非交互式” shell 。)
Curt J. Sampson
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.