Preciso encontrar todos os diretórios pessoais dos usuários listados usando grep em / etc / passwd

8

Eu tenho uma pergunta semelhante a outra neste site em que o indivíduo precisou encontrar uma lista de todos os usuários usando grep ou awk em / etc / passwd. Isso funcionou para mim, mas tentei traduzi-lo para encontrar e listar os diretórios pessoais deles também. Eu já sei que você não pode fazer isso em uma linha, então eu sei que usaria um pipeline. Eu fiz minha pesquisa on-line, mas não consigo descobrir o problema. Se eu usar grep e fazer algo como o seguinte:

   grep -oE '^[/*/]$' /etc/passwd 

... provavelmente me daria um erro ou também me mostraria os arquivos / bin / bash que não é o que eu quero. Eu só preciso dos nomes de usuário e seus diretórios pessoais listados usando grep! Também não tenho certeza se o * mostrará outras barras como caracteres, pois alguns diretórios pessoais têm mais do que apenas dois / '(barras).

NarinderRSharma
fonte
3
Além disso, /etc/passwdpode ou não estar onde estão todos os usuários. Considere também getent passwd.
thrig

Respostas:

10

O Grep não é realmente a ferramenta para analisar dados dessa maneira, o grep é mais para correspondência de padrões e você está tentando processar o texto. Você gostaria de usar o awk.

awk -F":" '$7 == "/bin/false" {print "User: "$1 "Home Dir: "$6}' /etc/passwd

awk O comando

-F":" Define o delimitador de dados para:

$7 == "/bin/false" Verifica se a 7ª coluna de dados é / bin / false

{print "User: "$1 "Home Dir: "$6}' Diz para imprimir a primeira e a sexta coluna no formato especificado.

/etc/passwd O arquivo que estamos processando

Zachary Brady
fonte
Não gosto muito de awk, você poderia explicar o que exatamente -F: e '{print $ 1 "" $ 6}' fazem exatamente?
precisa
Eu atualizei minha resposta para responder à sua pergunta
Zachary Brady
sim, veja por mim quando eu faço isso, ainda me mostra as criptografias de senha, UID GIDS que tipo de shell estamos usando. Eu preciso apenas imprimir os usuários e eles são diretórios pessoais, nada mais. usando grep ou awk, é claro.
precisa
Quando eu uso o seguinte: grep -oE '^[^:]+' /etc/passwdque me dá apenas os usuários que eu preciso para pipline algo assim ou algo semelhante para ter os diretórios home lá com eles
NarinderRSharma
1
Podemos ver uma linha de amostra (ofuscada) de sua senha etc? Não parece: delimitado ou, se estiver, não é definido normalmente.
Zachary Brady
18

Você pode usar cutpara dividir arquivos com colunas em um delimitador específico:

cut -d: -f6 /etc/passwd

Ou -f1,6para as colunas (campos) 1 e 6.

Stefano Palazzo
fonte
4
Ferramentas simples que fazem um trabalho e o fazem bem. Mais um!
Fd0
1

Como outros já apontaram, grepnão é a melhor ferramenta para isso. Se você insistir em usá-lo, e se você grepsuporta -o(imprima apenas a parte correspondente da linha) e -P(use Expressões Regulares Compatíveis com Perl), faça o seguinte:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/password
terdon
/home/terdon
bob
/home/bob

Observe que isso imprimirá todos os usuários, incluindo os usuários do sistema. Estou apenas mostrando 4 linhas como exemplo.

Isso imprimirá o nome do usuário e os diretórios pessoais de todos os usuários, mas em linhas separadas. Você precisa unir cada par de linhas para juntá-las:

$ grep -oP '^[^:]+|.*:\K[^:]+(?=:[^:]+)' /etc/passwd | perl -pe 's/\n/ : / if $.%2'
root : /root
bin : /bin
daemon : /
mail : /var/spool/mail
ftp : /srv/ftp
http : /srv/http
uuidd : /
dbus : /
nobody : /
systemd-journal-gateway : /
systemd-timesync : /
systemd-network : /
systemd-bus-proxy : /
systemd-resolve : /
systemd-journal-upload : /
systemd-coredump : /
systemd-journal-remote : /
terdon : /home/terdon
avahi : /
polkitd : /
colord : /var/lib/colord
rtkit : /proc
gdm : /var/lib/gdm
git : /
bob : /home/bob

Explicação

O regex tem duas partes: procura ^[^:]+OR (é isso que |significa) .*:\K[^:]+(?=:[^:]+). O primeiro procura por um ou mais não :caracteres desde o início da linha. Isso corresponde ao nome do usuário. A segunda parte procura o máximo de caracteres possível até a :( .*:) e os descarta (é o que \Kfaz) para que não sejam impressos. Em seguida, corresponde a uma sequência de não - :que é seguida por :e não - :. A (?=foo)construção é chamada de aparência positiva e é uma maneira de corresponder os caracteres após um padrão sem incluir esses caracteres na própria correspondência.

O perlcomando substituirá as novas linhas por :e espaços se o número da linha atual ( $.) for divisível por 2. Portanto, a cada segunda linha.

terdon
fonte
O perl pode fazer todo o trabalho com o 'modo awk', perl -naf: -e 'print $F[0]." : ".$F[5].$/'portanto sed 'N;s/\n/ : /'pode ser um parceiro melhor para grep -oP.
David_thompson_085
0

Eu acredito que você pode fazer isso com "cut", usando apenas um binário, evitando pipes, atingindo os mesmos resultados que as outras respostas, mas de uma maneira mais elegante :), assim:

$ cut -d : -f 1,6 /etc/passwd

root:/root
daemon:/usr/sbin
bin:/bin
sys:/dev
sync:/bin
games:/usr/games
man:/var/cache/man
lp:/var/spool/lpd
mail:/var/mail
news:/var/spool/news
....

Se você deseja obter uma saída melhor formatada + ordem alfabética, aqui está, mas a desvantagem é essa, você precisa usar mais binários:

$ cut -d : -f 1,6 /etc/passwd | sort | column

avahi-autoipd:/var/lib/avahi-autoipd        man:/var/cache/man
avahi:/var/run/avahi-daemon                 messagebus:/var/run/dbus
backup:/var/backups                         news:/var/spool/news
bin:/bin                                    nobody:/nonexistent
clickpkg:/nonexistent                       ntp:/home/ntp
colord:/var/lib/colord                      proxy:/bin
daemon:/usr/sbin                            pulse:/var/run/pulse
dnsmasq:/var/lib/misc                       root:/root
games:/usr/games                            rtkit:/proc
gnats:/var/lib/gnats                        saned:/home/saned
hplip:/var/run/hplip                        speech-dispatcher:/var/run/speech-dispatcher
irc:/var/run/ircd                           sync:/bin
ivanleon:/home/ivanleon                     sys:/dev
kernoops:/                                  syslog:/home/syslog
libuuid:/var/lib/libuuid                    usbmux:/home/usbmux
lightdm:/var/lib/lightdm                    usermetrics:/var/lib/usermetrics
list:/var/list                              uucp:/var/spool/uucp
lp:/var/spool/lpd                           whoopsie:/nonexistent
lxc-dnsmasq:/var/lib/lxc                    www-data:/var/www
mail:/var/mail
ivanleoncz
fonte