10 komend które mogą Ci się przydać

Jednolinijkowiec to czasami złe określenie na polecenia które wykonujemy w konsoli ;-) Na nasze szczęście czasy terminala 80x25 już dawno odeszły do lamusa i linia nie musi się kończyć na 80 znakach... ale nawet te bardzo krótkie komendy mogą znacznie ułatwić życie.

1. rm: cannot remove 'plik': Permission denied

Próbujesz usunąć plik, założyć katalog, lub wykonać coś co wymaga wyższych uprawnień... masz w systemie sudo? spróbuj więc tak:

$ touch plik
touch: cannot touch 'plik': Permission denied
$ sudo !!
sudo touch plik
$ ls
plik

$sudo !! - powtarza ostatnią komendę, poprzedzając ją wywołaniem sudo.

2. "test" E212: Nie mogę otworzyć pliku do zapisu

Wprowadzasz modyfikację w pliku konfiguracyjnym, używasz do tego Vim'a, próbujesz zapisać zmiany i okazuję się, że nie masz uprawnień... zostaje Ci zapisanie pliku w innym katalogu, przeskoczenie na użytkownika root i podmiana pliku, ale nie jest to wygodne rozwiązanie, spróbuj może tego:

:w !sudo tee %

tee czyta wszystko ze standardowego wejścia i przesyła kopię na standardowe wyjście/pliku, poprzedzając wszystko wywołaniem sudo i przepisując do tego samego pliku.

3. ctrl+r

Używasz bash'a? zdarza Ci się często wykonywać podobne komendy? zamiast history | grep polecenie, spróbuj użyć wyszukania wciskając ctrl+r, jak? wciśnij ctrl+r i zacznij wpisywać dowolną część komendy, jeśli została dopasowana to enterem możesz ją wywołać, jeśli to nie jest ta komenda to wciskając kolejny raz ctrl+r przechodzisz do następnej:

