logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Skrypt bash i awk: wyświetlanie użytkowników i plików z prawami dostępu

ADI-mistrzu 05 Cze 2011 19:18 3317 11
REKLAMA
  • #1 9579725
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    Witam!

    Muszę napisać skrypt który będzie pobierał podany parametr, sprawdzał jego poprawność i wykonywał określone czynności:

    1. Wyświetla zalogowanych użytkowników w systemie nie powtarzając ich.
    2. Wyświetla listę plików zwykłych oraz prawa dostępu, w następujący sposób:
    <ścieżka dostępu do kalatogu><nazwa pliku><prawa dostępu><liczba dowiązań>
    Sprawdzić czy drugi parametr określa katalog.

    To co mam teraz wygląda tak:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Nie mam pojęcia jak zrobić aby sprawdzał czy dany użytkownik był już wyświetlony czy nie. Próbowałem jakoś przekazać wynik polecenia who do awk aby później mieć to w tablicy ARGV tak, że pod każdym z jej adresów jest inny wyraz, ale nie wychodziło mi to.

    Co do drugiego (w programie ostatnie pod parametrem -z) to mam problem jak to wyświetlić w takiej kolejności jak jest w poleceniu.
    Na razie zrobił to tak że wyświetla ścieżkę dostępu a potem w liście dalsze dane.
    Druga sprawa to jak sprawdzić że drugi parametr określa katalog?
  • REKLAMA
  • Pomocny post
    #2 9579759
    dt1
    Admin grupy komputery
    Posty: 48239
    Pomógł: 7315
    Ocena: 8289
    Witaj,
    Jeśli chodzi o wyeliminowanie duplikatów to spróbuj:

    who | awk '{ print $1 }' | sort | uniq


    Jeśli chcesz, aby wyświetlił bieżącą ścieżkę i za nią nazwę pliku to możesz spróbować tego:

    for i in `ls -1`; do echo `pwd`/$i; done


    Uwaga - parametr do ls to cyfra 1, a nie literka małe L.
  • #3 9579843
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    Hm... uniq nie znałem, a takie proste i poręczne... Dziękuję :wink:

    Co do sprawdzania czy katalog istnieje, to chciałem wyłuskać błąd z komendy cd i czy nastąpił.
    Niestety nie wiem jak owy błąd wyłuskać. Bo jak w inny sposób można by było sprawdzić czy katalog istnieje?

    Co do skryptu, wyświetla ścieżkę, tylko dalej nie wiem za bardzo jak zrobić aby było to wszystko w rzędzie. Bo echo kończy się znakiem nowej linii więc następne rzeczy będą pod spodem.
  • REKLAMA
  • Pomocny post
    #4 9579919
    dt1
    Admin grupy komputery
    Posty: 48239
    Pomógł: 7315
    Ocena: 8289
    Jeśli chodzi o sprawdzanie to można sprawdzić, czy cd zwróci błąd, o tym nie pomyślałem, ale możesz też spróbować jakoś tak:

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Pierwszy wynik zwróci zero (to jest plik)
    Drugi zwróci jeden (katalog)
    Trzeci zwróci sporo więcej niż jeden (dużo plików)
    Czwarty zwróci zero (brak pliku, błąd przekierowany do /dev/null, nic nie wyświetli)

    Czyli ogólnie jeśli zwróci jeden to można potraktować jako katalog ;)

    Możesz przypisać do zmiennej sprawdzenie, a potem ifem porównać z cyfrą 1:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Co do echo, jak nie chcesz w słupku to zmień:
    for i in `ls -1`; do echo -ne `pwd`/$i" "; done


    A tak ogólnie - nie ma sensu wymyślać koła od nowa, ifem można sprawdzić, czy coś jest katalogiem. Opcja -d jest od tego (ale wolałem kombinować, niż mana czytać) :P
  • #5 9580228
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    Podobnie zrobiłem :D
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    Co do wypisywania informacji o plikach:
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    Coś takiego kombinuję, aby wyświetlić określoną kolumnę z wiersza gdzie znajduje się określony wyraz (czyli nazwa pliku).
    W ten sposób, z racji że nazwy plików się nie powtarzają, będę mógł wyświetlać ich parametry określone.
    Tylko nie wiem jak jeszcze przekazać parametr do porównania.
  • #6 9580402
    dt1
    Admin grupy komputery
    Posty: 48239
    Pomógł: 7315
    Ocena: 8289
    Jeśli podasz jakiś przykład (co masz -> co chcesz osiągnąć) to będzie mi łatwiej to sobie wyobrazić :)
  • REKLAMA
  • #7 9581499
    WojtasJD
    Poziom 43  
    Posty: 13788
    Pomógł: 2919
    Ocena: 1586
    1. Wyświetla zalogowanych użytkowników w systemie nie powtarzając ich.

    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    (BTW: zamiast sort | uniq można sort -u)

    2. Wyświetla listę plików zwykłych oraz prawa dostępu[...]

    ls -l + awk wystarczą, jednak w tej postaci co masz teraz to i nie-zwykłe będą wylistowane

    ADI-mistrzu napisał:
    Co do sprawdzania czy katalog istnieje, to chciałem wyłuskać błąd z komendy cd i czy nastąpił.
    Niestety nie wiem jak owy błąd wyłuskać. Bo jak w inny sposób można by było sprawdzić czy katalog istnieje?

    Kod: Bash
    Zaloguj się, aby zobaczyć kod
  • #8 9604508
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    Przez ten tydzień byłem zajęty i nie mogłem się tym zająć, ale teraz chwilę przysiadłem.

    Został tylko problem z wyświetleniem listy plików zwykłych oraz praw dostępu, w następujący sposób:
    <ścieżka dostępu do kalatogu><nazwa pliku><prawa dostępu><liczba dowiązań>

    Da się zrobić w awk aby wyświetlał określony wiersz a nie wszystkie? Wtedy przy jego pomocy i i ls -l można by rozwiązać to zadanie.


    Dodałem jeszcze wykrywanie czy użytkownik jest zalogowany i działa funkcja, ale zwraca coś jeszcze:

    A zwraca:
    /root/test[66]: [: ktosiek: unexpected operator/operand
    Uzytkownik nie zalogowany!

    Wskazuje na przedostatnią linię w której jest "fi".
    Jeśli usuną kod do wykrywania czy jest zalogowany użytkownik to błąd znika.
  • #9 9604831
    dt1
    Admin grupy komputery
    Posty: 48239
    Pomógł: 7315
    Ocena: 8289
    -eq służy do porównywania wyrażeń liczbowych.
    Spróbuj zamiast tego:
    if [ "$uzytkownik" = "$2" ]

    Powinno działać lepiej.

    Drobna uwaga (również z manuala do komendy uniq): uniq działa na zasadzie porównywania sąsiednich linii, tak więc spodziewa się posortowanej listy. Dla bezpieczeństwa warto awk ... | uniq zamienić na awk ... | sort | uniq.
  • REKLAMA
  • #10 9604851
    ADI-mistrzu
    Poziom 30  
    Posty: 2261
    Pomógł: 37
    Ocena: 308
    z jednym = to raczej przyrównanie (chyba ze jest jednak inaczej...), przy == zwraca tą samą dziwną informację.
  • #11 9605146
    dt1
    Admin grupy komputery
    Posty: 48239
    Pomógł: 7315
    Ocena: 8289
    man test, sekcja sprawdzanie łańcuchów znakowych mówi, że pojedyncze = jest OK. Z resztą odpaliłem testowo Twój skrypt i u mnie działa z pojedynczym =.
  • #12 9608111
    WojtasJD
    Poziom 43  
    Posty: 13788
    Pomógł: 2919
    Ocena: 1586
    ADI-mistrzu napisał:
    Da się zrobić w awk aby wyświetlał określony wiersz a nie wszystkie?

    Podstawy awk.
    Wyświetlenie trzeciego wiersza z plik
    Kod: Bash
    Zaloguj się, aby zobaczyć kod


    aha, z Twojego kodu np. ten :
    Kod: Bash
    Zaloguj się, aby zobaczyć kod

    nie będzie prawidłowo działał dla plików ze spacjami w nazwie...

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono temat tworzenia skryptu bash, który ma na celu wyświetlanie zalogowanych użytkowników oraz listy plików z ich prawami dostępu. Użytkownicy dzielili się rozwiązaniami, jak uniknąć duplikatów w liście użytkowników, używając komendy `who | awk '{ print $1 }' | sort | uniq`. Wskazano również na możliwość sprawdzenia, czy podany parametr to katalog, poprzez analizę błędów komendy `cd` oraz użycie `ls -ld`. Uczestnicy dyskusji sugerowali użycie `awk` do wyświetlania określonych kolumn z wyników `ls -l`, a także omawiali problemy związane z porównywaniem zmiennych w skrypcie. Wskazano na konieczność użycia sortowania przed `uniq` oraz na problemy z nazwami plików zawierającymi spacje.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA