Tags Posts tagged with "bash"

bash

przez -
12 2363
Microsoft

Microsoft zapowiedziała udostępnienie w pełni działającej powłoki Bash na systemie Windows 10. Wiadomość obiegła świat w czasie trwania konferencji BUILD 2016, która w głównej mierze skierowana jest do deweloperów. Kevin Gallo z Microsoftu powiedział, że dzięki udanemu partnerstwu z firmą Canonical, w system zaimplementowano nową infrastrukturę – Windows Subsystem for Linux (WSL), która posiada natywne aplikacje z Ubuntu, dzięki czemu całość jest niezwykle lekka i szybka. Jak pisze Scott Hanselman na swoim blogu: Developers can run Bash Shell and user-mode Ubuntu Linux binaries on Windows 10, można z poziomu emulatora konsoli Linux (natywna aplikacja Windows), pobrać i zainstalować takie aplikacje jak grep, vim, awk, sed, emacs i wiele innych.

Wbudowany mechanizm apt-get działa dokładnie tak, jak w Ubuntu. Deweloperzy mogą korzystać z języków programowania takich, jak Ruby, Python, PHP, a także narzędzi pokroju Redis. I jak mówi Scoot: Nie jest to maszyna wirtualna.

przez -
19 1261
Konsola

Hakerzy zajmujący się bezpieczeństwem odkryli poważny błąd w powłoce Bash – CVE-2014-6271, który według wielu osób może być groźniejszy, aniżeli podatność na atak Heartbleed. Krytyczna luka polega na tym, że w powłoce Bash możemy stworzyć zmienne środowiskowe ze specjalnie zmodyfikowanymi wartościami, przed wywołaniem głównej powłoki. Owe zmienne mogą zawierać kod, który wykona się w momencie uruchomienia powłoki. Nazwy stworzonych zmiennych nie mają znaczenia, ale ich zawartość już tak.

Co jest podatne, a co nie:

  • ForceCommand są używane w konfiguracjach sshd, aby zapewnić ograniczone możliwości wykonywania komend dla zdalnych użytkowników. Owa podatność może zostać wykorzystana do przesłania spreparowanego polecenia
  • Serwer Apache wykorzystuje wtyczki mod_cgi lub mod_cgid, które są podatne, o ile skrypty CGI są napisane w Bashu lub wywołują podpowłoki.
  • Skrypty PHP uruchamiane z użyciem mod_php są w pełni bezpieczne
  • Klienty DHCP inicjują skrypty powłoki do konfiguracji systemu, z wartościami pobranymi od potencjalnie niebezpiecznych serwerów. Może to spowodować wykonanie losowych poleceń, jako użytkownik root na maszynie klienta DHCP
  • Wiele demonów systemowych i programów SUID może wykonywać skrypty powłoki ze zmiennymi środowiskowymi
  • Każda inna aplikacja, która posiada możliwość podpięcia się pod powłokę lub uruchomienia skryptu. Skrypty, które nie eksportują żadnej zmiennej, nie są podatne na ten błąd.

Oto prosty przykład skryptu ze zmiennymi:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 vulnerable
 this is a test

