检查shell脚本中的unix用户名和密码

检查shell脚本中的unix用户名和密码,unix,shell,Unix,Shell,我想在shell脚本中检查本地unix用户传递的用户名和密码是否正确。最简单的方法是什么 我在谷歌搜索时发现的唯一一件事是使用'expect'和'su',然后以某种方式检查'su'是否成功。用户名和密码写在/etc/shadow文件中。 只需从那里获取用户和密码散列(sed会有帮助),散列您自己的密码并进行检查 使用mkpasswd生成散列。 您必须查看您的版本使用的是哪种盐。最新的阴影使用的是sha-512,因此: mkpasswd -m sha-512 password salt 手册页在

我想在shell脚本中检查本地unix用户传递的用户名和密码是否正确。最简单的方法是什么


我在谷歌搜索时发现的唯一一件事是使用'expect'和'su',然后以某种方式检查'su'是否成功。

用户名和密码写在
/etc/shadow
文件中。 只需从那里获取用户和密码散列(
sed
会有帮助),散列您自己的密码并进行检查

使用mkpasswd生成散列。 您必须查看您的版本使用的是哪种盐。最新的阴影使用的是
sha-512
,因此:

mkpasswd -m sha-512 password salt
手册页在这方面可以帮助您很多


更容易使用php和pam aut模块。在那里,您可以在group access pwd user上检查vie php。

部分原因是检查用户名,它是否在/etc中的passwd/shadow文件中定义 然后用salt计算密码MD5。如果您通过SSL(或至少某些服务器终端服务)发送了用户密码

这只是一个暗示,因为我不知道你到底需要什么。 因为“su”主要用于身份验证目的


您可能会看到的其他主题是kerberos/LDAP服务,但这些都是硬主题。

在Linux上,您需要编写一个调用
pam\u authenticate()
的小型C程序。如果调用返回
PAM_SUCCESS
,那么登录名和密码是正确的。

好的,现在这是我用来解决问题的脚本。我第一次尝试写一个小的c程序,正如Aaron Digulla所做的,但那太难了

也许这个脚本对其他人有用

#!/bin/bash
#
# login.sh $USERNAME $PASSWORD

#this script doesn't work if it is run as root, since then we don't have to specify a pw for 'su'
if [ $(id -u) -eq 0 ]; then
        echo "This script can't be run as root." 1>&2
        exit 1
fi

if [ ! $# -eq 2 ]; then
        echo "Wrong Number of Arguments (expected 2, got $#)" 1>&2
        exit 1
fi

USERNAME=$1
PASSWORD=$2

# Setting the language to English for the expected "Password:" string, see http://askubuntu.com/a/264709/18014
export LC_ALL=C

#since we use expect inside a bash-script, we have to escape tcl-$.
expect << EOF
spawn su $USERNAME -c "exit" 
expect "Password:"
send "$PASSWORD\r"
#expect eof

set wait_result  [wait]

# check if it is an OS error or a return code from our command
#   index 2 should be -1 for OS erro, 0 for command return code
if {[lindex \$wait_result 2] == 0} {
        exit [lindex \$wait_result 3]
} 
else {
        exit 1 
}
EOF
#/bin/bash
#
#login.sh$USERNAME$PASSWORD
#如果该脚本以root用户身份运行,则该脚本不起作用,因为这样我们就不必为“su”指定pw
如果[$(id-u)-eq 0];然后
echo“此脚本不能以root用户身份运行。”1>&2
出口1
fi
如果[!$#-eq 2];然后
echo“参数数目错误(应为2,得到$)”1>&2
出口1
fi
用户名=$1
密码=$2
#将预期的“密码:”字符串的语言设置为英语,请参阅http://askubuntu.com/a/264709/18014
导出LC_ALL=C
#因为我们在bash脚本中使用expect,所以必须转义tcl-$。

期待更多关于这种方法实现的细节:哦,好的,很好。几个月前,我花了6个小时自己想出了这个方法。这个网站会有很大帮助。但是我需要这个来进行web身份验证,所以我最终使用了phpnowhere的auth pam模块。这就是我最终解决类似问题的方式。CluelesCoder从未说过他想做什么。如果你想要一个简单的shell解决方案,你必须删除阴影文件。对于web身份验证,此模块很简单。您还可以创建一个php文件,并从批处理中对该文件进行coll,然后解析输出(有点过分,但也很容易实现。您只需要在本地计算机上运行一个php服务器)。只有几种实现目标的方法。当您无法访问
/etc/shadow
时,这不起作用。有关您试图实现的内容和脚本正在执行的操作的详细信息可能会有所帮助。请注意,脚本开头的
export LC_ALL=C
将使其适用于使用不同默认语言的系统,它会将此脚本执行的语言设置为英语,因为它需要字符串
密码:
,请参阅。