Я попытался найти повторяющееся имя пользователя в файле /etc/passwd следующим образом:

#!/bin/bash

# passwd file are look like below
# username : password : user ID : group ID : user ID info : home directory : command shell

cut -d: -f1 passwd | sort | uniq -d|
while IFS=: read -r user_name;
do
    echo "$user_name"
done

Затем я попытался найти список уникальной оболочки, используемой среди всех этих пользователей-дубликатов. Но не знаю, как это сделать.

Есть ли способ отобразить уникальную оболочку, используемую всеми этими дубликатами пользователей?

Мой файл etc/passwd приведен ниже:

imshakil:x:1000:1000:Mobarak Hosen Shakil,,,:/home/imshakil:/bin/bash
nm-openvpn:x:122:129:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
lightdm:x:123:131:Light Display Manager:/var/lib/lightdm:/bin/false
hadoop:x:1001:1001:Bigger Hadoop,,,:/home/hadoop:/bin/bash
sshd:x:124:65534::/run/sshd:/usr/sbin/nologin
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
gdm:x:121:127:Gnome Display Manager:/var/lib/gdm3:/bin/false
imshakil:x:1000:1000:Mobarak Hosen Shakil,,,:/home/imshakil:/bin/bash
nm-openvpn:x:122:129:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
lightdm:x:123:131:Light Display Manager:/var/lib/lightdm:/bin/false
hadoop:x:1001:1001:Bigger Hadoop,,,:/home/hadoop:/bin/bash
sshd:x:124:65534::/run/sshd:/usr/sbin/nologin

Мне нужно получить вывод, как показано ниже: дубликаты пользователей:

bin
daemon
hadoop
imshakil
lightdm
nm-openvpn
root
sshd
sync
sys

И список используемых ими оболочек:

/bin/bash
/bin/false
/bin/sync
/usr/sbin/nologin

(Обновлено )

0
Mobarak Hosen Shakil 5 Май 2020 в 18:40
1
Термин «дубликат» используется здесь сбивчиво. Каким образом эти пользователи являются «дубликатами»?
 – 
Jeff Schaller
5 Май 2020 в 18:20
Ваш цикл while-read бессмысленен: он просто читает и записывает то, что все равно идет по трубе. Но изменение -f1 на -f7 сделает эту работу.
 – 
Paul_Pedant
5 Май 2020 в 18:32
Я не верил, что в /etc/passwd можно впихнуть дубликата пользователя, но, похоже, nm-openvpm это сделал. Интересно, у этого пользователя два разных пароля?
 – 
Paul_Pedant
5 Май 2020 в 18:34
На самом деле я отредактировал файл /etc/passwd, чтобы создать дубликат имени пользователя.
 – 
Mobarak Hosen Shakil
5 Май 2020 в 18:36
Я обновил свой вопрос.
 – 
Mobarak Hosen Shakil
5 Май 2020 в 18:43

2 ответа

Лучший ответ

Ты мог бы сделать

sort /etc/passwd | uniq -c | grep -vE '^ +1 ' | cut -d: -f 7 | sort -u

Или все в авк

awk -F: '++count[$1] == 2 {shell[$NF]} END {for (s in shell) print s}' /etc/passwd
2
glenn jackman 5 Май 2020 в 19:16
Разве это не должно быть >=, чтобы разрешить дубликаты, которые различаются по полям оболочки?
 – 
JdeBP
5 Май 2020 в 19:25
Я предполагаю. Требования не ясны
 – 
glenn jackman
5 Май 2020 в 19:26
Спасибо @glennjackman Это работает, как и ожидалось.
 – 
Mobarak Hosen Shakil
5 Май 2020 в 21:33
Я изменил, как показано ниже: awk -F: '++count[$1] >= 2 {shell[$NF]} END {for (s in shell) print s}' передан
 – 
Mobarak Hosen Shakil
5 Май 2020 в 21:35
Разница в том, что (а) моя версия берет оболочку из 2-го вхождения повторяющегося имени, а (б) ваша берет оболочку из последнего вхождения.
 – 
glenn jackman
5 Май 2020 в 23:01

Следующая команда будет только сравнивать имя пользователя, игнорировать любые различия в других полях (например, uid, gid, homedir, shell) и выбирать все оболочки, используемые повторяющимися именами пользователей.

grep -f <(cut -d: -f1 /etc/passwd | sort | uniq -d | sed -e "s/^/^/") /etc/passwd | cut -d: -f7 | sort -u
0
AdminBee 6 Май 2020 в 10:55