Problema com aspas (simples e duplas) awk e sed

1. Problema com aspas (simples e duplas) awk e sed

edson silva
lugh

(usa Debian)

Enviado em 17/08/2016 - 16:36h

Galera , boa tarde
Segue abaixo minha necessidade e também o que já desenvolvi e onde estou parado.
Necessidade:
Preciso fazer em apenas uma unica linha e o mais simples possível a comparação dos shells cadastrados no arquivo /etc/shells com os shells utilizados pelos usuarios, e caso exista algum usuário usando um shell ainda não castrado no /etc/shell ele incremente o arquivo /etc/shells. (isso será disparado via SSH para mais de 2 mil servidores)

awk -F: "! /$(tr "\n" " "< /etc/shells | sed 's/ /|/g;s/|$/$/g;s/\//\\\//g')/ {print $7}" /etc/passwd
teste:x:6226:254:TESTE user - Locked:/home/teste:/bin/false

Pergunta porque esse maldito não reconhece o separador : que defini no -F: ?
Pq quando altero para aspas simples o awk ele me da erro no tr?

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $7}' /etc/passwd
awk: fatal: Unmatched ( or \(: /$(tr "
" " "< /


Meu objetivo depois de resolvido é que fique algo mais ou menos assim:

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $1}' /etc/passwd && xargs {} >> /etc/shells



  


2. Re: Problema com aspas (simples e duplas) awk e sed

Douglas Rodrigues Pessanha
dougpess

(usa Linux Mint)

Enviado em 17/08/2016 - 23:31h

"..." Protege uma string, mas reconhece $, \ e ` como especiais
'...' Protege uma string completamente (nenhum caractere é especial)
$'...' Protege uma string completamente, mas interpreta \n, \t, \a, etc
`...` Executa comandos numa subshell, retornando o resultado

Fonte: http://aurelio.net/shell/canivete/


3. Re: Problema com aspas (simples e duplas) awk e sed

edson silva
lugh

(usa Debian)

Enviado em 18/08/2016 - 10:55h

dougpess escreveu:

"..." Protege uma string, mas reconhece $, \ e ` como especiais
'...' Protege uma string completamente (nenhum caractere é especial)
$'...' Protege uma string completamente, mas interpreta \n, \t, \a, etc
`...` Executa comandos numa subshell, retornando o resultado

Fonte: http://aurelio.net/shell/canivete/


O problema é que não posso usar aspas simples seguido de aspas simples

exemplo
awk -F: '! /$(tr '\n' ' ') .... '

ele vai interpretar que

a primeira aspas simples vai de
'! /$(tr '

e a segunda é de :
' '
a terceira:
') .... '




4. Re: Problema com aspas (simples e duplas) awk e sed

marcio mendes mendes
conectadohost

(usa XUbuntu)

Enviado em 18/08/2016 - 11:38h

Olá,
rapaz que bagunça esses códigos
problema que você quer fazer tudo em uma unica linha
o mais indicado para você seria fazer um script shell

pelo que eu entendi você quer verificar usuários com acesso shell
se for isso eu fiz algo parecido aqui mais ou menos assim
cat /etc/passwd | grep bash
ai usei o cut pra dar continuidade no script

no meu caso eu fiz o script pra verificar Usuários com acesso shell e remover
pois pra hospedagem usuário não pode ser ter acesso shell.


---> A arte de programar consiste na arte de organizar e dominar a complexidade.
---> Dijkstra <---


5. Re: Problema com aspas (simples e duplas) awk e sed

Douglas Rodrigues Pessanha
dougpess

(usa Linux Mint)

Enviado em 18/08/2016 - 12:26h

Dê uma explicação simples do que você quer que awk faça. Se possível dê um exemplo.


6. Re: Problema com aspas (simples e duplas) awk e sed

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 18/08/2016 - 14:26h

lugh escreveu:

Galera , boa tarde
Segue abaixo minha necessidade e também o que já desenvolvi e onde estou parado.
Necessidade:
Preciso fazer em apenas uma unica linha e o mais simples possível a comparação dos shells cadastrados no arquivo /etc/shells com os shells utilizados pelos usuarios, e caso exista algum usuário usando um shell ainda não castrado no /etc/shell ele incremente o arquivo /etc/shells. (isso será disparado via SSH para mais de 2 mil servidores)

awk -F: "! /$(tr "\n" " "< /etc/shells | sed 's/ /|/g;s/|$/$/g;s/\//\\\//g')/ {print $7}" /etc/passwd
teste:x:6226:254:TESTE user - Locked:/home/teste:/bin/false

Pergunta porque esse maldito não reconhece o separador : que defini no -F: ?
Pq quando altero para aspas simples o awk ele me da erro no tr?

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $7}' /etc/passwd
awk: fatal: Unmatched ( or \(: /$(tr "
" " "< /


Meu objetivo depois de resolvido é que fique algo mais ou menos assim:

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $1}' /etc/passwd && xargs {} >> /etc/shells


Boa tarde Edson.
Segue uma sugestão: (TESTADO E FUNCIONANDO)
for shell in $(awk -F: '{if($3>=1000 && $3<65534) print $7}' /etc/passwd|sort|uniq);do
if ! egrep -q "$shell" /etc/shells;then
echo "$shell" >> /etc/shells
fi; done


Outra SUGESTãO: (DE ACORDO COM O SOLICITADO ... :)
SHELLS=$(awk -F"/" '/^\/bin/{print $3}' /etc/shells|xargs|sed 's/ /\|/g')
if NOT_FIND=$(awk -F":" '$3>1000 && $3<65534 && $7!~/bin\/('$SHELLS')/ {print $7}' passwd);then echo "$NOT_FIND" >> /etc/shells;fi


É isso!!!
OBS.: SE a RESPOSTA foi ÚTIL, MARQUE-A como A MELHOR . . . :)

att.:
Marcelo Oliver


7. Re: Problema com aspas (simples e duplas) awk e sed

Ronaldo Ferreira de Lima
textmode

(usa Slackware)

Enviado em 18/08/2016 - 16:00h

lugh escreveu:

Galera , boa tarde
Segue abaixo minha necessidade e também o que já desenvolvi e onde estou parado.
Necessidade:
Preciso fazer em apenas uma unica linha e o mais simples possível a comparação dos shells cadastrados no arquivo /etc/shells com os shells utilizados pelos usuarios, e caso exista algum usuário usando um shell ainda não castrado no /etc/shell ele incremente o arquivo /etc/shells. (isso será disparado via SSH para mais de 2 mil servidores)

awk -F: "! /$(tr "\n" " "< /etc/shells | sed 's/ /|/g;s/|$/$/g;s/\//\\\//g')/ {print $7}" /etc/passwd
teste:x:6226:254:TESTE user - Locked:/home/teste:/bin/false

Pergunta porque esse maldito não reconhece o separador : que defini no -F: ?
Pq quando altero para aspas simples o awk ele me da erro no tr?

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $7}' /etc/passwd
awk: fatal: Unmatched ( or \(: /$(tr "
" " "< /


Meu objetivo depois de resolvido é que fique algo mais ou menos assim:

awk -F: '! /$(tr "\n" " "< /etc/shells | sed "s/ /|/g;s/|$/$/g/ {print $1}' /etc/passwd && xargs {} >> /etc/shells


Eu entendi que você procura por algo parecido com isto:

awk -F: 'FILENAME~/shells/{s[$0]=1;next}!($7 in s)&&$7!="/bin/false"{print}' /etc/shells /etc/passwd 


Entre outras opções, acho que este também seria "simples":

comm -1 -3 <(sort /etc/shells) <(cut -d: -f7 /etc/passwd|sort -u) | grep -Fv '/bin/false' 


[]'s
--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
https://perspicazsite.wordpress.com






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts