/ sbin / nologin和/ bin / false之间有什么区别


169

从技术上讲,除非pam您设置为不检查您的外壳,否则pam_shells,如果您不在外壳上,则这两种方法均无法阻止您的登录。在我的系统上,它们的大小甚至不同,因此我怀疑它们实际上在做什么。那有什么区别呢?他们为什么都存在?为什么我要一个使用另一个?

-rwxr-xr-x 1 root root  21K Feb  4 17:01 /bin/false
-rwxr-xr-x 1 root root 4.7K Mar  2 14:59 /sbin/nologin


该路径/bin/false应无处不在,但不应存在/sbin/nologin:'/ sbin / nologin':无此类文件或目录。知道为什么为什么/usr/sbin/nologin/sbin/nologin使用Debian和Ubuntu吗?
baptx

4
我很好奇为什么/ bin / false需要21k的代码来返回“ 1”返回代码!(并且/ sbin / nologin仅需要4.7k)
马克·斯图尔特

1
@MarkStewart有点为时已晚,但您可能想阅读为什么真假这么大?关于为Linux创建真正的ELF可执行文件的旋风教程
nxnev

1
@nxnev是的,没想到ELF的开销。从我以前的IBM时代开始,有一个程序IEFBR14是一条简单的操作码汇编指令:BR 14-分支到寄存器14,它将以返回代码设置为寄存器14中的任何值终止该程序!
Mark Stewart

Answers:


198

/sbin/nologin设置为shell时,如果具有该shell的用户登录,他们将收到一条礼貌的消息:“此帐户当前不可用”。可以使用文件更改此消息/etc/nologin.txt

/bin/false只是立即退出的二进制文件,在调用时返回false,因此当具有falseshell 身份的人登录时,他们在退出时立即注销false。将shell设置为/bin/true具有不允许某人登录的相同效果,但false可能被当作惯例使用,true因为这样可以更好地传达人们没有shell的概念。

查看nologin的手册页,它说它是在BSD 4.4(1990年代初期)中创建的,因此它在false创建之后很久就出现了。false作为shell 的使用可能只是UNIX早期的一种惯例。

nologin是更用户友好的选项,并为尝试登录的用户提供了可自定义的消息,因此从理论上讲,您将希望使用该消息;但两者nologinfalse会不具有壳,不能够在使用SSH有人相同的最终结果。


10
/usr/sbin/nologin用于基于Debian的发行版。
Diemo

3
至少BSD实现也将登录尝试记录为syslog,如opensource.apple.com/source/system_cmds/system_cmds-735/…所示,而/ bin / false则不会记录任何内容
Sergiy Kolodyazhnyy

28

某些FTP服务器仅在具有有效外壳程序的情况下才允许您进行FTP访问。 /sbin/nologin被视为有效的外壳,而/bin/false不是。

(我认为“有效”表示其退出状态为0,但/etc/shells也可能会进入该状态,它可能取决于系统,FTP软件和您的配置。)


1
是的,这可能是使用pam的ftp程序的一部分,以及使用pam_shells的pam的一部分,正如您所说的,check /etc/shells。只是一个猜测...我可能是错的。
xenoterracide 2011年

4
我刚刚检查了Ubuntu 8.04和14.04。nologin命令以类似于false的状态1退出,并且/ etc / shells中不包含true,false或nologin。如果是这样,用户可以使用chsh选择这样的外壳并将自己锁定在自己的帐户之外。
penguin359

12

/bin/false是一个系统命令,可在需要将命令传递给程序时使用,该命令不应该执行任何操作而退出并返回错误。是的伴侣/bin/true。这两个都是非常古老的标准POSIX实用程序,根据定义都不会产生任何输出。true有时用于应无限期循环的shell脚本,例如:

while true; do
    ...
    # Waste time
    if [ $wasted_time -gt 100000 ]; then
        exit 0
    fi
    ...
done

/usr/sbin/nologin是专门为替换外壳而设计的,并产生抱怨您无法登录的输出。在存在之前/bin/false,虚拟用户经常使用它,但是由于用户不知道为什么要启动虚拟用户,这可能会造成混淆。


4
值得注意的是,/bin/true/bin/false并不总是你会在shell脚本中得到什么。在zsh truefalse内置于其中,bash使用/bin/*版本
xenoterracide

4

在我的机器上,nologin总是以英文显示相同的消息,而忽略参数。/bin/false--version--help指示的语言回应$LC_CTYPE。除了这些外观上的差异外,它们具有相同的效果。

在可用性方面,nologin如果以说英语的真实人的身份使用,则更好。在安全方面,没有区别。


4
false对于没有真实用户的系统帐户,nologin对于禁用的帐户,似乎更多。
xenoterracide 2011年

1
您的操作系统是什么?Centos nologin版本不带任何参数,但是可以从中读取消息/etc/nologin.txt
亚历山大·贡奇

3

/ bin / false唯一的工作是使用非零的退出代码退出。

在命令行中尝试:

$:> /bin/false
$:> echo $?
1
$:>

一些机构在密码文件的shell字段中使用/ bin / false。如果用户尝试登录,则外壳程序为/ bin / false,因此会立即退出


2

在linux上,/sbin/nologin它来自util-linux项目,而它/bin/falseGNU Coreutils的一部分。它们扮演着不同的角色,并且nologin可以选择为正在登录的以shell为输出的人员打印消息。linux命令来自BSD,他们似乎有很长的历史。 FreeBSD false仅返回1,同时进行nologin检查以确保它在TTY运行,并在尝试登录期间向syslog发送消息。 linux版本稍微复杂一些(false我想以--help的输出为国际化做各种有趣的事情),但基本上以相同的方式执行。


1

它们可能是同一程序,但是它们具有不同的含义。程序名称说明了一切。

  • / bin / false用于返回假值。它作为程序运行。
  • / bin / nologin旨在向用户指示不允许帐户登录。(它用于登录shell。)

-4

两者都或多或少地完成了相同的工作,但/bin/false对非特权用户有用。另一方面,/sbin/nologin是针对特权用户的。


4
哦,你是怎么得出这个结论的?
fpmurphy

可能他已经调查过了/etc/passwd。我只是/etc/passwd研究了刚安装的Debian Stretch。在此框中,几乎所有系统帐户(用户ID <1000)都具有/usr/sbin/nologin外壳程序,只有少数例外。请注意,我不同意@pythondetective的回答。我只是在推测可能导致他得出这个结论的原因。不过,我的评论有点晚了。
Binarus

没有!默认的登录Shell与特权不同。
MUY比利时

不是一个伟大的“侦探”
Emobe
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.