如果本地unix用户传递的用户名和密码正确,我想检查一个shell脚本。最简单的方法是什么?
我在谷歌搜索时发现的只是使用'expect'和'su',然后以某种方式检查'su'是否成功。
答案 0 :(得分:9)
用户名和密码写在/etc/shadow
文件中。
只需从那里获取用户和密码哈希(sed
会有帮助),哈希自己的密码并检查。
使用mkpasswd生成哈希。
你必须看看你的版本使用的是哪种盐。最新的阴影正在使用sha-512
所以:
mkpasswd -m sha-512 password salt
联机帮助页可以为您提供很多帮助。
更容易使用php和pam-aut模块。你可以在群组访问pwd用户上查看vie php。
答案 1 :(得分:4)
在Linux上,您需要编写一个调用pam_authenticate()
的小型C程序。如果呼叫返回PAM_SUCCESS
,则登录名和密码是正确的。
答案 2 :(得分:4)
好的,现在这是我用来解决问题的脚本。我第一次尝试写一个由Aaron Digulla提出的小型c-programm,但事实证明这太难了。
也许这个脚本对其他人有用。
#!/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
答案 3 :(得分:0)
部分回答是检查用户名,是否在/ etc中的passwd / shadow文件中定义 然后用盐计算密码MD5。如果您的用户密码是通过SSL(或至少某些服务器终端服务)发送的。
它只是一个提示,因为我不知道你究竟需要什么。 因为“su”主要用于身份验证。
您可能会看到的其他主题是kerberos / LDAP服务,但这些主题很难。