Tenta obter linha única da saída ansível

0

Estou usando o ansible para ler o arquivo / etc / sudoers para exibir quais usuários têm permissão de root no servidor relacionado.

Este é o arquivo .sh

    #!/bin/bash

    username='sudo cat /etc/sudoers | grep "NOPASSWD: ALL" | grep -v ^#'
    hostname='sudo hostname'

    echo "xyz | $username | $hostname"

Esse é o outro arquivo .sh que cria a saída que eu executo primeiro.

 #!/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

resultado ansible abaixo;

 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

Você poderia, por favor, ajudar como faço para obter o resultado abaixo? E os nomes dos usuários são mutáveis

 test1 oracle cuser dogfish
 test2 NULL
 test3 oracle ADMINS
    
por 1010111100011 09.04.2018 / 15:15

3 respostas

1

Isso está funcionando.

#!/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"
    
por 11.04.2018 / 07:53
0

Você pode fazer como abaixo: -

  1. a primeira linha do script será impressa na linha 1 e sed extrairá a string em [] e armazenada no parâmetro1

  2. A segunda linha do script irá imprimir a quarta linha e o awk irá imprimir a coluna 3 e armazenado na variável param2

  3. A terceira linha do script irá imprimir a 5ª linha e a 4ª linha do script irá imprimir a 6ª linha e o awk irá imprimir a coluna 1 e o sed irá remover o "a partir dele

       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 
    
por 09.04.2018 / 15:48
0

Se os elementos de saída que você mencionou forem estáticos (se você estiver confirmado sobre isso não irá mudar) significa. Você pode usar abaixo o comando diretamente

Aqui file.txt é uma saída 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"

saída

test1 oracle cuser dogfish
    
por 09.04.2018 / 16:43