niedziela, 27 czerwca 2010

Postfix – Dovecot - Debian

1. Postfix
Postfix to szybki, łatwy w administracji (w porównaniu z innymi dostępnymi aplikacjami tego
typu) i bezpieczny zestaw oprogramowania umożliwiającego stworzenie serwera pocztowego.
Zbudowany jest on z wielu mniejszych programów współpracujących ze sobą. Pierwsza zaleta (patrząc
od strony bezpieczeństwa) jest fakt, i kolejki FIFO wykorzystywane do komunikacji pomiędzy owymi
programami znajdują się w chronionych katalogach.
1.1 Instalacja
Instalacja pakietów podstawowych, niezbędnych do uruchomienia serwera Postfix:
# aptitude install postfix postfix-doc openssl
• postfix – agent poczty,
• postfix-doc – dokumentacja dla postfix’a,
• openssl - biblioteka funkcji kryptograficznych i obsługi certyfikatów.
Gdy konfigurator przejdzie do postfixa "Klikamy OK", Następnie wybieramy „No configuration” i OK.
1.2 Wstępna konfiguracja
Tworzymy lub edytujemy plik konfiguracyjny postfixa:
# nano /etc/postfix/main.cf
Wklejamy i edytujemy zawartość poniższego konfiga
command_directory = /usr/sbin
mail_owner = postfix
mydomain = test.com
myhostname = debian
myorigin = /etc/mailname
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $mydomain, $myhostname, localhost, localhost.localdomain,
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = ipv4
home_mailbox = Maildir/
mail_spool_directory = /home/
smtpd_banner = ESMTP on $myhostname !
mailbox_size_limit = 0
recipient_delimiter = +
biff = no
append_dot_mydomain = no
relayhost =
A teraz wyjaśnienie opcji:
command_directory
katalog lokalizujący demona
użytkownik pod którym Postfix wykonuje
mail_owner
większość operacji
mydomain
nazwa domeny
myhostname
nazwa hosta (tak przedstawia się serwer EHLO)
co będzie dodawane po @, gdy brak domeny w
adresie z pola from
myorigin
myorigin = $myhostname ("user@$myhostname")
myorigin = $mydomain ("user@$mydomain")
alias_maps
stosowane bazy aliasów
alias_database
jakie domeny docelowe (poza wirtualnymi) maja
być akceptowane
mydestination
myorigin = $myhostname ("user@$myhostname")
myorigin = $mydomain ("user@$mydomain")
określenie komputerów, których pocztę będziemy
przekazywać
mynetworks_style = subnet (z klientów SMTP z
naszej podsieci)
mynetworks
mynetworks_style = host (tylko z maszyny
mynetworks_style
lokalnej)
mynetworks = 127.0.0.0/8 (tylko lokalna
maszyna)
mynetworks = 127.0.0.0/8 168.100.189.2/32
adres interfejsu, na którym będzie nasłuchiwał
postfix
inet_interfaces inet_interfaces = $myhostname, localhost (nasz
host oraz localhost)
inet_interfaces = all (wszystkie interfejsy)
inet_protocols
wersja protokołu
home_mailbox
typ skrzynek
mail_spool_directory
katalog z poczta dla skrzynek mailbox
smtpd_banner
sposób przedstawiania się przez serwer
maksymalny rozmiar skrzynki pocztowej (0 . brak
mailbox_size_limit
limitu)
recipient_delimiter
niezbędne do monitorowania domen wirtualnych
relayhost = …
Maksymalna wielkość wysyłanej wiadomości
message_size_limit message_size_limit = 10240000 (10MB)
Parametry odpowiedzialne za dostarczenie maila
jeżeli serwer jest wyłączony
queue_run_delay (queue_run_delay = 30m
maximal_queue_liftime maximal_queue_liftime = 3d
sprawdzaj zdalny Server co pół godziny i zwracaj
błąd do nadawcy po trzech dniach)
unknown_local_recipient_reject_code Numer kodu, który będzie zwracany, gdy w
systemie nie ma odbiorcy
unknown_local_recipient_reject_code = 550
local_destination_concurrency_limit Ustawia limit ilości wiadomości, które mogą być
dostarczone do użytkownika w tym samym czasie
default_destination_concurrency_limit Ustawia limit ilości użytkowników, których
Postfix może obsłużyć równocześnie w tym
samym czasie
Sprawdzamy składnie plików konfiguracyjnych:
# postfix check
Tworzymy bazę aliasów:
# newaliases
Restartujemy demona:
# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
1.3 Test
W tym momencie możemy już sprawdzić, czy nasz deamon SMTP działa. Dokonujemy tego z
wykorzystaniem komendy telnet:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ESMTP on debian !
EHLO test.com
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
Powinniśmy zobaczyć komunikat mniej więcej jak powyżej.
2. Serwer POP3 i IMAP
Postfix jest agentem MTA służącym do nasłuchiwania na porcie 25 i ewentualnie przekazywania
odebranej poczty dalej. Aby mieć równie możliwość odbierania poczty, dokonamy instalacji serwera
POP3 i IMAP. Wykorzystamy do tego zestaw pakietów decovet.
2.1 Instalacja
# aptitude install dovecot-imapd dovecot-pop3d dovecot-common
• dovecot-common – dokumentacja dla serwerów POP i IMAP
• dovecot-imapd - serwer IMAP wspierający mbox i maildir poczty
• dovecot-pop3d - serwer POP3 wspierający mbox i maildir poczty
Ustawmy prawa dla katalogów:
# chmod 755 /var/run/dovecot
# chgrp dovecot /var/run/dovecot/login/
Tworzymy katalog w którym będziemy przechowywać nasz certyfikat
# mkdir -p /etc/postfix/ssl
Przechodzimy do katalogu
# cd /etc/postfix/ssl
Tworzymy certyfikat i podajemy potrzebne dane
# openssl req -new -x509 -nodes -out mail.pem -keyout mail.pem -days 365
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:POLAND
Locality Name (eg, city) []:Warszawa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Moj certifikat
Organizational Unit Name (eg, section) []:POCZTA
Common Name (eg, YOUR name) []:test.com
Email Address []:root@test.com
UWAGA!!! Ważne żeby w polu Common Name podać własną domenę
2.2 Konfiguracja
Na początku zrobimy kopie pliku konfiguracyjnego dovecota
# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.old
Edytujemy plik:
# nano /etc/dovecot/dovecot.conf
I wklejamy poniższy konfig
base_dir = /var/run/dovecot/
protocols = imap imaps pop3 pop3s
listen = *
disable_plaintext_auth = no
shutdown_clients = yes
#logi
log_path=/var/log/dovecot.log
info_log_path = /var/log/mail.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
syslog_facility = mail
login_process_size = 64
login_greeting = Welcome. I’m ready ...
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
login_chroot = no
login_user = dovecot
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 128
mail_location = maildir:~/Maildir
#SSL
ssl_disable = no
ssl_cert_file = /etc/postfix/ssl/mail.pem
ssl_key_file = /etc/postfix/ssl/mail.pem
verbose_ssl = yes
mail_access_groups = postfix
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
postmaster_address = postmaster@test.com
}
auth_verbose = yes
auth_debug = yes
auth default {
mechanisms = plain login
passdb pam {
}
userdb passwd {
}
user = root
}
dict {
}
plugin {
}
Startujemy daemona
# /etc/init.d/dovecot start
Wszystko powinno być OK, ale jeżeli dovecot nie chce wystartować należy sprawdzić logi.
2.3 Test
Musimy najpierw dodać do systemy dwóch testowych userów np. nadawca i odbiorca i nadajmy im
hasła haslo dla obu takie samo.
# useradd -m nadawca
# passwd nadawca
Enter new UNIX password:
. . .
# useradd -m odbiorca
# passwd odbiorca
Enter new UNIX password:
Testowanie serwera SMTP:
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ESMTP on debian !
EHLO test.com
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: nadawca@test.com
250 2.1.0 Ok
rcpt to: odbiorca@test.com
250 2.1.5 Ok
data
354 End data with .
Subject: mail testowy
to jest testowy mail
zaraz zobaczymy czy dojdzie:)
.
250 2.0.0 Ok: queued as A912CBACD
quit
221 2.0.0 Bye
Connection closed by foreign host.
Po wysłaniu maila powinien się automatycznie utworzyć katalog Maildir w katalogu domowym usera
# ls -l /home/odbiorca
razem 4
drwx------ 5 odbiorca odbiorca 4096 2007-11-03 15:59 Maildir
Testowanie serwera POP3 – nieszyfrowanego:
# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Welcome. I’m ready …
user odbiorca
+OK
pass haslo
+OK Logged in.
stat
+OK 1 485
list
+OK 1 messages:
1 485
.
retr 1
+OK 485 octets
Return-Path:
X-Original-To: odbiorca@test.com
Delivered-To: odbiorca@test.com
Received: from test.com (localhost [127.0.0.1])
by debian (Postfix) with ESMTP id A912CBACD
for ; Sat, 3 Nov 2007 15:54:52 +0100 (CET)
Subject: mail testowy
Message-Id: <20071103145513.a912cbacd@debian>
Date: Sat, 3 Nov 2007 15:54:52 +0100 (CET)
From: nadawca@test.com
To: undisclosed-recipients:;
to jest testowy mail
zaraz zobaczymy czy dojdzie:)
.
quit
+OK Logging out.
Connection closed by foreign host.
Testowanie serwera POP3 – szyfrowanego:
# openssl s_client -connect localhost:995