Firma Red Hat przygotowała już odpowiednią łatkę: Resolution for Bash Code Injection Vulnerability via Specially Crafted Environment Variables (CVE-2014-6271) in Red Hat Enterprise Linux, po instalacji której pojawi się poniższy wynik:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 bash: warning: x: ignoring function definition attempt
 bash: error importing function definition for `x'
 this is a test

Powyższa poprawka dotyczy zarówno Red Hat Enteprise Linux, jaki i CentOS: [CentOS] Critical update for bash released today.

przez -
14 7398
Programowanie

Jeśli używasz jakiegokolwiek Linuksa, to wiesz, że już “czysty” system posiada mnóstwo programów. Zwyczajnemu użytkownikowi aż nadto. Ale czasami okazuje się, że masz jakieś węższe zastosowanie i co prawda możesz męczyć się z istniejącym oprogramowaniem, ale w zasadzie lepiej by było, jakby gdzieś znalazł się bardziej wyspecjalizowany program. Poszukiwania w google nie dają żadnych rezultatów, programować za bardzo nie umiesz, a napisanie przez kogoś odpowiedniego programu kosztuje majątek. W pewnym momencie przypominasz sobie, że jednym z największych atutów Linuksa są skrypty powłoki.

Gdzieś już widziałeś jakiś skrypt, jak go podejrzałeś, to nie wyglądał na taki straszny. W sieci jest mnóstwo poradników, które mówią o skryptach powłoki, każdy z nich daje olbrzymią ilość przykładów, ale to zazwyczaj są skrypty, które spełniają podstawowe funkcje. Poniżej postaram się przedstawić kilka prostych rad odnośnie tego od czego zacząć i na co zwrócić uwagę zacząć, żeby w efekcie działań powstał skrypt, który jest przydatny, nie zaś czysto teoretyczny. Nie będę przedstawiał tego na przykładach, jest ich od groma choćby na tym portalu. Osobiście piszę skrypty w powłoce bash, ale w zasadzie dla początkującego nie ma zbyt wielkiej różnicy między poszczególnymi powłokami (no, chyba, że są dedykowane do konkretnych celów jak np nologin czy wish).

1. Zdefiniuj konkretny cel

Zanim zaczniesz cokolwiek robić i pisać – pomyśl czego dokładnie chcesz. Jeśli nie zdefiniujesz sobie celu, nie będzie szans osiągnięcia go.

2. Zdefiniuj etapy

Jeśli już masz konkretny cel, pomyśl jak twoim zdaniem najłatwiej go osiągniesz. Spróbuj podzielić go na etapy. Na przykład, jeśli twoim celem byłoby chodzenie w czystych ubraniach, to etapami byłoby zdjęcie ubrań, włożenie ubrań do pralki, wsypanie proszku, odpalenie prania, wyjęcie z pralki i powieszenie na sznurkach, oczekiwanie na wyschnięcie ubrań, założenie czystych ubrań i chodzenie w czystych ubraniach. Podobnie sprawa wygląda ze skryptami – też musisz przemyśleć całą drogę do realizacji swojego pomysłu. Jest to najtrudniejszy element całego procesu, niestety też najrzadziej wymieniany. To za ten schemat postępowania płacisz programistom. Tutaj nie chodzi o znalezienie najprostszego sposobu, który ma jak najmniej kroków, tutaj chodzi o znalezienie sposobu, który wiesz jak zrealizować. Jeśli dobrze podzielisz cały swój skrypt na elementy składowe, to napisanie go zajmie ci niewiele czasu.

3. Pracuj nad jednym etapem jednocześnie

Jeśli już masz skrypt podzielony na kolejne etapy – zacznij realizować je w liniach kodu. Każdy z etapów oddzielaj komentarzem opisującym dany fragment. Jeśli piszesz etap drugi – sprawdź, czy na pewno otrzymuje z etapu pierwszego, wszystko co jest mu potrzebne. Korzystając przykładu z pralką – aby włożyć ubrania do pralki, musisz je mieć w ręku, nie zaś na sobie. Jeśli chcesz w jakimś etapie przeanalizować ściągnięty plik, to plik ten musi zostać pobrany we wcześniejszym etapie.

4. Używaj komentarzy

Zostawiaj w skrypcie notatki. Masz do tego możliwości, możesz nawet zostawić pół strony notatek przy każdej linii kodu. To właśnie notatki pozwolą Ci bezproblemowo poprawić skrypt, jeśli trzeba będzie to zrobić za pół roku.

5. Korzystaj z dokumentacji

Jeśli gdzieś utkniesz – sięgnij do mana lub użyj google. Jeśli nie wiesz co dalej zrobić, jak wywołać jakieś polecenie, co z nim zrobić – poszukaj pomocy. Wszelkie przełączniki polecenia znajdziesz w manie, mniej standardowe zastosowania znajdziesz za pomocą google. Jeśli nie wiesz jakiego polecenia użyć – wpisz w google co chcesz zrobić, na pewno znajdziesz podpowiedź.

6. Unikaj skrótów na siłę

Czasami można sobie skrócić polecenie, za pomocą przełączników innego polecenia. Wtedy kod jest “czystszy” i bardziej trendi. Przy okazji często mniej zrozumiały. Najprostszym przykładem jest tutaj polecenie grep. Za jego pomocą możemy wszystko wykonać na dwa sposoby przekazując mu tekst, który obrobi np.

cat plik.txt | grep poszukiwania

jak i wywołać samodzielnie

grep poszukiwania plik.txt

Wszystko jest czytelne, ale do pewnego momentu. Jeśli dodamy grepowi kilka opcji, do tego za pomocą opcji -e każemy mu wyszukiwać więcej zwrotów, to nagle może się okazać, że zgubiliśmy gdzieś nazwę pliku w którym szukamy. Pierwsze wywołanie jest mniej trendy (i bardziej zużywa klawisze na klawiaturze), ale za to zmniejsza ryzyko naprawdę głupiej pomyłki. Czasami też widzimy, że wszystko tak ładnie się ze sobą składa, że możemy wszystkie kilkadziesiąt elementów skryptu umieścić w jednej linii. Wszystko w porządku, jeśli nie będzie trzeba poprawiać kodu. Rozłożenie tej pojedynczej linii na kilkanaście mniejszych linijek i zrobienie tymczasowego pliku (lub plików) a także dopisanie kilku komentarzy może w przyszłości znacznie ułatwić analizę i poprawienie lub dostosowanie całego skryptu. Przy okazji może okazać się, że część takiego skryptu da się wykorzystać w innym skrypcie.

7. Unikaj nieznanych elementów

Zawsze staraj się pisać w oparciu o znane Ci komendy. Oczywiście, szczególnie na początku jest to trudne. Ale staraj się w skrypcie nie zawierać zbyt wiele nowych poleceń. Jeśli wiesz, że coś zadziała, to nie szukaj na siłę alternatyw celem szeroko rozumianego samorozwoju. Awangardowe rozwiązania są świetne gdy projektujesz knajpę, w zwykłych skryptach często zawadzają. Zazwyczaj lepiej jest iść prosto do celu niż z finezją wylądować w koszu.

8. Definiuj wszystkie zmienne

Zawsze pisząc skrypt zwracaj uwagę na zdefiniowanie wszystkich zmiennych. O ile w językach programowania kompilator zazwyczaj poinformuje cię, że czegoś nie zdefiniowałeś, o tyle w skryptach powłoki brak definicji nie jest przeszkodą, po prostu efekt może być inny od spodziewanego.

9. Nietypowe wywołania

Jeśli twój skrypt wymaga jakiegoś parametru wpisywanego z linii poleceń – sprawdź co się stanie, jeśli zapomnisz go wpisać. Sprawdź co się stanie, jeśli wpiszesz dziwny (na przykład litery zamiast cyfr) parametr. A co się stanie, jeśli wpiszesz cyfrę z siedemnastoma zerami? Albo wręcz zero/liczbę ujemną? Jeśli często zdarzają Ci się przypadkowe pomyłki – może warto pomyśleć nad zabezpieczeniem skryptu i sprawienie, że źle wywołany po prostu nie zadziała (np prosty warunek wykonania – tylko jeśli zmienna leży w zakresie 1-100).

10. Etapy spowalniające

Jeśli widzisz, że któryś etap mocno spowalnia działanie całego skryptu – pomyśl co możesz z tym zrobić. Czasami droga naokoło zajmuje więcej kroków, ale jest znacznie szybsza. Warto też pomyśleć o zmniejszeniu danych wejściowych przed obróbką przez choćby odsianie ich poleceniem grep.

11. Testuj w bezpiecznym środowisku

Jeśli chcesz testować skrypt – spokojnie możesz wykorzystać konto utworzone specjalnie do tego celu. Jeśli przez błąd skryptu stracisz wszystkie dane (w zasadzie raczej się to nie zdarzy, ale lepiej zapobiegać niż leczyć) do których masz prawa zapisu – może ogarnąć cię złość (gdy zrobisz to na domyślnym koncie) lub rozbawienie (gdy wykonasz to na pustym koncie).

12. Uzyskuj zgodę właściciela maszyny

Jeśli masz skrypt, który wykonuje się codziennie, to warto zapytać o zgodę właściciela maszyny. Może podpowie o jakiej godzinie tego nie robić. Niektóre skrypty potrafią zamulić komputer (u mnie w systemie są takie dwa). Jeśli dwa takie spotkają się o jednej porze dnia, to mogą narobić niezłego bigosu.

przez -
3 4612
Konsola

Pracując z powłoką Basha, bardzo często korzystamy z polecenia history, aby przejrzeć ostatnie polecenia jakie były wykonywane na maszynie. Przydaje się to nam do przypomnienia sobie poleceń, pozwala sprawdzić jakie programy były uruchamiane w ostatnim czasie. Jeżeli na danym koncie pracuje kilu użytkowników, możemy zobaczyć jakie wydawali oni polecenia. Domyślne ustawienia historii Basha możemy łatwo zmienić. Dzięki temu wzbogacimy naszą historię o wiele użytecznych informacji.

Zmiana rozmiaru Bash History

Za wielkość pliku historii odpowiedzialna jest zmienna HISTFILESIZE. Domyślnie zmienna ta, przechowuje wartość 500. Polecenie history zatem 500 ostatnich poleceń wydanych w powłoce.

  490  fuser -a szafir.php
  491  fuser -a /home/kamil/
  492  vim szafir.php
  493  cat .htpasswd
  494  service httpd restart
  495  vim index.php
  496  vim .htpasswd
  497  vim .htpasswd
  498  vim wsinf.php
  499  echo $HISTFILESIZE
  500  history

Dodając do pliku ~/.bashrc, polecenie export HISTFILESIZE=2000, zwiększymy ilość linii do 2000.

Zmiana formatu pliku historii

Domyślny format historii pokazuje numer polecenia oraz polecenie. Niestety taki format nie informuje nas o dacie wykonania polecenia. Możemy to zmienić za pomocą zmiennej HISTTIMEFORMAT. Przechowuje ona format historii basha.

Możemy ustawić zmienną w taki sposób, aby przed każdym poleceniem zapisywała datę i czas wykonania polecenia: HISTTIMEFORMAT="[%d/%m/%y %T] ". Wtedy historia będzie wyglądała następująco:

  299  [15/01/11 13:41:21] wget http://ftp.cc.uoc.gr/mirrors/linux/moonos/moonos-2-kachana-desktop-i386.iso
  300  [15/01/11 13:41:21] uptime
  301  [15/01/11 13:41:21] w
  302  [15/01/11 13:41:21] date
  303  [15/01/11 13:41:21] cd svn/
  304  [15/01/11 13:41:21] ls
  305  [15/01/11 13:41:21] cd www/
  306  [15/01/11 13:41:21] svn update
  307  [15/01/11 13:41:21] cat /etc/hosts

Szybkie uruchamianie poprzednich poleceń

Bash udostępnia nam kilka skrótów, dzięki którym możemy wykonań ponownie polecenie jakie właśnie się zakończyło. Istnieje kilka metod na wykonanie tej czynności:

  1. Wciskając strzałkę do góry pojawi się nam poprzednie polecenie
  2. !! – uruchomione zostanie poprzednio wydane polecenie
  3. !-1 – uruchomione zostanie poprzednio wydane polecenie
  4. [Ctrl] + P – wyświetli się poprzednio wydane polecenie

Możemy również w prosty sposób odwołać się do polecenia o konkretnym numerze w historii za pomocą znaku ! poprzedzającego numer polecenia.

  518  [15/01/11 14:24:00] pwd
  519  [15/01/11 14:24:05] ping wp.pl
  520  [15/01/11 14:24:08] history
kamil@muszelka:~$ !518
pwd
/home/kamil

Znak ten pozwoli nam również na przywołanie z historii polecenia, które zaczyna się na konkretne słowo. Jeżeli wcześniej wykonaliśmy np. polecenie ps -efww | grep mysql, możemy je przywołać poleceniem !ps.

Kontrolowanie historii

Do kontrolowania wpisów w historii służy zmienna HISTCONTROL. Pozwala ona na eliminowanie duplikatów poleceń w historii. Wystarczy ustawić: export HISTCONTROL=ignoredups.

Aby usunąć duplikaty z historii należy wydać polecenie export HISTCONTROL=erasedups. Jeżeli z jakiegoś powodu nie chcemy aby dane polecenie zapisało się w historii możemy ustawić zmienną jako: export HISTCONTROL=ignorespace. Poprzedzając wtedy polecenie spacją, nie zostanie ono zapisane w historii.

Aby wyczyścić całkowicie historię należy wydać polecenie history -c. Aby specyficzne polecenia nie były zapisywane w historii możemy ustawić zmienną: export HISTIGNORE="pwd:ls:ls -ltr:". W parametrze podajemy polecenia jakie będą ignorowane.

PROMPT_COMMAND

Bash udostępnia nam jeszcze jedną bardzo ciekawą zmienną środowiskową. Jest nią PROMPT_COMMAND. Zawartość tej zmiennej jest wykonywana jako zwykłe polecenie Basha, przed wyświetleniem prompta.

Bash provides an environment variable called PROMPT_COMMAND. The contents of this variable are executed as a regular Bash command just before Bash displays a prompt. Dzięki temu możemy wykonywać różne polecenia automatycznie, podczas pracy w konsoli. Pozwoli to na wyświetlenie np. aktualnej godziny przez promptem PS1.

kamil@muszelka:~$ export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[18:01:29]kamil@muszelka:~$ uptime
 18:32:00 up 37 days, 17:27, 10 users,  load average: 0.55, 0.52, 0.47
[18:01:29]kamil@muszelka:~$

Inny przykład wykorzystania zmiennej. Pokazuje i koloruje aktualną ścieżkę w jakiej się znajdujemy.

export PROMPT_COMMAND='if (($? > 0)); then echo -ne "\033[1;31m"; fi'; export PS1='[\[\]\u\[\033[0m\] \[\033[1;34m\]\w\[\033[0m\]]\$ '

Aby wyłączyć tę właściwość wystarczy wpisać unset PROMPT_COMMAND.

przez -
11 2501
Prasa

Po zeskanowaniu książki posiadamy masę plików, którą ciężko się przegląda. Korzystając z Basha oraz pakietu ImageMagick możemy w prosty sposób wygenerować książkę w formacie PDF. ImageMagick można korzystać z wiersza poleceń dlatego bardzo chętnie jest on wykorzystywany w językach skryptowych. Poprzez specjalne API dostępny jest również dla takich języków jak Perl, C, C++, Python oraz PHP.

Po zeskanowaniu kartek książki, warto będzie pliki wynikowe przekonwertować na format GIF. Format ten lepiej nadaje się do przechowywania tekstu oraz czarno-białej grafiki. Pliki ponad to będą posiadały mniejszy format.

Korzystając ze wcześniej poznanego polecenia convert, zmienimy pliki na bardziej przyjazne.

for plik in *.jpg
do
	convert $plik -colors 2 -normalize -monochrome $plik.gif
done

A na samym końcu wystarczy wydać polecenie convert *.gif ksiazka.pdf. Operacja w drugą stronę, czyli uzyskanie plików graficznych z pliku PDF jest również prosta. Posłuży nam do tego prosty skrypt:

for plik in *.pdf;
do
	convert -quality 100 $plik `echo $plik | sed -e 's/\.pdf/-%d\.jpg/g'`
done

W wyniku otrzymamy ponumerowane pliki JPG. Zawierać one będą w nazwie pliku numer strony.

przez -
0 751
Konsola

Wydana została wersja 4.0 powłoki Bash. Jest ona kompatybilna wstecz i zawiera nowe ciekawe funkcje. Pojawiły się tablice asocjacyjne, poprawiono dopełnianie komend oraz nazw plików. Polepszono zgodność z POSIX. Pojawiło się wyrażenie **, które dopasowuje katalogi rekurencyjnie.

Sprzęt

Pracując z terminalem, czasem potrzebujemy odczytać informacje o sprzęcie z jakiego składa się maszyna na jakiej pracujemy. Na szczęście te informacje w Linuksie udostępnione są w bardzo prosty sposób dzięki procfs (od ang. process file system, system plików procesów). Jest to pseudo-system plików lub po prostu wirtualny system plików. Pozwala ona na komunikację użytkownika z jądrem Linuksa poprzez interfejs VFS.

Ten wirtualny system plików domyślnie jest montowany podczas uruchamiania systemu. Jeśli nie został on zamontowany, możemy wykonać to ręcznie wydając polecenie:

mount -t proc proc /proc

Z punktu widzenia użytkownika mamy dostęp do ciekawych plików w katalogu /proc. Katalogi oraz pliki w /proc nie są powiązane z żadnym nośnikiem danych i występują tylko w pamięci operacyjnej. Zawartość plików oraz katalogów jakie się tam znajdują, jest generowana na bieżąco przez specjalne struktury danych jądra systemu. Reprezentują one stan systemu w danej chwili.

Dane te najczęściej są widoczne w postaci plików tekstowych. Dzięki temu możemy odczytać informacje na temat działających procesów:

[zenfir@dune ~]$ cat /proc/5388/status
Name:   java
State:  S (sleeping)
SleepAVG:       88%
Tgid:   5388
Pid:    5388
PPid:   5379
TracerPid:      0
Uid:    7003    7003    7003    7003
Gid:    7000    7000    7000    7000
FDSize: 256
Groups: 300 7000
VmSize:  1947856 kB
VmLck:         0 kB
VmRSS:   1365816 kB
VmData:  1863560 kB
VmStk:        40 kB
VmExe:        42 kB
VmLib:   1815482 kB
StaBrk: 08055000 kB
Brk:    0a28f000 kB
StaStk: bffff640 kB
ExecLim:        ffffffff
Threads:        500
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000081001
SigCgt: 1000000180004cce
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000

W innych plikach znajdziemy następujące informacje:

  • /proc/pid/cmdline – zawiera polecenie jakie zostało wydane do uruchomienia procesu. Znajduje się tu także lista parametrów dodana do polecenia.
  • /proc/pid/cwd – jest to dowiązanie symboliczne, które kieruje do katalogu roboczego procesu.
  • /proc/pid/environ – zawiera listę zmiennych środowiskowych z jakich korzysta proces.
  • /proc/pid/exe – jest to dowiązanie symboliczne do programu, który stworzył ten proces.
  • /proc/pid/fd/ – w tym katalogu znajdują się dowiązania do plików, które otworzył proces.
  • /proc/pid/mem – zawiera pamięć zaalokowaną przez proces.
  • /proc/pid/stat – informacje na temat statusu procesu.
  • /proc/pid/statm – informacje na temat statusu użycia pamięci przez proces.

Wystarczy odczytać odpowiedni plik z podkatalogu o nazwie reprezentowanej przez numer identyfikacyjny procesu (PID). Do niektórych plików również można zapisywać dane. W ten sposób przekazujemy komendy bezpośrednio do działającego jądra.

Informacje o systemie

Jądro systemu, od momentu startu, prowadzi różnego rodzaju statystyki, które zapisuje do pliku: /proc/stat. Możemy dzięki niemu dowiedzieć się ile aktualnie przetwarzanych jest procesów, oraz jaka ich liczba została stworzona od czasu startu systemu. Przykładowa zawartość pliku:

cpu  2166624532 3768773 269277449 7976513937 467370938 2624892 0
cpu0 736783532 484162 112879704 1825044715 43307026 2253920 0
cpu1 404062846 811281 53602688 2209090371 53156469 29343 0
cpu2 452806084 1394625 51279276 2028816516 187874859 165868 0
cpu3 572972069 1078703 51515781 1913562333 183032583 175759 0
intr 14396813661 1705418717 0 0 0 2 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2962956409 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1065644447 0 0 0 0 0 0 0 1757 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 72857706 0 0 0 0 0
ctxt 333782462608
btime 1203692335
processes 24751955
procs_running 3
procs_blocked 0

Informacje na temat Swapu znajdują się w:

[paszczak000@muszelka ~]$ cat /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/sda5                               partition       2008084 228     -1
/dev/sda6                               partition       2008084 0       -2

Informacje o sprzęcie

Znając już katalog /proc, możemy pokusić się o poszukanie informacji na temat sprzętu jaki znajduje się na maszynie. W prosty i szybki sposób możemy dostać się do informacji na procesora czy pamięci.

Procesor
Odczytując dane z pliku /proc/cpuinfo, możemy dowiedzieć się wielu informacji na temat procesora(ów) zainstalowanych w maszynie.

[paszczak000@muszelka ~]$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 6
model           : 10
model name      : AMD Athlon(tm) XP 2600+
stepping        : 0
cpu MHz         : 2079.845
cache size      : 256 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse pni syscall mmxext 3dnowext 3dnow
bogomips        : 4120.57

Korzystając z poleceń Basha możemy wyciągnąć interesujące nas parametry np:

Prędkość procesora

cat /proc/cpuinfo | grep 'cpu MHz' | sed -e 's/.*: //'

Model

cat /proc/cpuinfo | grep 'model name' | sed -e 's/.*: //'

Pamięć
Odczytując dane z pliku /proc/meminfo, możemy dowiedzieć się wielu informacji na temat pamięci zainstalowanej w maszynie.

[paszczak000@muszelka ~]$ cat /proc/meminfo
MemTotal:       515528 kB
MemFree:          8564 kB
Buffers:         11396 kB
Cached:         266144 kB
SwapCached:          0 kB
Active:         305280 kB
Inactive:       164832 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515528 kB
LowFree:          8564 kB
SwapTotal:     1124508 kB
SwapFree:      1121780 kB
Dirty:             476 kB
Writeback:           0 kB
Mapped:         268384 kB
Slab:            23164 kB
CommitLimit:   1382272 kB
Committed_AS:   480904 kB
PageTables:       2956 kB
VmallocTotal:   511992 kB
VmallocUsed:     29864 kB
VmallocChunk:   477684 kB

Jeśli interesują nas dane na temat wolnej pamięci możemy wydać polecenie:

cat /proc/meminfo | grep MemFree

Pamięci masowe
Aby odczytać informacje na temat urządzeń podłączonych do IDE, musimy przejrzeć pliki w podkatalogach katalogu /proc/ide/. Znajdziemy tam katalogi o nazwach hda, hdb, a w nich model, capacity, cache. Aby obejrzeć dane na temat dysku twardego możemy wydać polecenie:

cat /proc/ide/hda/model

Urządzenia typu SCSI oraz SATA mają identyfikatory sda, sdb i tak dalej. Aby obejrzeć listę podłączonych dysków do wykrytych kontrolerów można przejrzeć plik /proc/scsi/scsi. Znajdziemy tam podstawowe informacje na temat modeli dysków.

[paszczak000@muszelka ~]$ cat /proc/scsi/scsi
Attached devices:
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: ST360015A        Rev: 3.53
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi3 Channel: 00 Id: 00 Lun: 00
  Vendor: HL-DT-ST Model: DVDRAM GSA-4163B Rev: A100
  Type:   CD-ROM                           ANSI  SCSI revision: 05
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: ATA      Model: Maxtor 6Y120M0   Rev: YAR5
  Type:   Direct-Access                    ANSI  SCSI revision: 05
Host: scsi17 Channel: 00 Id: 00 Lun: 00
  Vendor: Seagate  Model: FreeAgent Go     Rev: 100F
  Type:   Direct-Access                    ANSI  SCSI revision: 02

Informacje na temat partycji znajdziemy w pliku:

[paszczak000@muszelka ~]$ cat /proc/partitions
major minor  #blocks  name

   8     0  143374000 sda
   8     1     200781 sda1
   8     2    1004062 sda2
   8     3   10008495 sda3
   8     4          1 sda4
   8     5    2008093 sda5
   8     6    2008093 sda6
   8     7    2008093 sda7
   8     8    2008093 sda8
   8     9    4008186 sda9
   8    10   15783831 sda10
   8    11  104334111 sda11
   8    16  143374000 sdb/

Natomiast zamontowane partycje można podejrzeć w /proc/mounts.

Więcej ciekawych informacji można wyciągnąć z manuala proc(5).

Linki

przez -
8 2940
Konsola program

Domyślnie polecenie cp, służące do kopiowania plików oraz katalogów nie posiada paska postępu swojej pracy. Od zawsze to była wielka wada polecenia. Ciężko było oszacować kiedy plik zostanie skopiowany, czy proces kopiowania nadal trwa. Na szczęście istnieją inne polecenia, które rozwiązały ten problem.

Zawsze można skorzystać z narzędzia pv, które służy do łączenia plików lub wejścia standardowego, do wyjścia standardowego z monitoringiem. Polecenie to posiada wiele ciekawych przełączników, które służą do wizualizacji postępu kopiowania. Najprościej jest wydać polecenie:

paszczak000@muszelka:~$ pv -p /media/tatsuke/debian.iso > /dev/null 
[==============================================================>                                                                                       ] 42%

Oczywiście istnieją też inne parametry dla polecenia np:

-t, --timer               show elapsed time
  -e, --eta                 show estimated time of arrival (completion)
  -r, --rate                show data transfer rate counter
  -b, --bytes               show number of bytes transferred

Dzięki nim można dodać dodatkowe informacje do paska postępu jak np. szybkość transferu pliku, czas pozostały do ukończenia operacji lub czas jaki upłynął od początku procesu kopiowania.

paszczak000@muszelka:~$ pv -p -r -t -e /media/tatsuke/debian.iso > /dev/null 
0:00:04 [22,1MB/s] [======================================>                                                                                ] 33% ETA 0:00:08

Kolejną próbą stworzenia jakiś informacji na temat postępu kopiowania było zaciągnięcie do pracy polecenia curl. Wystarczy napisać bardzo prosty skrypt, którego parametrami są plik wyjściowy oraz plik docelowy.

#!/bin/bash
curl "file://$1" -o "$2"[/bash]
Wynikiem działania polecenia jest tabelka z informacjami na temat procesu kopiowania.
paszczak000@muszelka:~$ ./curl.sh /media/tatsuke/debian.iso /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 31  367M   31  115M    0     0  21.6M      0  0:00:16  0:00:05  0:00:11 21.7M

Na szczęście za pomocą Basha można narysować pasek postępu kopiowania pliku. Pierwszą metodą jaką znalazłem było wykorzystanie narzędzia strace oraz Awk w skrypcie:

#!/bin/sh
cp_p()
{
   set -e
   strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
      | awk '{
	    count += $NF
            if (count % 10 == 0) {
               percent = count / total_size * 100
               printf "%3d%% [", percent
               for (i=0;i<=percent;i++)                   printf "="                printf ">"
               for (i=percent;i<100;i++)
                  printf " "
               printf "]\r"
            }
         }
         END { print "" }' total_size=$(stat -c '%s' "${1}") count=0
}

Skrypt potrafi kopiować tylko pojedyncze pliki. Czasami zatrzymuje się na 99% i nie działa poprawnie, dlatego należy go stosować z rozwagą. Wynikiem działania polecenia jest:

paszczak000@muszelka:~$ ./cp_p /mnt/raid/pub/iso/debian/debian-2.2r4potato-i386-netinst.iso /dev/null
 76% [===========================================>                    ]

Więcej tego typu szalonych pomysłów można znaleźć na stronie linuxquestions.org

.

Linki

Polecane

OSWorld

7 1312
Drodzy Czytelnicy, prowadzimy portal OSWorld.pl już ponad 10 lat. Z przykrością stwierdzamy, że mamy na niego coraz mniej czasu, dlatego chcielibyśmy przekazać prowadzenie serwisu osobie...