Używanie `ls` do pokazywania prawdziwych nazw właścicieli plików

0

Użytkownicy Uniksa mogą mieć swoje prawdziwe nazwiska wymienione w /etc/passwd/. The finger polecenie może wyświetlać prawdziwe nazwy. Mogą ls -l pokaż te prawdziwe nazwy właścicieli plików obok plików?

Jeśli ls nie można tego zrobić bezpośrednio, to jaki jest najlepszy sposób na potokowanie danych wyjściowych ls -l przez finger aby osiągnąć ten wynik? Brzmi jak praca awk - posługiwać się ls -l | finger jako tabela przeglądowa do zastąpienia trzeciej kolumny ls -l.

(Podobne pytanie w przypadku, gdy nie ma prawdziwych nazw finger ale w tabeli przeglądowej: Wymiana tekstu w tabeli wyszukiwania w bashu )

root
źródło
1
Dlaczego zadajesz dwa oddzielne pytania? Wygląda na to, że próbujesz rozwiązać jeden problem i pomyślałeś o dwóch podejściach. Porównać Problem XY . Czy byłoby dobrze, gdybyś zapytał o X raz? i tylko wspomniałeś, że myślisz, że Y1 lub Y2 pomogą. Być może najlepszym rozwiązaniem jest jakaś Y3, o której nikt z nas nie wie. Dlaczego więc dwa pytania?
Kamil Maciorowski
Dwa pytania, ponieważ dotyczą dwóch różnych ustawień. W jednym ustawieniu nazwy są dostępne w finger (I może ls może uzyskać dostęp do tych informacji). W drugim pytaniu prawdziwe nazwy znajdują się w pliku, ale nie w finger.
root
1
Czemu nie analizować ls? Nie powinieneś tego próbować: ls -l | awk 'BEGIN{lc=0; while((getline line<"/etc/passwd") >0){split(line,p,":"); map[p[1]]=p[5]; lc++}} {$3=map[$3]}1' Zakładam, że trzecia kolumna twojego ls -l polecenie zawiera użytkownika.
Cyrus
1
Jak wspomniano powyżej, nie analizuj wyniku ls (jest dla ludzi, nie maszyn) ... dodatkowo, finger tak naprawdę nie jest do tego przeznaczony ... wolę coś takiego getent passwd ${USER}. Co gorsza, nie sądzę, aby czwarte pole passwd było standaryzowane ... patrz GECOS
Attie

Odpowiedzi:

0

Możesz analizować ls jak @Cyrus wspomniany w komentarzach. Proponuję jednak zrobić prosty skrypt, który można wykonać jako plik wykonywalny:

while read -r line
do
    user=`echo "$line" | awk '{print $3}'`
    name=`getent passwd "$user" | cut -d ':' -f 5 | cut -d ',' -f 1`
    echo $line | sed "s/$user/$name/"
done < <(ls -lh | tail -n +2)

The user zmienna otrzymuje nazwę użytkownika właściciela (z 3. kolumny wyjścia ls), name pobiera prawdziwą nazwę użytkownika, a następnie na wyjściu ls po prostu zastępujemy nazwę użytkownika prawdziwym imieniem i nazwiskiem sed.

Nie użyłem finger w moim przykładzie jako parsowanie /etc/passwd plik jest mniej podatny na błędy i nie potrzebujesz zewnętrznego narzędzia. ( finger nie jest domyślnie zainstalowany na Debianie / Ubuntu)

Przykładowy wynik:

-rwxr-xr-x 1 Pavlin Nikolov fanatique 41 Aug 29 15:13 cpu.sh
-rwxr-xr-x 1 Pavlin Nikolov fanatique 193 Aug 28 11:36 httpingwrap.sh
-rwxr-xr-x 1 Pavlin Nikolov fanatique 3.8K Aug 14 15:36 imgconv.py
-rwxr-xr-x 1 Pavlin Nikolov fanatique 504 Oct 19 16:04 lsp
-rwxr-xr-x 1 Pavlin Nikolov fanatique 77 Aug 28 14:24 mg
-rwxrwxrwx 1 Pavlin Nikolov fanatique 386 Sep 14 15:02 mon-install.sh
-rwxr-xr-x 1 Pavlin Nikolov fanatique 589 Sep 11 11:55 ping-wrapper.py

Zauważ, że nie jest to najlepiej wyglądające wyjście, ponieważ nie jest idealnie wyrównane, ale powinno nadal działać.

Fanatique
źródło
Czemu nie analizować ls (a co zamiast tego)? ... ls -lh | tail -n +2 to dopiero początek ... Powinieneś przynajmniej używać --numeric-uid-gid jeśli masz zamiar spróbować :-)
Attie