(reverse-i-search)`echo': echo $SRT|awk -F.txt '{print $1 }'

w tym przykładzie wcisnąłem ctrl+r i wpisałem jedynie "echo", bash znalazł mi to co chciałem, echo $SRT|awk -F.txt '{print $1 }'

4. ascii code

Potrzebujesz szybko sprawdzić jaki jest kod ascii literki? jeśli posiadasz przeglądarkę WWW i chce Ci się, to możesz zrobić to przez stronę http://www.asciitable.com, ale znacznie szybciej będzie wpisać w konsoli:

$ man 7 ascii

chyba, że nie masz zainstalowanych manuali... ;-)

5. Ile transferu miesięcznie wykorzystuję?

Zainstaluj vnstat, który będzie pilnował ile danych odebrał/wysłał serwer.

# apt-get install vnstat

od tego momentu będą zbierane statystyki, które możesz wyświetlić poleceniem vnstat:

# vnstat -m
eth0  /  monthly
month        rx      |     tx      |    total    |   avg. rate
Dec '10    837.85 GiB |   29.46 GiB |  867.31 GiB |    2.72 Mbit/s
Jan '11    499.82 GiB |   81.34 GiB |  581.16 GiB |    1.82 Mbit/s
Feb '11     68.59 GiB |  118.40 GiB |  187.00 GiB |  648.41 kbit/s
Mar '11     40.48 GiB |  214.07 GiB |  254.54 GiB |  797.22 kbit/s
Apr '11     65.07 GiB |  295.16 GiB |  360.23 GiB |    1.17 Mbit/s
May '11     89.22 GiB |  219.48 GiB |  308.70 GiB |  966.85 kbit/s
Jun '11     78.38 GiB |  269.21 GiB |  347.58 GiB |    1.70 Mbit/s
estimated    118.31 GiB |  406.40 GiB |  524.71 GiB |

6. mount na mount

Popełniłeś literówkę, błąd, lub zrobiłeś cokolwiek... okazało się, że zamountowałeś coś np. /dev/sdc1 w lokalizacji /var/log/, ale po miesiącu przypomniałeś sobie, że pod mountem są istotne pliki z logami... i chcesz się do nich dostać, ale bez robienia umount, możesz tu skorzystać z opcji mountowania bind.

# mount /dev/sdc1 /var/log
# ls -la /var/log/
total 116
drwxr-xr-x  22 root root  4096 2011-04-07 06:27 .
drwxr-xr-x  17 root root  4096 2011-06-02 10:54 ..
drwxr-xr-x   2 root root  4096 2011-06-02 22:02 nowe_logi
drwxr-xr-x   3 root root  4096 2011-06-02 10:59 apache
...

zamontowałem partycję /dev/sdc1 na katalog /var/log/, mam teraz tam katalogi nowe_log oraz apache, ale stare pliki zostały przykryte.

# mkdir /tmp/test
# mount -o bind / /tmp/test/
# ls /tmp/test/var/log/

alternatives.log       auth.log         debug           dpkg.log.2.gz   kern.log.3.gz  minidlna.log      squid                user.log.2.gz
...

wykonałem bind katalogu głównego / (zawierającego /var/log), do katalogu /tmp/test i takim szybkim sposobem uzyskałem dostęp do katalogów i plików które zostały przykryte mountem /dev/sdc1.

7. jak zapisać komunikację klient serwer WWW

Na to jest wiele sposobów, od tcpdump'a, ethereal'a, wireshark'a, po bardziej przyjazne np. tcpflow który zapisuje oddzielnie w plikach żądania w sposób bardzo czytelny:

# mkdir flow
# cd flow/

polecam utworzenie katalogu, tcpflow zapisuje wszystko w oddzielnych plikach ;-) tak łatwiej to później usunąć.

# tcpflow -i eth0 port 80
tcpflow[32028]: listening on eth0
^C

w katalogu pojawiły się nam pliki (każdy reprezentuje żądanie/odpowiedź).

# cat 0xx.0xx.xxx.0xx.57262-212.077.100.101.00080
GET / HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: www.wp.pl
User-Agent: lwp-request/5.834 libwww-perl/5.837

8. przycinamy pliki

Usługa wygenerowała nam pliki logów o masakrycznych rozmiarach, gigabajty, terabajty... ale nie chcemy jej restartować tylko dlatego, że zabieramy się za czyszczenie, co można zrobić? możemy skopiować plik obok, przyciąć go i spakować bez zabierania dostępu do deskryptora pliku, dzięki temu nasza aplikacja nie powinna wymagać restartu.

nasz plik:

-rw-r--r--  1 root   root   104857600 2011-06-20 21:17 test.log

# cp test.log test.log.old; cat /dev/null > test.log; gzip test.log.old

# ls -la
total 108
drwxr-xr-x  2 root   root     4096 2011-06-20 21:20 .
drwxr-xr-x 54 jamzed jamzed   4096 2011-06-20 21:11 ..
-rw-r--r--  1 root   root        0 2011-06-20 21:20 test.log
-rw-r--r--  1 root   root   101804 2011-06-20 21:20 test.log.old.gz

kopiujemy plik test.log obok pod nazwą test.log.old, cat /dev/null > do pliku powoduje jego wyzerowanie (nie usunięcie pliki, ale wyczyszczenie), gzip pakuje, dzięki temu możemy zaoszczędzić czasami duuuużo miejsca (świetne zastosowanie dla logów np. baz danych MySQL)

9. usuwanie/przesuwanie plików starszych niż ...

Usuwanie plików starszych niż 100 dni,

# find /var/log/ -iname '*.log' -mtime +100 -delete

gdybyśmy chcieli szukać plików nowszych niż 100 dni, należałoby wywołać find z parametrem -mtime -100.

Przesuwanie plików starszych niż 60 dni do innego katalogu:

# find /var/log/ -iname '*.log' -mtime +60 -exec mv '{}' /var/log/old/ ;

10. szybka kopia pliku

Czyli coś co powinieneś wykonywać przed każdą edycją pliku z konfiguracją ;-)

# cp config.cfg{,.bak}; ls config*
config.cfg  config.cfg.bak

nie musisz wpisywać cp config.cfg config.cfg.bak, wystarczy samo cp plik{,.bak}.

A jakie są wasze propozycje?