0

我有一个简单的 shell 脚本,可以针对 Apple Open Directory (LDAP) 服务器测试密码是否正确(或不正确)。

我想要的只是丢失 gobblygook 错误消息“节点/LDAPv3/1 的身份验证...”,而是插入我自己的语言,例如“密码不匹配”。

这是现在发生的事情:

bash-3.2# test-password 

Enter username you'd like to test password for:
jdoe

Enter Password to test for jdoe
asdasdasd
Authentication for node /LDAPv3/127.0.0.1 failed. (-14090, eDSAuthFailed)
<dscl_cmd> DS Error: -14090 (eDSAuthFailed)

我更喜欢的是:

bash-3.2# test-password 

Enter username you'd like to test password for:
jdoe

Enter Password to test for jdoe
asdasdasd
 Password matches!

所以我只需要知道一种方法,以便消除标准输出错误消息......

这是脚本:

#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH
echo
echo Enter username you\'d like to test password for:
read USERNAME

echo
echo Enter Password to test for "$USERNAME"
read PASSWORD
/usr/bin/dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD

if [ "$?" = "0" ]; then
       echo "Password is correct"
       exit 0

fi
4

2 回答 2

3

这取决于写入错误消息的位置。表现良好的 UNIX 程序将它们的错误写入 stderr。

/usr/bin/dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD 2> /dev/null  # stderr
/usr/bin/dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD  > /dev/null  # stdout
/usr/bin/dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD &> /dev/null  # both

对于它的价值,您可以将它与if声明结合起来。此外,不需要/usr/bin前面的显式路径。

if dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD 2> /dev/null; then
    : # success
else
    : # failure
fi
于 2012-11-27T04:57:37.657 回答
2

扔掉标准输出和错误:

/usr/bin/dscl /LDAPv3/127.0.0.1 auth $USERNAME $PASSWORD >/dev/null 2>&1

除非dscl程序做一些狡猾的事情,比如打开你的/dev/tty设备进行写作,否则它应该会照顾好一切。

于 2012-11-27T04:58:38.473 回答