我正在检查密码复杂度,ocredit
其中/etc/pam.d/password-auth
有这一行:
password requisite pam_pwquality.so try_first_pass retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=1 gecoscheck=1
我想 grep ocredit 值“1”并将其作为变量,比如说check_ocredit
。
我的脚本会检查,如果 ocredit 值不为 0,则返回“true”,否则,它将显示当前设置的值/etc/pam.d/password-auth
。
这是我要实现的逻辑:
if [[ $check_ocredit -ne "0" ]]
then
true
else
echo "Current ocredit value is : $check_ocredit"
fi
输出将如下所示:
Current ocredit value is : 1
我尝试:
grep ocredit /etc/pam.d/password-auth | awk '{print $10}' | awk -F "=" '{print $2}'
但我在想,如果 ocredit 缺失,或者不在第 10 位,那我的结果会是错误的。有人能给我一些建议吗?
答案1
您可以使用单个grep
命令来执行此操作-o
,“仅打印行的匹配部分”,-P
这将为我们提供\K
:“忽略到这里匹配的任何内容”:
$ grep -oP 'ocredit=\K\d+' /etc/pam.d/password-auth
1
因此,在您的脚本中,您可以执行以下操作:
check_ocredit=$(grep -oP 'ocredit=\K\d+' /etc/pam.d/password-auth)
if [[ "$check_ocredit" -ne "0" ]]
then
echo "Current ocredit value is : $check_ocredit"
fi
您的版本if
仅当值为 0 时才会打印该值。
答案2
你可以尝试一下
awk -F'(ocredit=)' '{print $2}' /etc/pam.d/password-auth | awk '{print $1}'
要获取变量中的值,可能的解决方案可以是:
check_ocredit=$(awk -F'(ocredit=)' '{print $2}' /etc/pam.d/password-auth | awk '{print $1}')
第一个awk
将获取子字符串,之后ocredit=
将类似于1 gecoscheck=1
您的情况,而第二个awk
将只获取数字。
答案3
如果sed
有选择,那么:
sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth
将要看仅有的(要匹配任意单个数字,请[0-9]
使用[0-1]
) 为 a0
或 a1
之后的任意一个ocredit=
,如果找到则打印出来...该sed
命令的输出可以存储在变量中,例如check_ocredit
使用如下命令替换语法:
check_ocredit=$(sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth)
它可以在你的脚本中以更紧凑的方式进行评估(产生的结果与示例中预期的类似)像这样:
check_ocredit=$(sed -n 's/.*ocredit=\([0-1]\).*/\1/p' /etc/pam.d/password-auth)
[ "$check_ocredit" -eq "0" ] && echo "It's a zero" || echo "It's a $check_ocredit"