Ou com um cano
awk -F: '$4 < 1 {print $1}' /etc/shadow |
while read p; do
chage -m 1 "$p"
done
ou com substituição de processos
while read p; do
chage -m 1 "$p"
done < <(awk -F: '$4 < 1 {print $1}' /etc/shadow)
O comando abaixo me fornecerá uma lista de usuários que não têm uma vida mínima de senha de 1 dia. Isso funciona corretamente.
awk -F: '$4 < 1 {print $1}' /etc/shadow
Eu quero pegar essa lista e executar ...
chage -m 1 $p
em que $ p é o nome de usuário em cada linha.
Normalmente, eu salvaria essa lista como um arquivo e, em seguida, executaria um loop while contra ela. Veja abaixo o meu comando completo para alterar todos os usuários para uma senha mínima de 1 dia.
mkdir ./tmp
awk -F: '$4 < 1 {print $1}' /etc/shadow > ./tmp/usernamelist
while read p; do
chage -m 1 $p
done <./tmp/usernamelist
rm -rf ./tmp/usernamelist
Existe uma maneira de fazer a mesma coisa logicamente, mas sem ter que salvar um arquivo? Esta é uma prática recomendada?
Eu acho que seria uma maneira de fazer isso com um comando pipe, mas não consigo encontrar uma maneira adequada de estruturá-lo.
awk -F: '$4 < 1 {print $1}' /etc/shadow | xargs -r -L 1 chage -m 1
O -L 1
garante que cada linha da saída awk seja passada para uma chamada separada chage , e o -r
garante que chage não seja executado se awk não produz nada (o que, reconhecidamente, é bastante improvável neste caso).
Tags bash shell-script