/bin/false
是一个实用程序,是的附属程序,/bin/true
从某种抽象意义上讲,它可以确保unix功能完整。但是,已经发现这些程序的紧急用途。考虑一下BASH语句/some/program || /bin/true
,$? = 0
无论返回,它始终将布尔值评估为true()/some/program
。
/bin/false
如所确定的,紧急使用用作不允许登录的用户的空外壳。在这种情况下,系统的行为将与外壳无法运行一样。
POSIX(尽管我可能是错的,而且可能是SUS)限制了这两个命令除了返回适当的布尔值外什么也不做。
/sbin/nologin
是一个BSD实用程序,其行为类似于/bin/false
(返回boolean false),但也打印输出,这/bin/false
是禁止的。尽管实际上在外壳终止时,许多终端仿真器将简单地关闭,这在某些情况下使消息几乎始终无法读取,但这可以帮助用户理解发生了什么。
很少有目的上市/sbin/nologin
在/etc/shells
。的标准作用/etc/shells
是列出chsh
用户更改自己的shell时允许使用的程序(并且没有可信的理由将自己的shell更改为/sbin/nologin
)。超级用户可以将任何人的外壳更改为任何东西。但是,您可能要在/sbin/nologin
和/bin/false
中都列出/etc/rsh
,这将禁止具有这些shell的用户chsh
在不幸的情况下使用它们来更改shell。
FTP守护程序可能不允许使用不在/ etc / shells中的shell的用户访问,或者它们可以使用他们希望的任何其他逻辑。在任何情况下都应避免运行FTP,因为sftp
(提供相似的功能)相似但安全。某些站点用于/sbin/nologin
禁用外壳程序访问,同时通过将sftp允许访问来禁用它/etc/shells
。如果允许用户创建cronjob,则可能会打开后门。
无论哪种情况,scp
都不会在无效的shell中运行。 scponly
在这种情况下可以用作外壳。
另外,外壳的选择会影响su -
(AKA su -l
)的操作。特别是,/sbin/nologin
如果是外壳,则将输出输出到stdout;情况并非如此/bin/false
。无论哪种情况,使用命令运行su -cl
都会失败。
最后的答案:
要禁用帐户,请不要依赖于这两种方法,而应将shell设置为/sbin/nologin
出于参考目的(除非/sbin/nologin
位于中/etc/shells
,此时应使用/bin/false
,不应使用)。而是将密码字段设置/etc/passwd
为!
,以确保crypt
没有密码有效。考虑/etc/shadow
以相同的方式设置哈希以避免错误。 passwd -l
将为您做到这一点。
禁用帐户的第三种方法是将帐户到期日期字段设置为古代日期(例如usermod --expiredate 1
)。万一您的设置允许用户在不使用密码的情况下通过其unix帐户进行身份验证并且所使用的服务不需要外壳程序,这将防止登录。