我正在使用 ansible 来读取 /etc/sudoers 文件以显示哪些用户在相关服务器上拥有 root 权限。
这是.sh 文件
#!/bin/bash
username=`sudo cat /etc/sudoers | grep "NOPASSWD: ALL" | grep -v ^#`
hostname=`sudo hostname`
echo "xyz | $username | $hostname"
这是创建输出的另一个 .sh 文件,我首先执行这个文件。
#!/bin/bash
/bin/ansible-playbook /etc/ansible/scripts/sudoerscheck.yaml >|
/root/script/sudoers.dat
/bin/cat /root/script/sudoers.dat | grep xyz | awk -F '|' '{ print $2":"$3
}' | awk -F '\"' '{ print $1 }' >| /root/script/sudoers.txt
下方的 ansible 输出;
ok: [test1] => {
"changed": false,
"shell_result.stdout_lines": [
"xyz | oracle ALL=(ALL) NOPASSWD: ALL",
"cuser ALL=(ALL) NOPASSWD: ALL",
"dogfish ALL=(ALL) NOPASSWD: ALL | test1"
]
}
ok: [test2] => {
"changed": false,
"shell_result.stdout_lines": [
"xyz | | test2"
]
}
ok: [test3] => {
"changed": false,
"shell_result.stdout_lines": [
"xyz | ADMINS \tALL=(ALL)\tNOPASSWD: ALL",
"oracle ALL=(ALL) NOPASSWD: ALL | test3
您能帮助我如何获得下面的输出吗?并且用户名是可以更改的
test1 oracle cuser dogfish
test2 NULL
test3 oracle ADMINS
答案1
这是有效的。
#!/bin/bash
OUTPUT=$(cat /etc/passwd | grep -v nologin | grep -v root | awk -F: '{ print
$1 }')
block1=`hostname`
while read -r line
do
if [[ `sudo -l -U $line | grep NOPASSWD` ]];then
echo $block1 $line
else
echo $block1 $line
fi
done <<< "$OUTPUT"
答案2
你可以像下面这样做:-
脚本的第一行将打印第 1 行,sed 将提取 [] 下的字符串并存储在 param1 中
脚本的第二行将打印第 4 行,awk 将打印第 3 列并存储在变量 param2 中
脚本的第 3 行将打印第 5 行,脚本的第 4 行将打印第 6 行,awk 将打印第 1 列,sed 将从其中删除 "
param1=$(head -1 sudoers.txt | sed 's/ok: \[//g;s/] => {//g') param2=$(head -4 sudoers.txt | tail -1 | awk '{print $3}') param3=$(head -5 sudoers.txt | tail -1 | awk '{print $1}' | sed 's/"//g') param4=$(head -6 sudoers.txt | tail -1 | awk '{print $1}' | sed 's/"//g') echo '$param1 $param2 $param3 $param4' > sudoers.txt
答案3
如果您提到的输出元素是静态的(如果您确认它不会改变)意味着 。可以直接使用下面的命令
这里 file.txt 是 ansible 输出
egrep -o "test1|oracle|cuser|dogfish" file.txt | sort | uniq | tac | tr "\n" " " | awk '{$5=$3;$3=$4;$4="";print $0}'| sed -r "s/\s+/ /g"
输出
test1 oracle cuser dogfish