有没有一个非root的shell命令可以告诉我,如果用户的帐户被禁用或不是?
请注意,我区分了LOCKING和DISABLED:
! 或*或!! 到/ etc / passwd或/ etc / shadow文件的密码字段。 密码locking可以在shell提示符下通过password -l username (作为root)来locking用户名帐户,使用-u选项将解锁它。 chage -E 0 username来完成,该chage -E 0 username过期date设置为Unix纪元后的0天。 将其设置为-1将禁用使用过期date。 对于我的情况,使用locking是不够的,因为用户可能仍然能够login,例如使用ssh身份validation令牌,并且该用户下的进程仍可以产生其他进程。 因此,我们拥有启用或禁用的帐户,而不仅仅是locking。 我正在寻找的是一种通过shell命令来检查帐户的启用/禁用状态的方法,以用于自定义Java进程中。 Java进程可以parsing输出或者使用退出代码,并且可以执行复杂的语句,比如包括命令之间的pipe道。
这适用于Red Hat Enterprise 5.4系统。
以前在SuperUser上询问过这个问题。
来自评论:
这是不可能的,因为:描述信息只在阴影中,阴影只能由root读取。 任何需要密码哈希或帐户到期的程序都必须是SUID(如果您使用的是存储在影子中的本地帐户,就像您所说的那样)。
补充信息:
我最初使用chage(1)作为源。
注意
chage程序需要密码文件才可用。
我现在已经更新了我的信息,更确切地说,确认事情。
首先,我确认了chage的源代码。 它似乎确实需要访问影子文件并将信息存储在其他地方。 其次,你可以使用PAM来允许使用chage的根特性。 (chage.c中的check_perms:523)
正如其他人所说的,任何其他用作影子后端的东西(也就是nsswitch.conf中除了files和db之外的任何东西)都有自己的方法来处理事情。
简而言之:当使用文件作为后端时,密码老化信息确实存储在那里,只有在那里。 如果你仍然想使用文件后端,你应该写一个程序,并使其SUID,因为系统的全部或没有。 你可以查询你的用户,或者你可以查询和设置每个人。 从好的方面来说,用C编写一些东西只是几行代码。 你可以从chage的源代码基本上复制三个函数,并添加一个新的main。
我不确定是否有一个简单的方法来检查。 我怀疑作为一个普通用户你有权访问密码文件(不是影子),所以你不能真正轻松sed / awk / grep的! 领域。
你可以做的是devise一个非常具体的脚本,使非rwx非root,然后创build专门为该命令的sudo条目。 你甚至可以使它无密码。 理想情况下,您不会接受任何input,因此也难以“破坏”脚本。 我认为这取决于你想成为怎样的偏执狂/谁将有机会获得它。
没有非根命令,而是一个根命令。 它是passwd -S <username> 。 哪个输出如下:
显示帐户状态信息。 状态信息由7个字段组成。 第一个字段是用户的login名。 第二个字段指示用户帐户是否具有locking的密码(L),没有密码(NP)或具有可用的密码(P)。 第三个字段给出了最后一次密码更改的date。 接下来的四个字段是密码的最小年龄,最大年龄,警告期和不活动期。 这些年龄用天来表示。
所以最好的方法就是像这样调用脚本
#!/bin/sh passwd -S $1
并允许在Java程序中使用sudo和密码进行调用。
注意:上面的脚本对于代码注入来说是脆弱的,所以你必须为了你的目的而保护它。
一种方法是将您的帐户信息移动到LDAP或SQL。 然后使用PAM模块将其与您的服务器集成。 您的Java应用程序可以轻松地直接访问LDAP或SQL。
对于奖励积分,如果您有许多具有相同用户群的服务器,则此方法更具可扩展性和可pipe理性。 如果你有成千上万的用户帐户或者更多,/ etc / passwd也开始在性能方面受到影响。