+OK Welcome. I’m ready …
user odbiorca
+OK
pass haslo
+OK Logged in.
stat
+OK 1 485
retr 1
+OK 485 octets
Return-Path:
X-Original-To: odbiorca@test.com
Delivered-To: odbiorca@test.com
Received: from test.com (localhost [127.0.0.1])
by debian (Postfix) with ESMTP id A912CBACD
for ; Sat, 3 Nov 2007 15:54:52 +0100 (CET)
Subject: mail testowy
Message-Id: <20071103145513.a912cbacd@debian>
Date: Sat, 3 Nov 2007 15:54:52 +0100 (CET)
From: nadawca@test.com
To: undisclosed-recipients:;
to jest testowy mail
zaraz zobaczymy czy dojdzie:)
.
quit
+OK Logging out.
read:errno=0
3. Autoryzacja SMTP
Kolejnym etapem naszych prac, będzie instalacja autoryzacji poczty wychodzącej SMTP, co
zapewni nam nieautoryzowane wykorzystywanie naszego konta pocztowego. Wykorzystamy do tego
już zainstalowany Dovecot.
3.1 Autoryzacja – Dovecot SASL
3.1.1 Konfiguracja
Aby włączyć w Dovecot SASL musi dodać odpowiednie wpisy do pliku konfiguracyjnego
# nano /etc/dovecot/dovecot.conf
Dodajemy tylko wartości pogrubione reszta już istnieje w pliku
auth default {
mechanisms = plain login
passdb pam {
}
userdb passwd {
}
user = root
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
Aby autoryzacja doszła do skutku należy poinformować o tym Postfiksa, że użytkowników ma
autoryzować przez "Dovecot SASL". Dlatego też edytujemy plik:
# nano /etc/postfix/main.cf
I dodajemy poniższe wartości
#AUTH SMTP
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = $myhostname
I wyjaśnienie użytych opcji:
• smtpd_sasl_type - określamy z jakiej autoryzacji będziemy korzystać.
• smtpd_sasl_path - nazwa pliku konfiguracyjnego dla autoryzacji.
• smtpd_sasl_auth_enable - uaktywniamy autoryzację SASL
• smtpd_sasl2_auth_enable - uaktywniamy autoryzację SASL2
• smtpd_sasl_security_options - metody autoryzacji, które nie będą obsługiwane
• broken_sasl_auth_clients - zgodność ze starszymi klientami pocztowymi np. OutlookExpress4
• smtpd_sasl_local_domain - Ustawienie autoryzacji jest wymagana przy wysyłaniu listów z
określonych tutaj domen. Jeśli zostawisz ten parametr pusty będzie to oznaczało, że autoryzacja
jest wymagana przy wszystkich domenach na Twoim serwerze
Wprowadźmy jeszcze kilka zabezpieczeń przez spamem na poziomie postfixa
# nano /etc/postfix/main.cf
I dodajemy poniższe wartości
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient
smtpd_client_restrictions =
permit_sasl_authenticated,
#reject_unknown_client,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client list.dsbl.org,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client cbl.abuseat.org
smtpd_sender_restrictions =
permit_sasl_authenticated,
reject_unknown_sender_domain,
reject_non_fqdn_sender,
reject_unknown_address
smtp_recipient_restrictions - sprawdzanie poczty na podstawie adresu nadawcy listu (RCPT TO)
• permit_mynetworks - pozwala na połączenie się z naszym serwerem komputerom, z naszej
sieci lokalnej (dokładnie: komputerom, które zostały ujęte w zmiennej $mynetworks)
• permit_sasl_authenticated - pozwala na połączenia z autoryzacja.
• reject_unauth_destination - odrzuć list, jeśli to nasz serwer nie jest jego przeznaczeniem.
Odrzuca list, nie sprawdza innych ograniczeń.
• reject_unknown_recipient_domain - odrzuć, jeśli adres docelowy listu, jego adres nie istnieje
w DNS (czyli i tak nie ma dokąd go wysłać)
• reject_non_fqdn_recipient - odrzuć list, jeśli podany adres odbiorcy nie jest "pełny" (fully-
qualified domain form)
smtpd_client_restrictions - Restrykcje - Sprawdzenie IP komputera, z którego wysyłana jest
wiadomość
• permit_mynetworks - pozwala na połączenie się z naszym serwerem komputerom, z naszej
sieci lokalnej (dokładnie: komputerom, które zostały ujęte w zmiennej $mynetworks)
• reject_unknown_client - odrzuca komputer, którego adresu IP nie ma w DNS
• reject_rbl_client – RLB bazay adresów spamerów
smtpd_sender_restrictions - Restrykcje - Sprawdzanie poczty na podstawie adresu odbiorcy listu
(MAIL FROM)nadawcy listu (RCPT TO)
• permit_sasl_authenticated - pozwala na połączenia z autoryzacja.
• reject_unknown_sender_domain - odrzuca list, jeśli adres nadawcy, dokładnie część po @
adresu nadawcy, nie ma wpisu w DNS.
• reject_non_fqdn_sender - odrzuć list, jeśli podany adres odbiorcy nie jest "pełny" (fully-
qualified domain form)
Dokładniejszy opis wszystkich opcji na stronie: http://lemat.priv.pl/index.php?m=page&pg_id=90
Restartujemy dovecota i postfixa
# /etc/init.d/dovecot restart
# /etc/init.d/postfix restart
3.1.2 Test autoryzacji
Sprawdzamy czy działa
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ESMTP on debian !
EHLO test.com
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
Jeżeli są te dwie linijki które są podkreślone to znaczy że wszystko działa.
3.2 Szyfrowanie TLS
3.2.1 Instalacja
Znów edytujemy
# nano /etc/postfix/main.cf
I dodajemy poniższe wartości do pliku:
#TLS
smtpd_tls_auth_only = yes
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/mail.pem
smtpd_tls_cert_file = /etc/postfix/ssl/mail.pem
smtpd_tls_CAfile = /etc/postfix/ssl/mail.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
tls_random_source = dev:/dev/urandom
I wyjaśnienie użytych opcji:
• smtpd_tls_auth_only - autoryzacja odbywa się jedynie poprzez szyfrowanie
• smtp_use_tls - arametry uaktywniające używanie TLS dla SMTP
• smtpd_use_tls - parametry uaktywniające używanie TLS dla SMTPD
• broken_sasl_auth_clients - połączenia (poprzez tunele TLS)
• smtpd_tls_key_file - ścieżka do pliku zawierający wygenerowany klucz dla SMTP
• smtpd_tls_cert_file - ścieżka do pliku zawierający wygenerowany certyfikat dla SMTP
• smtpd_tls_CAfile - ścieżka do pliku zawierający wygenerowany certyfikat dla SMTP
• smtpd_tls_loglevel - informacja diagnostyczna
• smtpd_tls_received_header - Sprawdzenie, czy informacje dotyczące protokołu oraz szyfru
zawarte są w nagłówku wiadomości
• smtpd_tls_session_cache_timeout - zas wygasania sesji TLS
• tls_random_source - źródło losowości
Gdy juz wszystko mamy:
# /etc/init.d/postfix restart
3.3.2 Test TLS
Sprawdzamy czy działa
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ESMTP on debian !
EHLO test.com
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
Zauważ, że poniższe dwie linijki, które były aktywne w czasie gdy konfigurowaliśmy SMTP AUTH,
mowę tu o:
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
zastąpiła jedna:
250-STARTTLS
Jeśli ukazał Ci się taki komunikat, wszystko działa OK. Jeżeli jednak chcesz zobaczyć te dwie
dodatkowe linie zmień: w pliku main.cf warość: smtpd_tls_auth_only = yes na na no
4. Zarządzanie postfix’em
4.1 Squirrelmail’a czyli poczta przez WWW
Na koniec przydało by się zrobić użytkownika poczty dostęp przez WWW, a do tego najlepiej nadaje się
squirrelmail, więc zainstalujmy go.
# aptitude install squirrelmail squirrelmail-locales
• squirrelmail – umożliwia dostęp do poczty przez www,
• squirrelmail-locales – paczka językowa do squirrelmail’a,
Po zainstalowaniu robimy symboliczne dowiązanie pliku apacze.conf
# ln -s /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail
I edytujemy plik:
# nano /etc/squirrelmail/apache.conf
Na samym początku tego pliku znajdujemy ta wartość:
Alias /squirrelmail /usr/share/squirrelmail
I zmieniamy jak poniżej
Alias /poczta /usr/share/squirrelmail
Zróbmy jeszcze dowiązanie do plików squirrelmail w katalogu WWW, żeby łatwiej było znaleźć:
# ln -s /usr/share/squirrelmail /var/www/poczta
Teraz reset apache:
# /etc/init.d/apache2 restart
I sprawdzamy czy wszystko działa wpisując poniższy adres w przegladarce (działa tylko na
localhoscie):
http://localhost/poczta/src/configtest.php
Powinieneś zobaczyć kilka komunikatów takich jak:
Checking PHP configuration...
PHP version 5.2.0-8+etch7 OK.
PHP extensions OK.
Checking paths...
Data dir OK.
Attachment dir OK.
Plugins are not enabled in config.
Themes OK.
Default language OK.
Base URL detected as: http://localhost/poczta/src (location base autodetected)
Checking outgoing mail service....
SMTP server OK (220 ESMTP on debian !)
Checking IMAP service....
IMAP server ready (* OK Welcome. I.m ready ...)
Capabilities: * CAPABILITY IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND
UNSELECT LITERAL+ IDLE CHILDREN NAMESPACE LOGIN-REFERRALS STARTTLS AUTH=PLAIN
AUTH=LOGIN
Checking internationalization (i18n) settings...
gettext - Gettext functions are available. You must have appropriate system
locales compiled.
mbstring - Mbstring functions are available.
recode - Recode functions are unavailable.
iconv - Iconv functions are available.
timezone - Webmail users can change their time zone settings.
Checking database functions...
not using database functionality.
Congratulations, your SquirrelMail setup looks fine to me!
Ustawmy jeszcze w squirrelmaila nasz predefiniowany serwer IMAP czyli devecot, w tym celu wykonaj
polecenie:
# /usr/sbin/squirrelmail-configure
Po uruchomieniu tego skryptu zobaczysz takie “okno” jak poniżej
SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1. Organization Preferences
2. Server Settings
3. Folder Defaults
4. General Options
5. Themes
6. Address Books
7. Message of the Day (MOTD)
8. Plugins
9. Database
10. Languages
D. Set pre-defined settings for specific IMAP servers
C Turn color on
S Save data
Q Quit
Command >>
Wpisujemy D i wciskamy Enter
SquirrelMail Configuration : Read: config.php
---------------------------------------------------------
While we have been building SquirrelMail, we have discovered some
preferences that work better with some servers that don't work so
well with others. If you select your IMAP server, this option will
set some pre-defined settings for that server.
Please note that you will still need to go through and make sure
everything is correct. This does not change everything. There are
only a few settings that this will change.
Please select your IMAP server:
bincimap = Binc IMAP server
courier = Courier IMAP server
cyrus = Cyrus IMAP server
dovecot = Dovecot Secure IMAP server
exchange = Microsoft Exchange IMAP server
hmailserver = hMailServer
macosx = Mac OS X Mailserver
mercury32 = Mercury/32
uw = University of Washington's IMAP server
quit = Do not change anything
Command >> dovecot
Teraz tylko wpisujemy z jakiego serwera IMAP korzystamy i Enter, w następnym okienku zostaw
wszystko domyślnie. Zapisz ustawienia i wyjdź z konfiguratora.
5. Monitoring
5.1 Mailgraph czyli wykresy
Mailgraph tworzy dzienne, tygodniowe, miesięczne i roczne wykresy z wysłanych odebranych,
bounced i odrzuconych wiadomości także spamu i wirusów jeżeli SpamAssassin i ClamAV jest
zintegrowany z Postfixem.
# aptitude install rrdtool mailgraph
• rrdtool - Time-series data storage and display system (programs),
• mailgraph - Mail statistics RRDtool frontend for Postfix
Podczas instalacji będziesz pytany o kilka rzecz zaznacz jak poniżej: (Jeżeli masz
zintegrowanego z Postfix’em amavis’a do filtrowania spamu i wirusów wtedy w opcji Count incoming
mail as outgoing mail? zaznacz No żeby uniknąć podwójnego liczenia maili (ponieważ Postfixa
dostarcza maile do amavis’a który po dokonaniu skanowania odsyła je z powrotem do Postfix’a). Jeżeli
nie używasz żadnego skanera wtedy możesz zaznaczyć Yes)
Jeżeli instalator nie zapytał cię o te opcje podaj wydaj polecenie dpkg-reconfigure mailgraph
Should Mailgraph start on boot? <-- Yes Which logfile should be used by mailgraph? <-- /var/log/mail.log Count incoming mail as outgoing mail? <-- Yes Utwórz katalog # mkdir –p /var/www/cgi-bin/ Zrób link symboliczny do skryptów odpowiedzialnych za generowanie wykresów # ln -s /usr/lib/cgi-bin/mailgraph.cgi /var/www/cgi-bin/ Żeby zobaczyć nasze wykresy wpisujemy w przeglądarce: http://localhost/cgi-bin/mailgraph.cgi 5.2 Pflogsumm czyli raport Pflogsumm jest skryptem napisanym w perlu do generowania statystyk z logów maila. Mamy takie statystki jak: z którego konta zostało wysłano najwięcej maili, kto do nas wysłał najwięcej maili, w których godzinach jest wysyłane najwięcej mail itd. … Przedstawię tu jak zainstalować i skonfigurować ten skrypt żeby otrzymywać raz w tygodniu raport z wysłanych i otrzymanych mail. Zainstalujemy ten skrypcik: # aptitude install pflogsumm mutt • pflogsumm - Postfix log entry summarizer • mutt - text-based mailreader supporting MIME, GPG, PGP and threading Zanim zajmiemy się konfiguracją skryptu najpierw musimy skonfigurować, aby logi mail były pakowane raz dziennie w tym celu tworzymy plik: # nano /etc/logrotate.d/mail I dodajemy poniższa zawartość /var/log/mail.log { missingok daily rotate 7 create compress start 0 } Tworzymy plik: # nano /root/bin/postfix_report.sh Dodajemy poniższa zawartość i zmieniamy odpowiednie warości: #!/bin/bash EMAILS="qqq@test.com xxx@test.pl" SUBJECT="Statystyki mail z `hostname`" gunzip /var/log/mail.log.0.gz pflogsumm /var/log/mail.log.0 | mutt -s "$SUBJECT" $EMAILS gzip /var/log/mail.log.0 exit 0 Nadajmy prawa do wykonywania dla tego pliku: # chmod 750 /root/bin/postfix_report.sh Otwórzmy plik cron’a: # nano /etc/crontab Dodajmy go do crona aby wykonywał się codziennie o 7:00 i wysyłał nam raport na podany przez nasz adres w skrypcie. 0 7 * * * /root/bin/postfix_report.sh &> /dev/null

sobota, 26 czerwca 2010

Zarządzanie plikami

Systemy uniksowe zapewniają szereg poleceń służących do manipulowania plikami oraz katalogami. Ich mocną stroną jest fakt, że w miarę prosty sposób można ich użyć na grupie plików/katalogów, spełniających określone wymagania. Na przykład można usunąć wszystkie pliki, które spełniają określone kryteria lub dokonać masowej zmiany nazw.

1. ls

ls to bardzo często wykorzystywane polecenie. Wyświetla ono na standardowym wyjściu zawartość katalogu. Jeżeli jako parametr nie poda się ścieżki do katalogu, wyświetlona zostanie zawartość katalogu bieżącego (tj. tego, w którym aktualnie się znajdujemy).

adam@laptop:~/Dokumenty/jakilinux.org$ pwd
/home/adam/Dokumenty/jakilinux.org/
adam@laptop:~/Dokumenty/jakilinux.org$ls
przykład.txt wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org$ls /var/
backups cache crash games lib local lock log mail opt run spool
tmp

W drugim przykładzie powyżej została wyświetlona zawartość katalogu podanego jako parametr. Polecenie ls może wyświetlać bardziej szczegółowe dane, jeżeli uruchomi się je z parametrem -l.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 wszystko_o_konsoli.txt

W powyższym listingu w pierwszej linii wyświetlana jest suma bloków na dysku użytych przez pliki w katalogu. Dalej wyświetlane są:

  • -rw-rr uprawnienia danego pliku, katalogu (szerzej na temat uprawnień w dalszej części przewodnika),
  • liczba twardych dowiązań do danego pliku,
  • właściciel pliku, grupa do której należy właściciel,
  • długość pliku,
  • data ostatniej modyfikacji,
  • nazwa pliku/katalogu.

Polecenie ls umożliwia wyświetlanie plików ukrytych (tzw. pliki z kropką). Pliki ukryte zaczynają się od znaku kropki ., do wyświetlania plików ukrytych służy parametr -a.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -a
. .. .plik_ukryty przykład.txt wszystko_o_konsoli.txt

Polecenie ls umożliwia sortowanie wyników. Do dyspozycji są parametry:

  • -t — wyświetla zawartość posortowaną wg daty modyfikacji (od najnowszej do najstarszej),
  • -S — wyświetla zawartość wg rozmiaru od największego do najmniejszego,
  • -r — odwraca porządek sortowania.

Istnieje również możliwość wyświetlenia rekursywnego zawartości katalogów, tzn. wyświetlona zostanie zawartość wszystkich podkatalogów w katalogu, służy do tego parametr -R.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -R
.:
katalog1 katalog2 przykład.txt wszystko_o_konsoli.txt

./katalog1:
plik1 plik2

./katalog2:
plik3 plik4

2. cd

Polecenie cd (ang. change directory) służy do poruszania się po drzewie katalogów. Jako parametr polecenie pobiera miejsce w drzewie katalogów, do którego chcemy się przenieść.

adam@laptop:~$cd /usr/bin
adam@laptop:/usr/bin$pwd
/usr/bin

W tym miejscu warto nadmienić, że znak ~ (tylda) jest traktowany przez powłokę jako znak specjalny — jest to skrót do katalogu domowego (ang. home directory) użytkownika.

adam@laptop:/usr/bin$cd ~
adam@laptop:~$pwd
/home/adam

Jeżeli wpiszemy cd ~nazwa_użytkownika, to polecenie to przeniesie nas do katalogu domowego użytkownika o loginie nazwa_użytkownika.

adam@laptop:~$cd ~zoidberg
adam@laptop:/home/zoidberg$pwd
/home/zoidberg

Znak - oznacza katalog, który był poprzednio katalogiem roboczym. Aby przejść do katalogu nadrzędnego, należy wpisać cd .. Każdy (nawet pusty) katalog w systemach uniksowych zawiera 2 elementy . i .. Pojedyncza kropka . jest to dowiązanie katalogu do niego samego, natomiast dwukropek .. jest dowiązaniem do katalogu nadrzędnego w drzewie katalogów.

adam@laptop:~$cd ..
adam@laptop:/home$pwd
/home

Wraz z poleceniem cd, warto wprowadzić terminy ścieżka względna i ścieżka bezwzględna.

  • Ścieżka bezwzględna (zwana też absolutną, ang. absolute path) to ścieżka, która rozpoczyna się od korzenia drzewa katalogów / np. /home/adam.
  • Ścieżka względna (ang. relative path) to ścieżka rozpoczynająca się od katalogu, w którym obecnie się znajdujemy.

3. mkdir, rmdir

Polecenia te służą odpowiednio do tworzenia i usuwania katalogów. Jako parametr podajemy nazwę tworzonego/usuwanego katalogu. Poleceniem {rmdir} można usunąć tylko pusty katalog.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ mkdir katalog
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
katalog przykład.txt wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rmdir katalog/
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
przykład.txt wszystko_o_konsoli.txt

cp, mv, rm

  • {cp} — polecenie to służy do kopiowania plików, pobiera ono co najmniej dwa parametry: plik źródłowy i miejsce docelowe, do którego chcemy go skopiować,
  • mv — służy do przenoszenia lub zmiany nazwy plików lub katalogów, działa na identycznej zasadzie jak polecenie cp,
  • rm — służy do usuwania plików.

Polecenia cp, mv i rm mają następujące wspólne parametry:

  • -f force — wymusza usuniecie docelowego pliku, nawet w przypadku braku uprawnień do zapisu,
  • -i interactive — użytkownik zostanie poproszony o potwierdzenie wykonywanej operacji,
  • -b —backup — zostanie utworzona kopia zapasowa plików nadpisywanych (tylko cp i mv),

Polecenia cp i rm mogą również pracować w trybie rekursywnym, umożliwia to parametr -r (-R, —recursive).

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
katalog1 katalog2 katalog3 przykład.txt wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cp -R katalog2/ katalog3/
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls katalog3/
katalog2
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rm -r katalog3/
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
katalog1 katalog2 przykład.txt wszystko_o_konsoli.txt

Poleceniem rm -r można usuwać niepuste katalogi, tak jak na przykładzie powyżej.

5. ln

Jest to polecenie wykorzystywane do tworzenia dowiązań do plików, dowiązania można interpretować jako odpowiednik skrótu do pliku znanego z systemów Windows (jest to trochę naciągana interpretacja!)
Wyróżniamy dwa rodzaje dowiązań:

  • miękkie (tzw. symboliczne), odwołują się one do pliku — ten rodzaj dowiązań można interpretować jako odpowiednik skrótu z Windows,
  • twarde — jest to dowiązanie do konkretnego miejsca na dysku, innymi słowy do fizycznego obszaru na dysku gdzie znajduje się plik.

Jeżeli usunie się plik, do którego prowadzi dowiązanie symboliczne, dowiązanie to zostanie podświetlone na czerwono (jeżeli powłoka wspiera kolory), jeżeli usuniemy plik, do którego utworzone zostało dowiązanie twarde, nic się nie stanie, taki plik zostanie usunięty dopiero wtedy, gdy liczba twardych dowiązań spadnie do zera.

Dowiązania symboliczne tworzy się uruchamiając polecenie ln z parametrem -s.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ cat plik
Przykład dowiązań.
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ln -s plik \\
dowiazanie_symboliczne
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
lrwxrwxrwx 1 adam adam 4 2007-06-01 19:11 dowiazanie_symboliczne -> plik
-rw-r--r-- 1 adam adam 22 2007-06-01 19:10 plik
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rm plik
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
dowiazanie_symboliczne

W powyższym przykładzie można zaobserwować działanie dowiązań symbolicznych. Polecenie ls wskazuje, że dla pliku nie zmieniła się liczba twardych dowiązań. Zupełnie inaczej jest na przykładzie poniżej, gdzie liczba twardych dowiązań wynosi 2, po usunięciu pliku spada do 1, plik cały czas jest dostępny.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ln plik dowiazanie_twarde
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
-rw-r--r-- 2 adam adam 22 2007-06-01 19:11 dowiazanie_twarde
-rw-r--r-- 2 adam adam 22 2007-06-01 19:11 plik
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rm plik
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
-rw-r--r-- 1 adam adam 22 2007-06-01 19:11 dowiazanie_twarde

6. touch

touch to proste polecenie mające dwa zastosowania. Jeżeli podamy jako parametr istniejący plik, to zmieni mu datę modyfikacji. Jeżeli podamy nazwę nieistniejącego pliku, to zostanie utworzony pusty plik.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 przykład.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ touch przykład.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-06-07 13:27 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ touch nowy.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-06-07 13:28 nowy.txt
-rw-r--r-- 1 adam adam 0 2007-06-07 13:27 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 wszystko_o_konsoli.txt

Uruchamiając touch z parametrem -c lub —no-create, zapobiegniemy utworzeniu nowego pliku.
Parametr -d lub -t przy czym parametr t wymaga określenia daty w formacie MMDDhhmm.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-06-07 13:28 nowy.txt
-rw-r--r-- 1 adam adam 0 2007-06-07 13:27 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-06-07 13:28 nowy.txt
-rw-r--r-- 1 adam adam 0 2007-06-07 13:27 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-05-30 11:31 wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ touch -t \\
200706101200 nowy.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ touch -d \\
"last monday" przykład.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ touch -d \\
"2 days ago 12:00" wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls -l
razem 0
-rw-r--r-- 1 adam adam 0 2007-06-10 12:00 nowy.txt
-rw-r--r-- 1 adam adam 0 2007-06-04 00:00 przykład.txt
-rw-r--r-- 1 adam adam 0 2007-06-05 12:00 wszystko_o_konsoli.txt

7 df, du

Służą do wyświetlania miejsca zajmowanego przez system plików (df) oraz przez konkretny plik (du). Uruchomione z parametrem -h dadzą wyniki w megabajtach. Przykład dla polecenia df:

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ df -h
System plików rozm. użyte dost. %uż. zamont. na
/dev/sda5 40G 34G 4,0G 90% /
varrun 502M 136K 502M 1% /var/run
varlock 502M 0 502M 0% /var/lock
procbususb 502M 148K 502M 1% /proc/bus/usb
udev 502M 148K 502M 1% /dev
devshm 502M 0 502M 0% /dev/shm

Przykład dla polecenia du:

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ du -h error.txt
4,0K error.txt

Aby sprawdzic kto wykozystuje najwiecej przestrzeni dysku mozesz skozystac z polecenia du. Umozliwia okreslic uzycie dysku na podstawie przetworzonych katalogow.

du -sh /home/*

Opcje tego polecenia:
-c - wyswietla calkowity raport o ilosci zajmowanej przestrzeni dyskowej po zakonczeniu dzialania.
-a - wyswietl liczby dla wszystkich plików, nie tylko katalogów.
-h - pokazuje objętosci w postaci czytelniejszej dla człowieka, dodajac literowe przyrostki okreslajace potęgi 1024, np. "M" dla megabajtów. "M" oznacza 1.048.576 bajtów.
-S - oblicz rozmiar każdego katalogu osobno, nie właczajac rozmiarów podkatalogów.


8. echo

Jest to proste polecenie, które jako wynik swojej pracy zwraca tekst, który został podany mu jako parametr.

adam@laptop:~$echo Hello World!
Hello World!

Polecenie to dodaje na końcu znak przejścia do nowej linii, aby to ominąć, należy uruchomić program, z parametrem -n. Na przykład:

adam@laptop:~$echo -n Hello World!
Hello World!adam@laptop:~$

W przypadku zamknięcia tekstu w cudzysłowy, tekst będzie interpretowany bezpośrednio (o tym później).

9. pwd

pwd (ang. print working directory) to polecenie wyświetlające pełną ścieżkę w miejscu w drzewie katalogów, w którym aktualnie się znajdujemy.

adam@laptop:~$pwd
/home/adam

10. cat

Polecenie cat można wykorzystywać w celu tworzenia pliku a dokładniej rzecz ujmując przekierowania standardowego wejścia do pliku oraz wyświetlenia na standardowym wyjściu. Plik tworzy się w następujący sposób:

adam@laptop:~$cat > plik.txt
Bardzo ciekawy tekst.

Temat użycia operatora > zostanie poruszony szerzej w dalszej części przewodnika. Aby wyświetlić zawartość pliku, wystarczy wpisać cat nazwa_pliku.

adam@laptop:~$cat plik.txt
Bardzo ciekawy tekst.

Możesz również uzyskać numery linii wyświetlanego pliku w lewym rogu ekranu.

adam@laptop:~$cat -n plik.txt
1 Bardzo ciekawy tekst.

Polecenie cat może również łączyć pliki, w poniższym przykładzie scalam 5 fragmentów obrazu ISO w jedną całość.

cat plik1 plik2 plik3 plik4 plik5 > file.iso

11. wc, head, tail

Te trzy polecenia wykorzystywane są do operacji na ciągach tekstu. Polecenie wc wyświetla liczbę linii, słów oraz bitów w danym pliku.

adam@laptop:~/Dokumenty/jakilinux.org$ wc wszystko_o_konsoli.txt
94 908 6828 wszystko_o_konsoli.txt

W powyższym przykładzie pierwsza kolumna to liczba linii, druga słów, a trzecia liczba bitów.
Kolejne dwa polecenia wyświetlają odpowiednio początek pliku (head) oraz koniec (tail) — domyślnie wyświetlane jest 10 linii tekstu. Wartość tę w obu programach można regulować parametrem -n podając liczbę linii, które chcemy zobaczyć.

adam@laptop:~/Dokumenty/jakilinux.org$ head -n 1 przykład.txt
Pierwsza linia tekstu!
adam@laptop:~/Dokumenty/jakilinux.org$ tail -n 2 przykład.txt
Przed ostatnia linia tekstu!
Ostatnia linia tekstu!

12 less

Polecenie less służy do przeglądania pliku z możliwością jego przewijania, zarówno do przodu, jak i wstecz.

adam@laptop:~$less plik.txt

Powyższe polecenie spowoduje wyświetlenie pliku plik.txt. Wprowadzenie :f podczas korzystania z programu spowoduje wyświetlenie interesujących informacji, np. numer linii na górze ekranu czy wielkości pliku. Dodatkowo zastosowanie polecenia cat z przełącznikiem -n umożliwia wyświetlenie numeru każdej linii przy lewej krawędzi ekranu, co widać poniżej.

adam@laptop:~$cat plik.txt | less

Program opuszczamy wpisując :q.

Procesy

Na początek warto poznać definicję procesu, oraz kilka innych terminów z nim związanych. Mówiąc najogólniej proces jest wykonywanym programem, który posiada pewien stan:

  • nowy – proces właśnie został utworzony
  • gotowy – proces znajduje się w pamięci czeka na wykonanie swojego kodu przez procesor
  • działający – proces, który aktualnie jest wykonywany przez procesor
  • zablokowany – proces oczekujący na przydzielenie danego zasobu
  • zakończony – proces kończący działanie

Proces otrzymuje dostęp do zasobów takich jak np.: procesor, pamięć, pliki, urządzenia wejścia – wyjścia. Każdy posiada swój unikalny identyfikator liczbowy PID (ang. Process ID) oraz identyfikator rodzica (PPID – ang. Parent Process ID) czyli procesu który go utworzył. Tak więc uruchomione procesy można przedstawić w formie drzewa, w którego korzeniu znajdować się będzie proces z PID równym jeden – init, uruchamiany jako pierwszy po załadowaniu jądra. Podobnie jak pliki procesy posiadają swoich właścicieli, zazwyczaj są to użytkownicy którzy uruchomili dany program, wyjątkiem jest tu program z ustawionym bitem setuid lub też setgid. Prawa dostępu do zasobów systemu (np. plików w katalogu /dev), użytkownika który uruchomił proces, określają prawa dostępu jakie będzie posiadał proces. Do komunikacji z procesami wykorzystywane są tzw. sygnały. Programy uruchomione są z różnym priorytetem, określanym liczbą nice, przyjmującą wartości od -20 (najwyższy) do 19 (najniższy), domyślna wartość to 0.

2. fg, bg, jobs

Terminal umożliwia uruchamianie kilku programów naraz, przełączanie się pomiędzy nimi polega na przesuwaniu programu z “pierwszego planu” w “tło”. Tylko pierwszoplanowy proces może odbierać dane od użytkownika. Przesuwanie procesów z tła na pierwszy plan i w drugą stronę porównać można do aktywnego okna które przykrywa, pozostałe, nieaktywne okna.

Aby uruchomić program w tle wystarczy na końcu polecenia dostawić znak & (ang. Ampersand).

$ mpg123 -q plik.mp3&
[1] 638
$

Uruchamiając mpg123 w tle mogę słuchać muzyki mając cały czas dostęp do powłoki. Powłoka w nawiasie kwadratowym podała mi numer zadania (ang. job) - 1, oraz numer PID - 638.

Aby wyświetlić listę uruchomionych w tle zadań, należy użyć polecenia jobs, posiada ono dodatkowy parametr -l podający dodatkowo numer PID danego zadania.

Aby zatrzymać proces pierwszoplanowy należy użyć kombinacji Ctrl + z (w tym przypadku do procesu zostanie wysłany sygnał SIGSTP), aby zatrzymać proces można posłużyć się kombinacją Ctrl + c, przesłany zostanie do procesu sygnał SIGINT .

$ jobs -l
[1]- 638 Running mpg123 -q plik.mp3 &
[2]+ 878 Stopped (tty output) mc

W tle uruchomione zostały dwa zadania, mpg123 jest uruchomiony ponieważ do działania nie potrzebuje interakcji z użytkownikiem, mc jest zatrzymany i czeka na dane od użytkownika.

Aby dany proces uczynić pierwszoplanowym, należy posłużyć się poleceniem fg %numer zadania, lub fg %?nazwa plecenia lub fragment nazwy.

$ fg %1
$ fg %mpg

W pierwszym przypadku przeniosłem zadanie na pierwszy plan odwołując się do jego numeru zadania, w drugim odwołując się po fragmencie nazwy.

Polecenie fg %numer zadania, uruchomi zatrzymane w tle zadanie, w przeciwieństwie do polecenia fg, nie przeniesie zadania na pierwszy plan.

$ mpg123 -q plik.mp3
Ctrl + z
[3]+ Stopped mpg123 -q plik.mp3
$ bg %3
[3]+ mpg123 -q plik.mp3 &

Na koniec warto zwrócić uwagę na jeden fakt, na ekranie pojawią się dane wysyłane przez program w tle na standardowe wyjście, wyjście błędów, aby tego uniknąć można przekierować strumień do śmietnika np.polecenie > /dev/null

3. ps, pstree

Przedstawione wcześniej polecenie jobs, wyświetlało procesy uruchomione na danym terminalu. Aby wyświetlić szczegółowy spis procesów uruchomionych w systemie można posłużyć się poleceniem ps, uruchomione bez parametrów zadziała tak jak jobs. Pełny spis wszystkich parametrów dostępny jest w podręczniku tego polecenia (man ps), poniżej kilka najciekawszych opcji:

  • -e wyświetli każdy proces uruchomiony w systemie
  • -l szczegółowy opis
  • -f opis szczegółowy, krótszy od -l
  • -H pokazuje spis procesów w formie drzewa
  • a wyświetla wszystkie procesy
  • x wyświetla procesy uruchomione bez terminala
  • u podaje nazwę użytkownika który uruchomił proces
  • f wyświetla procesy w formie drzewa

Ps przyjmuje parametry w dwóch, nie kompatybilnych ze sobą, formatach: System V (parametry z myślnikiem -), oraz BSD. Wyjście polecenia z parametrami aux będzie wyglądać:

$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 2952 1852 ? Ss 10:49 0:01 /sbin/init
adam 5623 0.0 0.6 27892 7100 ? Ssl 10:51 0:00 /usr/bin/gnome-session
adam 6815 0.2 1.6 39880 16728 ? S 11:11 0:14 gedit
adam 7105 0.0 0.2 5708 3060 pts/1 Ss 11:16 0:00 bash

Poszczególne kolumny oznaczają:

  • USER – nazwa użytkownika, właściciela procesu
  • PID – identyfikator procesu
  • %CPU – szacowany procent użycia procesora, obliczany poprzez podzielenie czasu użycia procesora przez proces, przez czas uruchomienia
  • %MEM – szacowany procent użycia pamięci
  • VSZ – ilość użytej pamięci wirtualnej w KB
  • RSS – wykorzystana pamięć fizyczna w KB
  • TTY – terminal na którym uruchomiono proces
  • STAT – stan procesu, D oczekujący na dane z I\O, R działający, S uśpiony, T zatrzymany, X proces martwy(nie powinien być wyświetlany), Z proces zombie
  • START – godzina uruchomienia procesu
  • TIME – łączny czas zużycia procesora
  • COMMAND – polecenie które uruchomiło proces

Polecenie pstree, wyświetla procesy w formie drzewa, posiada parametr -a wyświetlający polecenie które uruchomiło proces.

$ pstree -a
init
├─cupsd
├─dbus-daemon --system
├─gedit
└─gnome-terminal
├─bash
│ └─man ps
│ └─pager -s
├─bash
│ └─man ps
│ └─pager -s
└─bash
└─pstree -a

3. top

Polecenie top umożliwia podgląd uruchomionych procesów w systemie w czasie rzeczywistym. Parametr -u nazwa użytkownika umożliwia podgląd procesów uruchomionych tylko wybranego użytkownika, -pPID pozwala na podgląd procesu o określonym PID, przy czym parametr ten może zostać podany do 20 razy.

$ top
top - 17:38:09 up 43 min, 2 users, load average: 0.32, 0.17, 0.06
Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.5%us, 0.2%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1026304k total, 560996k used, 465308k free, 42120k buffers
Swap: 1020116k total, 0k used, 1020116k free, 246652k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7391 adam 15 0 189m 56m 21m S 3 5.6 0:20.42 firefox-bin
7517 adam 15 0 2368 1164 876 R 1 0.1 0:00.03 top
4029 root 13 -2 1744 384 280 S 0 0.0 0:00.76 ipw3945d-2

Aby zamknąć program należy posłużyć się przyciskiem q, niektóre przydatne skróty:

  • F lub O zmienia kolejność sortowania
  • spacja odświeża ekran
  • < ,> zmienia kolejność sortowania, wg. wyświetlanych kolumn
  • r zmienia wartość nice procesu
  • W zapisuje bieżące ustawienia top do pliku ~/.toprc
  • k wysyła sygnał do procesu

4. htop

Htop wyświetla listę procesów w bardziej rozbudowanej graficznie formie, program ten korzysta z biblioteki ncurses, zazwyczaj nie jest domyślnie dostępny.

  • kursory – poruszanie się pomiędzy procesami
  • F1 – menu pomocy
  • F2 – ustawienia
  • F3 – wyszukaj proces
  • F4 – odwraca sortowanie
  • F5 – wyświetla procesy w formie drzewa
  • F6 – zmienia kolejność sortowania
  • F7 – zmniejsza priorytet wybranego procesu
  • F8 – zwiększa priorytet wybranego procesu
  • F9 – wysyła sygnał do procesu
  • F10 – kończy program

5. kill

Wysyła sygnały procesom, składnia to kill sygnał PID, domyślny sygnał to SIGTERM (wartość liczbowa: 15), “delikatnie” kończący działanie programu pozwalający zamknąć otwarte pliki i “posprzątać” po swoim działaniu. Mocniejszym w działaniu procesem jest SIGKILL (wartość 9) wymuszający natychmiastowe zakończenie programu, sygnały SIGSTOP oraz SIGCONT odpowiednio zatrzymują i wznawiają wykonanie procesu. Procesowi można wysłać sygnał używając jego nazwy, lub korzystając z wartości liczbowej.

kill -SIGKILL 7496
kill -9 7496

W obu przypadkach zostanie “zabity” proces od PID 7496.

6. killall

W tym poleceniu moża przesłać sygnał wykorzystując nazwę procesu (można użyć wyrażeń regularnych) np.:

killall mplayer

Zabije wszystkie procesy o nazwie mplayer. Ciekawym parametrem jest -l, wyświetlający wszystkie możliwe sygnały. W niektórych systemach np. Solaris polecenie to zabija wszystkie procesy jakie użytkownik jest w stanie zabić, uruchomione przez roota zakończy działanie systemu.

7. nohup

Polecenie to związane jest z sygnałem SIGHUP. Historycznie sygnał ten informował o utracie połączenia z terminalem. Obecnie wykorzystywany jest do informowania, że pseudo-terminal na którym uruchomiono program zakończył działanie, przez co programy uruchomione na tym terminalu też są kończone. Proces uruchomiony z poleceniem nohup będzie ignorował ten sygnał.

$ nohup pidgin
nohup: dołączanie wyników do `nohup.out'

Jeżeli wcześniej wyjście programu nie zostało przekierowane do pliku, nohup domyślnie przekieruje je donohup.out.

8. pidof, pgrep

To dwa małe ale przydatne polecenia, podają one PID polecenia.

$ pidof nautilus
5668
$ pgrep nautilus
5668

Pgrep posiada parametr -l, wyścielający nazwę programu i PID, oraz parametry -u nazwa użytkownika, -G nazwa grupy wyświetlający procesy należące do danego użytkownika lub grupy.

$ kill `pidof mplayer`

W powyższym przykładzie wykorzystałem pidof do zamknięcia mplayera nieznając jego numeru PID.

9. renice

Polecenie to zmienia priorytet procesu, najwyższy priorytet to -20, najniższy to 19. Priorytety zmniejszać może tylko root.

$ renice 19 `pidof top`
12344: old priority 0, new priority 19

Parametr -u nazwa użytkownika zmieni priorytet wszystkim procesom których właścicielem jest podany użytkownik, -g nazwa grupy podana grupa.

$ renice 5 -u adam
1000: old priority 2, new priority 5

Zmienne środowiskowe

Jak podaje Wikipedia, zmienne środowiskowe to zbiór dynamicznych wartości, wpływających na sposób w jaki działać będą uruchomione procesy (programy). Zmienne systemowe występują w każdym systemie operacyjnym Unix, Unix-like oraz MS DOS i Windows. Oczywiście różne systemy korzystać będą z różnych zbiorów zmiennych, jednak najczęściej większość zmiennych będzie wspólna.
Początkujący użytkownicy bardzo często boją się korzystać ze zmiennych systemowych w obawie przed uszkodzeniem systemu, traktując je jako rzecz nie do ogarnięcia. Oczywiście jest to podejście jak najbardziej błędne. Bash pozwala również na tworzenie tzw. zmiennych powłoki, które działają na zasadzie identycznej jak zmienne środowiskowe przy czym ich zasięg dotyczy tylko powłoki, w której zostały utworzone.

1. Niektóre zmienne środowiskowe

Zmienna Opis
PATH Zmienna zawiera oddzieloną dwukropkami listę katalogów w której, powłoka będzie szukać programu którego nazwę do wykonania wprowadził użytkownik, jeżeli taki program nie zostanie znaleziony, powłoka wyświetli komunikat “polecenie nie odnalezione”
EDITOR Domyślny edytor tekstu, zmienna wykorzystywana przez niektóre programy np. przez klienta poczty mutt. W jego przypadku emaile edytowane są w programie określonym przez tę zmienną
SHELL Powłoka wykorzystywana przez użytkownika
USER Nazwa użytkowanika
SHLVL Liczba uruchomionych powłok
TERM Domyślnie uruchamiany emulator terminala
HOME Domyślna ścieżka do katalogu domowego użytkownika
UID Unikalny liczbowy identyfikator zalogowanego użytkownika
$LANG, $LC_ALL Zmienne przechowujące ustawienia językowe (locale)

2. Wyświetlanie wartości zmiennej

Aby wyświetlić wartość jaką ma dana zmienna, używamy znanego już polecenia echo $zmienna.

adam@laptop:~$ echo $USER $UID $SHELL $HOME
adam 1000 /bin/bash /home/adam

Aby wyświetlić wszystkie używane zmienne, można użyć polecenia env. W poniższym przykładzie pokazany jest tylko fragment bardzo długiego wyjścia. Alternatywnie można użyć wbudowanego w basha polecenia set.

adam@laptop:~$ env
SSH_AGENT_PID=5605
TERM=xterm
DESKTOP_STARTUP_ID=
SHELL=/bin/bash
GTK_RC_FILES=/etc/gtk/gtkrc:/home/adam/.gtkrc-1.2-gnome2
WINDOWID=58896938
GTK_MODULES=gail:atk-bridge
USER=adam
USERNAME=adam
DESKTOP_SESSION=gnome
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
PWD=/home/adam
LANG=pl_PL.UTF-8
GDMSESSION=gnome
HOME=/home/adam
SHLVL=2
LOGNAME=adam

3. Tworzenie nowych zmiennych

Nową zmienną tworzy się wpisując jej nazwę i wartość jaką będzie ona miała. Na przykład zmienna=wartość. Zmienne są czułe na wielkość liter, tak więc ZMIENNA nie będzie tym samym co zmienna pisana małymi literami. Zwyczajowo przyjęło się pisać nazwy zmiennych wielkimi literami.

adam@laptop:~$ ZMIENNA=wartość
adam@laptop:~$ echo $ZMIENNA
wartość

Utworzona powyżej zmienna powłoki ma pewną nieprzyjemną cechę, mianowicie dostępna będzie jedynie w powłoce, w której została utworzona, a programy uruchomione z tej powłoki, nie będą miały do niej dostępu. Aby obejść to ograniczenie, należy wyeksportować zmienną za pomocą polecenia export.

adam@laptop:~$ ZMIENNA=wartość
adam@laptop:~$ ZMIENNA2=wartość2
adam@laptop:~$ export $ZMIENNA2
adam@laptop:~$ export ZMIENNA2
adam@laptop:~$ bash #uruchamiam nową powłokę
adam@laptop:~$ echo $ZMIENNA1 $ZMIENNA2
wartość2

W powyższym przykładzie wyeksportowałem tylko jedną zmienną, jej wartość jest dostępna w nowo uruchomionej powłoce.

3. Zapamiętywanie wartości zmiennej

Wszystkie nowo utworzone zmienne, zarówno te wyeksportowane jak i niewyeksportowane, będą dostępne tak długo, jak użytkownik będzie zalogowany. Aby zmienna dostępna była po ponownym zalogowaniu się, należy dodać ją do ukrytego pliku .profile. Jeżeli zmienna ma być dostępna dla każdego użytkownika systemu, należy dodać ją do pliku /etc/profile. Oto przykładowa linia z pliku .profile (konfiguracja serwera anoncvs do pobierania plików źródłowych systemu NetBSD).

export CVSROOT=anoncvs@anoncvs.netbsd.org:/cvsroot

4. Usuwanie zmiennych

Aby usunąć zmienną, należy użyć polecenia unset.

adam@laptop:~$ ZMIENNA=wartość
adam@laptop:~$ echo $ZMIENNA
wartość
adam@laptop:~$ unset ZMIENNA
adam@laptop:~$ echo $ZMIENNA

Wyszukiwanie, wyrażenia regularne

Systemy uniksowe oferują kilka przydatnych poleceń służących do wyszukiwania plików, ciągów tekstu, które w połączeniu z przedstawionymi powyżej strumieniami i przekierowaniami oraz z wyrażeniami regularnymi stanowią bardzo potężne narzędzie administratorskie.

1. Wyrażenia regularne

Wyrażenia regularne są wzorcami opisującymi, zastępującymi łańcuchy tekstów, zostały one wprowadzone od samego początku istnienia Uniksa przez jednego z jego twórców — Kena Thompsona. Wyrażenia regularne są bardzo efektywnym sposobem pracy z tekstem i zdecydowanie warto je opanować.

Symbol Zastępuje
. dowolny znak
^ dopasuj występujące po operatorze wyrażenie do początku wiersza
$ dopasuj poprzedzające wyrażenie do końca wiersza
\x znaki specjalne, gdzie x to znak specjalny np. \$ zastąpi znak dolara
[lista] zastępuje dowolny znak spośród tych wymienionych na liście, mogą to być przedziały np. [0-9] lub [a-d]
() grupowanie wyrażeń regularnych
? dokładnie jeden element wcześniejszy
a|b dopasuje wyrażenie a lub wyrażenie b
* dopasuj zero lub więcej wyrażeń znaku poprzedzający operator
+ jeden lub więcej elementów poprzedzających operator

2. Wyrażenia regularne a znaki globalne

Warto nadmienić że, bash do wersji 3.0 nie miał wbudowanej obsługi wyrażeń regularnych, które to były wykorzystywane przez programy pracujące na strumieniach tekstu np.: sed, awk czy też grep. Za to wbudowana była obsług wyrażeń globalnych i znaków wieloznacznych (ang. wildcards).

Symbol Zastępuje
* dowolny ciąg znaków
? dokładnie jeden znak
[lista] zastępuje dowolny znak spośród tych wymienionych na liście, mogą to być przedziały np. [0-9] lub [a-d]
[^lista] wybrane zostaną znaki, które nie są na liście
{} grupuje wyrażenie globalne

Wyrażenia regularne pozwalają wyszukać dany łańcuch w strumieniu tekstu, podczas gdy wyrażenia globalne zastępują fragmenty tekstu. W poniższym, bardzo prostym przykładzie usunięto wszystkie plik rozpoczynające się na literę “a”.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
aa abc nowy.txt przykład.txt
ab error.txt polecenie.txt wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rm a*
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
error.txt nowy.txt polecenie.txt przykład.txt wszystko_o_konsoli.txt

W tym natomiast usunięto wszystkie które nie mają jako pierwszej litery z zakresu b do z i dalsza ich nazwa to dowolny ciąg znaków.

adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
aa abc nowy.txt przykład.txt
ab error.txt polecenie.txt wszystko_o_konsoli.txt
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ rm [^b-z]*
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ ls
error.txt nowy.txt polecenie.txt przykład.txt wszystko_o_konsoli.txt

3. grep

grep to powszechnie wykorzystywany program do wyszukiwania w strumieniu wejścia ciągów tekstowych, pasujących do podanego wyrażenia regularnego. Występuje on w każdym systemie uniksowym a jego autorem jest Ken Thompson.
grep ma kilka przydatnych parametrów:

  • -c — wyświetla tylko liczbę znalezionych linii,
  • -n — wyświetlany jest numer linii w pliku, w którym znaleziono dany ciąg znaków,
  • -w — wyszukuje tylko całe słowa,
  • -x — wyszukuje tylko całe linie.
adam@laptop:~/Dokumenty/jakilinux.org/przykłady$ dmesg | grep Mouse
[ 15.436000] input: USB-PS/2 Optical Mouse as /class/input/input2
[ 15.436000] input: USB HID v1.10 Mouse [USB-PS/2 Optical Mouse]
on usb-0000:00:1d.0-2

W powyższym przykładzie wyjście polecenia dmesg (wyświetlającego informacje dziennika zdarzeń jądra systemu) przekierowałem za pomocą potoku (operator |) do polecenia grep, gdzie jako wyrażenia regularnego użyłem słowa “Mouse” (wielkość liter ma znaczenie). Polecenie przefiltrowało wejście i wyświetliło jedynie te linie, które zawierają słowo “Mouse”.

Do kolejnych przykładów załóżmy, że mamy plik tekstowy, wyrażenia.txt o zawartości:

1. owoc
2. rower
3. dom
4. auto
5. płyta
ananas

Tak więc:

grep ^[1-6]..a wyrażenia.txt
4. auto
ananas

Powyższe wyrażenie wyszuka wszystkie łańcuchy, które zaczynają się od liczb z przedziału od 1 do 6, dalej zawierają dwa dowolne znaki (w naszym przypadku kropkę i spację), dalej zawierają literę “a”, za nią dowolny już ciąg znaków.
Wyrażenie poniżej wyświetli każdą linię kończącą się na literę “a”.

grep a$ wyrażenia.txt
5. płyta

grep a.*a  wyrażenia.txt
ananas

Powyższe wyrażenie wyszuka dowolny ciąg zaczynający się na a, dalej zawierający dowolny ciąg znaków, i kończący się na a. W tym przypadku warto zwrócić uwagę na zapis “.*”. Jak pamiętamy, znak * w wyrażeniach regularnych zwróci zero lub więcej znaków poprzedzających ten operator, natomiast operator . oznacza dowolny znak. Ujmując to prościej, wyszukujemy w ten sposób zero lub więcej wystąpień dowolnego znaku.

grep "\(1\|4\)" wyrażenia.txt
1. owoc
4. auto

Przedstawione powyżej wyrażenie, jest i tyle ciekawe, że użyto w nim znaków, które bash traktuje jako znaki specjalne. Aby to ominąć, postawiłem przed nimi znak \, a całość zamknąłem w cudzysłów, aby uniknąć interpretowania przez bash tego wyrażenia (zrobi to grep).
Tematyka wyrażeń regularnych jest bardzo rozbudowana, dlatego zachęcam do samodzielnego eksperymentowania i ćwiczeń.

4. find

Polecenie find przeszukuje drzewo katalogów w poszukiwaniu plików lub katalogów o podanej nazwie lub jej części, lub o podanych kryteriach takich jak: rozmiar, typ, właściciel plików, data utworzenia lub data ostatniej modyfikacji. Najprostsze wywołanie programu find może wyglądać następująco:

adam@laptop:~$ find . -name linux
./Downloads/Firefox/vmware-server-distrib/lib/perl5/\\
site_perl/5.005/i386-linux/linux
./Downloads/Firefox/tp_smapi-0.31/include/linux

Składnia tego polecenia jest następująca: find katalogi_startowe kryterium wyszukiwania i operacje, które należy wykonać na wyszukanych elementach. W powyższym przykładzie katalogiem startowym jest katalog bieżący, jak już wcześniej wspominałem każdy katalog zawiera dowiązanie do siebie samego reprezentowane przez kropkę, oraz kryterium wyszukiwania — wszystkie pliki i katalogi zwierające frazę “linux”. Wyszukiwanie rozpoczyna się od katalogu startowego i postępuje w dół drzewa katalogów, tzn. najpierw katalog bieżący, a potem jego podkatalogi, oczywiście o ile ma się prawo do ich odczytu. W programie find można (i warto a wręcz należy) używać znaków globalnych przedstawionych wcześniej.
find umożliwia wyszukiwanie według typu.

adam@laptop:~$ find . -type d

Powyższy przykład wyszuka wszystkie katalogu znajdujące się w bieżącej lokalizacji. Kryteria oczywiście można łączyć.

adam@laptop:~$ find . -type d -name Dokumenty
./Dokumenty
./Dokumenty/jakilinux.org/Dokumenty

Powyższe wywołanie znajdzie wszystkie katalogi w bieżącej lokalizacji zawierające w swej nazwie zwrot “Dokumenty”. Możliwe typy plików przedstawia poniższa tabela.

Parametr Rodzaj pliku
b urządzenie blokowe
c urządzenie znakowe
d katalog
f zwykły plik
l dowiązanie symboliczne
s gniazdo (ang. socket)

find wywołany z parametrem -size wartość, wyszuka pliki o wielkości podanej w parametrze wartość, jeżeli do wartości dodamy znak + (np. -size +wartość), program wyszuka pliki większe od podanej wartości. Jeżeli dodamy znak - (np. -size -wartość), wyszukane zostaną pliki mniejsze od podanej wartości. Domyślna wartość to 512 bitowe bloki, pozostałe wartości to:

  • c — bajty,
  • k — kilobajty,
  • M — megabajty,
  • G — gigabajty.

W poniższym przykładzie zostaną wyszukane wszystkie pliki o rozmiarze większym niż 100 MB ale mniejszym niż 200 MB.

adam@laptop:~$ find . -size +100M -size -200M
./plan9_07010zip

Pozostałe kryteria wyszukiwania przedstawia poniższa tabela.

-atime n Ostatni dostęp miał miejsce n dni temu
-mtime n Plik został zmodyfikowany n dni temu
-newer plik Wyszukiwany plik został zmodyfikowany wcześniej niż podany plik
-links n Plik zawiera dokładnie n twardych dowiązań
-perm p Plik ma uprawnienia, gdzie p to liczbowy tryb dostępu
-user użytkownik Właścicielem pliku jest użytkownik
-group grupa Właścicielem pliku jest grupa
-empty Puste pliki

Opcje liczbowe można poprzedzać znakami + i -, które oznaczają odpowiednio “więcej niż” oraz “mniej niż”, podobnie jak miało to miejsce w kryterium time opisanym wcześniej.

Jak już wcześniej wspominałem, polecenie find może wykonać określone operacje na plikach, które znajdzie. Domyślną operacją jest -print, która wypisuje nazwy łacznie z adresami plików. W niektórych powłokach należy dodawać tę opcję za każdym razem.

Kolejna możliwa akcja to -ls, która wypisuje informacje o plikach w ten sam sposób, co polecenie ls uruchomione z parametrami -lids. Ostatnia możliwość to uruchomienie z parametrem -exec i wykonanie dowolnego polecenia na znalezionych plikach.

adam@laptop:~$ find . -size +100M -size -150M -ls
2485508 115744 -rw-r--r-- 1 adam adam 118398976 maj 2 22:44
./plan9/plan9_compressed.img
find . -size +110M -size -150M -exec cp {} /home/adam/pliki/ \;

Pierwszy z powyższych przykładów, jak widać, wypisze szczegółowe dane wyszukanych plików. Drugi jest ciekawszy i wymaga dokładniejszej analizy. find wykona na plikach operację podaną wraz z parametrem. W tym przypadku, wszystkie pliki większe niż 110 MB i mniejsze niż 150 MB zostaną skopiowane do katalogu pliki, podwójny nawias klamrowy {} oznacza, że operacja ma być wykonana na każdym pliku a \ przed ; chroni przed błędną interpretacją polecenia przez powłokę.
find ma jeszcze inne ciekawe opcje: -ok — działa podobnie jak -exec z tą różnicą, że przed każdą operacją użytkownik proszony jest o potwierdzenie działania, -prune powoduje, że find nie wchodzi do żadnego z napotkanych katalogów.

Składnia find umożliwia tworzenie złożonych wyrażeń, łączenia kryteriów. Domyślnie kryteria łączone są za pomocą logicznej koniunkcji (AND): (-a). Wszystkie kryteria muszą być spełnione, aby plik został uznany za zgodny z kryteriami. Operator łączenia alternatywy logicznej (OR): -o, natomiast operator negacji to: \! Istnieje możliwość wykorzystania nawiasów w celu grupowania kryteriów \( \).
Ważnym parametrem polecenia find jest parametr -print0, w przypadku jego użycia, nazwy znalezionych plików nie są rozdzielane znakiem nowej linii a znakiem null. Rozpatrzmy przykład poniżej, w którym użyjemy dwóch plików: raport czerwiec.txt i raportczerwiec.txt.

adam@laptop:~$ find . -name "raport*" | xargs rm
rm: nie można usunąć `./raport': No such file or directory
rm: nie można usunąć `czerwiec.txt': No such file or directory

Poleceniu rm nie udało sie usunąć pliku raport czerwiec.txt, ponieważ zawiera on spację w nazwie i jego nazwa została w tym miejscu rozdzielona.

find . -name "raport*" -print0 | xargs -0 rm

Polecenie print otrzymało opcję -print0, natomiast polecenie xargs opcję -0, dzięki czemu bez problemu usunięty został plik zawierający spację. Uwaga! Opcja -print0 dostępna jest tylko w wersji GNU polecenia find.