This is an old revision of the document!
root folosind comanda student@host:~$ sudo su
host) folosiți comenzile următoare din contul utilizatorului root de pe stația host (puteți da copy/paste la comenzi în terminal):root@host:~# update_lab --force root@host:~# start_lab lab9
Ctrl+Shift+t), și conectați-vă, din nou, la mașina virtuală folosind comanda ssh de mai sus.red, green și blue).go (ex. go red)
root pentru conectare pe toate stațiile. Aveți nevoie de drepturi privilegiate pentru configurare. Folosiți contul student doar unde vi se cere explicit.
În cadrul exercițiilor din laboratoarele de Linux vom folosi topologia de mai sus.
Utilitarul netcat este folosit pentru a crea conexiuni server-client. Acesta poate îndeplini atât rolul de server, cât și de client.
Pentru a crea un server care ascultă conexiuni pe portul TCP 2024 rulăm comanda
root@host:~# netcat -l 2024
Parametrul -l înseamnă că netcat este în modul listen (server), iar 2024 este portul pe care ascultă: netcat va crea un socket de tip server și va aștepta conexiuni pe portul 2024. Terminalul va rămâne în așteptare, pentru ca un client să se conecteze serverul deschis cu netcat. NU închideți terminalul.
Dorim să verificăm faptul că pe stația host un serviciu ascultă pe portul 2024. Deschidem un nou terminal către stația host și rulăm comanda
root@host:~# netstat -tlnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name [...] tcp 0 0 0.0.0.0:2024 0.0.0.0:* LISTEN 4958/netcat [...]
Comanda netstat afișează serviciile TCP care așteaptă conexiuni pe stația locală. Observăm că programul netcat ascultă pe portul 2024. Opțiunile comenzii netstat sunt:
t - afișează conexiuni TCPl - afișează serviciile care așteaptă (listen) conexiunin - dezactivează rezolvare de nume pentru adrese IP și porturi; de obicei dezactivăm rezolvarea numelor pentru a elimina latența procesului de rezolvare;p - afișează numele și PID-ul procesului de tip serviciu de rețea care așteaptă conexiuni pe portul dat.
În afișare construcția 0.0.0.0:2024 din coloana Local Address înseamnă că serviciul ascultă conexiuni pe toate adresele IP/interfețele disponibile sistemului pe portul 2024.
În terminalul nou deschis către stația host conectați-vă la serviciul proaspăt creat. Folosiți pentru aceasta tot comanda netcat în modul client:
root@host:~# netcat localhost 2024
Comanda a creat un socket de tip client și s-a conectat la serviciul de mai sus (conexiune TCP pe portul 2024). În continuare comanda așteaptă intrare de la utilizator. Mesajele pe care le scriem vor fi transmise serverului care le va afișa la ieșirea standard. Scrieți câteva linii și observați afișarea acestora pe partea serverului. Închideți folosind combinația de taste Ctrl+d. Se închide și serverul.
Pe stația host, realizați pașii de mai sus pentru UDP:
host;
netcat pentru a porni un server sau client UDP, consultați pagina de manual a comenzii și căutați șirul UDP.
La fel, pentru a afla ce opțiune trebuie transmisă comenzii netstat pentru a afișa sockeții UDP, consultați pagina de manual a comenzii și căutați șirul udp.
Pe stația red este instalat un server de HTTP pe care dorim să îl accesăm de pe stația fep.grid.pub.ro. Pentru acest lucru trebuie trebuie să redirectați portul 8080 de pe stația host spre portul 80 de pe stația red folosind DNAT (vezi 05. [10p] Port forwarding).
Pentru testare, deschideți terminal pe fep.grid.pub.ro și accesați site-ul http://10.9.X.Y:8080 (înlocuiți cu IP-ul) prin intermediul utilitarului curl. Vă va apărea un cod HTML cu mesajul Laboratorul 10 - pe red. Exemplu:
student@mjolnir:~$ ssh -X mihai.carabas@fep.grid.pub.ro mihai.carabas@fep.grid.pub.ro's password: [your.name@fep-62-2 ~]$ curl http://10.9.X.Y:8080
Sunt situații în care:
În aceste situații, este util să folosim un client web în linie de comandă. Astfel de clienți web în linie de comandă sunt wget sau curl. În general aceste utilitare sunt folosite pentru descărcarea de fișiere sau alte resurse disponibile în web.
Pentru a descărca fișierul HTML accesat anterior (la 02. [10p] Port forwarding pentru accesare serviciu web) executați, pe stația fep.grid.pub.ro, respectiv pe stația host (urmăriți promptul pentru a determina stația), comenzile de mai jos (<adresa-ip-mv> o puteți obține din dashboard-ul OpenStack):
[mihai.carabas@fep-62-2 ~]$ wget http://<adresa-ip-mv>:8080 --2013-11-26 18:20:10-- http://<adresa-ip-mv>:8080/ Connecting to <adresa-ip-mv>:8080... connected. HTTP request sent, awaiting response... 200 OK Length: 31 [text/html] Saving to: ‘index.html’ 100%[======================================>] 31 --.-K/s in 0s 2013-11-26 18:20:10 (4.92 MB/s) - ‘index.html’ saved [31/31] [mihai.carabas@fep-62-2 ~]$ cat index.html <h1>Laborator 10 - pe red</h1> root@host:~# wget -q http://red/ root@host:~# ls PacketTracer5 index.html root@host:~# cat index.html <h1>Laborator 10 - pe red</h1>
Avem același conținut afișat în browser-ul web grafic: șirul Laboratorul 10 - pe red formatat heading 1.
-q a wget pentru a dezactiva afișarea informații legate de transfer a wget. Opțiunea trebuie folosită cu grijă. Informațiile de eroare furnizate de wget sunt utile pentru depanare și sunt dezactivate la folosirea opțiunii -q.
La adresa http://red/file.dat se află un fișier cu dimensiunea de 1 KB. Descărcați fișierul pe stația host folosind wget. Folosiți comanda ls -l pentru a verifica descărcarea corectă și dimensiunea sa.
Serverul web este configurat să folosească și conexiuni sigure (protocolul HTTPS). Descărcăm fișierul de mai sus (file.dat) pe stația host folosind protocolul HTTPS:
root@host:~# wget https://red/file.dat --2013-11-23 17:50:52-- https://red/file.dat Resolving red (red)... 192.168.1.2 Connecting to red (red)|192.168.1.2|:443... connected. ERROR: cannot verify red's certificate, issued by `/CN=red': Self-signed certificate encountered. To connect to red insecurely, use `--no-check-certificate'.
Observăm că ni s-a afișat o eroare că nu poate fi verificat certificatul. Această verificare poate fi eliminată folosind opțiunea --no-check-certificate:
root@host:~# wget --no-check-certificate https://red/file.dat --2013-11-23 17:52:02-- https://red/file.dat Resolving red (red)... 192.168.1.2 Connecting to red (red)|192.168.1.2|:443... connected. WARNING: cannot verify red's certificate, issued by `/CN=red': Self-signed certificate encountered. HTTP request sent, awaiting response... 200 OK Length: 1024 (1.0K) Saving to: `file.dat' 100%[===================================================================================================================>] 1,024 --.-K/s in 0s 2013-11-23 17:52:02 (18.2 MB/s) - `file.dat' saved [1024/1024]
La adresa http://red/folder se află o structură de directoare și fișiere. Pe stația host, descărcați întreaga structură folosind o singură comandă wget cu parametrul corespunzător.
wget după șirul recursive.
Folosiți utilitarul tree pentru a lista conținutul directorului descărcat. Este posibil ca pachetul tree să fie deja instalat pe host. Dacă nu este instalat, atunci puteți folosi următoarea comandă pentru a-l instala:
root@host:~# apt-get install tree
Când rulați tree pe directorul descărcat observați prezența mai multor fișiere cu nume de forma index.html?C=S;O=D. Aceste fișiere sunt fișiere de tip directory listing generate de serverul web și nu avem nevoie de ele. Ștergeți structura de directoare pe care tocmai ați descărcat-o pe stația host și descărcați-o din nou ignorând aceste fișiere.
Structura de directoare trebuie să fie similară cu:
root@host:~# tree folder/
folder/
├── embedded
│ ├── Qualcomm
│ │ ├── Krait
│ │ │ └── info.txt
│ │ └── Scorpion
│ │ └── info.txt
│ └── TI
│ ├── OMAP3
│ │ └── info.txt
│ └── OMAP4
│ └── info.txt
└── mobile
├── Apple
│ ├── iPadAir
│ │ └── info.txt
│ └── iPhone5S
│ └── info.txt
└── Google
├── Nexus4
│ └── info.txt
└── Nexus7
└── info.txt
14 directories, 8 files
Unele URL-uri pot avea caractere interpretate special în shell rezultând într-un comportament ciudat la descărcare.
Pentru a evidenția acest lucru, pe stația host descărcați resursa de la link-ul http://localhost/login.php?name=Lab10&email=rl@upb.ro:
root@host:~# wget http://localhost/login.php?name=Lab10&email=rl@upb.ro [1] 3284 root@host:~# --2013-12-05 09:02:10-- http://localhost/login.php?name=Lab10 Resolving localhost (localhost)... 127.0.0.1 Connecting to localhost (localhost)|127.0.0.1|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 72 [text/html] Saving to: `login.php?name=Lab10' 100%[======================================>] 72 --.-K/s in 0s 2013-12-05 09:02:10 (13.3 MB/s) - `login.php?name=Lab10' saved [72/72] [1]+ Done wget http://localhost/login.php?name=Lab10 root@host:~#
Enter ca să vă reapară prompt-ul.
Observați că procesul intră în background (linia cu [1] 3284 înseamnă că a fost pornit un job). Acest lucru se întâmplă întrucât simbolul & (ampersand) nu este escapat și se folosește rolul său special din shell: pornirea unui proces în background. Se observă din output că este separată comanda înainte de &, adică rezultă comanda wget http://localhost/login.php?name=Lab10.
Ștergeți fișierul descărcat:
root@host:~# ls PacketTracer5 folder login.php?name=Lab10 root@host:~# rm login.php\?name\=Lab10 root@host:~# ls PacketTracer5 folder
Folosiți escaping în shell pentru a folosi în mod corect URL-ul și pentru a descărca resursa disponibilă la acel link.
Fișierul final descărcat trebuie să arate în acest fel (să conțină Lab10 și rl@upb.ro). Folosiți cat log<TAB> pentru rula comanda de mai jos, ca să obțineți autocompletion din partea shell-ului (<TAB> înseamnă apăsarea tastei TAB):
root@host:~# cat login.php\?name\=Lab10\&email\=rl@upb.ro <html> <body> Welcome Lab10<br> Your email address is: rl@upb.ro </body> </html>
Utilitarul wget este folosit pentru a descărca fișiere prin intermediul web. Utilitarul curl îndeplinește un rol similar, doar că afișează în mod implicit conținutul resurselor la consolă. Este indicat pentru afișarea de pagini web (format HTML) sau alte fișiere în format text.
Spre exemplu, dacă vrem să afișăm conținutul paginii de la adresa http://red/index.html vom folosi comanda:
root@host:~# curl http://red/index.html <h1>Laborator 10 - pe red</h1>
Observăm că output-ul comenzii curl este conținutul fișierului index.html descărcat anterior cu wget.
Un exemplu în mod particular util este aflarea adresei IP (externe) prin interogarea site-ului icanhazip.com:
root@host:~# curl icanhazip.com
141.85.225.204
Observăm că în urma interogării site-ului icanhazip.com, output-ul comenzii curl este adresa noastră IP externă (rutabilă).
În general output-ul întors de curl poate fi prelucrat folosind filtre de text (grep, cut, tr, sort, awk, sed etc.) pentru a obține informațiile de interes.
Utilitarele curl și wget sunt folosite atât pentru transfer HTTP cât și pentru transfer FTP sau alte protocoale. Avantajul folosirii acestor utilitare în fața altora este că sunt neinteractive și pot fi adăugate în scripturi.
Vom folosi curl pentru a descărca un fișier prin FTP. Pe stația red rulează un server FTP și pe stația host vom folosi comanda curl pentru a descărca fișierul localizat la /download/file-10M.dat:
root@host:~# curl ftp://red/download/file-10M.dat Warning: Binary output can mess up your terminal. Use "--output -" to tell Warning: curl to output it to your terminal anyway, or consider "--output Warning: <FILE>" to save to a file.
Observăm că apare un warning legat de output-ul de fișiere binare în terminal.
Pentru a salva într-un fișier conținutul de la distanță folosim opțiunea -o a comenzii curl:
root@host:~# curl ftp://red/download/file-10M.dat -o file-10M.dat % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 10.0M 100 10.0M 0 0 86.8M 0 --:--:-- --:--:-- --:--:-- 91.7M root@host:~# ls -l file-10M.dat -rw-r--r-- 1 root root 10485760 Nov 26 19:54 file-10M.dat
Mai sus utilitarul curl a afișat un sumar al transferului și apoi am validat, folosind comanda ls -l lungimea fișierului descărcat. URL-ul folosit începe cu ftp:// pentru a semnaliza folosirea protocolului FTP pentru transfer.
wget:
root@host:~# wget ftp://red/download/file-10M.dat --2013-11-26 19:55:49-- ftp://red/download/file-10M.dat => `file-10M.dat' Resolving red (red)... 192.168.1.2 Connecting to red (red)|192.168.1.2|:21... connected. Logging in as anonymous ... Logged in! ==> SYST ... done. ==> PWD ... done. ==> TYPE I ... done. ==> CWD (1) /download ... done. ==> SIZE file-10M.dat ... 10485760 ==> PASV ... done. ==> RETR file-10M.dat ... done. Length: 10485760 (10M) (unauthoritative) 100%[======================================>] 10,485,760 --.-K/s in 0.07s 2013-11-26 19:55:49 (138 MB/s) - `file-10M.dat' saved [10485760]
Ne propunem să folosim curl pentru descărcarea unui fișier FTP însă folosind autentificare. Fișierul căutat se găsește în directorul home al utilizatorului ana de pe red și se numește ana-ftp-file-5M.dat. Utilizatorul ana are parola student.
Pe stația host folosiți curl pentru a descărca, prin FTP, fișierul ana-ftp-file-5M.dat din directorul home al utilizatorului ana.
ftp://red/ana-ftp-file-5M.dat. Va fi relativ la directorul home al utilizatorului autentificat.
Pentru autentificarea ca utilizatorul ana în curl, folosiți opțiunea --user. Vedeți informații în pagina de manual a utilitarului curl. Comanda trebuie să fie neinteractivă: trebuie să furnizați în linia de comandă și utilizatorul șî parola.
Pentru activități de automatizare (transmiterea de notificări și anunțuri) este util să putem transmite e-mail-uri din linia de comandă în mod neinteractiv. Trimiterea din linia de comandă presupune scrierea a minim trei componente așa cum se întâmplă și într-un client de e-mail:
Pentru transmiterea unui mesaj în linia de comandă folosim comanda mail. Pentru a transmite un mesaj de la utilizatorul bogdan către utilizatorul corina (ambii pe stația host), ne autentificăm ca utilizatorul bogdan:
root@host:~# su - bogdan bogdan@host:~$
și folosim comanda (apăsați ENTER acolo unde vă cere Cc; nu vrem să introducem adresă de tipul Carbon Copy):
bogdan@host:~$ mail -s "Invitatie la film" corina Cc: Buna, Corina! Vii la filmul "Teambuilding"? Bogdan ^D
Mesajul de mai sus a fost finalizat folosind combinația de taste Ctrl+d, însemnând End of File (EOF).
Pentru a verifica faptul că mesajul e transmis, ne autentificăm ca utilizatorul corina și rulăm comanda:
corina@host:~$ mail "/var/mail/corina": 1 message 1 new >N 1 bogdan@host Tue Nov 26 21:07 17/419 Invitatie la film ? 1 [...] Subject: Invitatie la film To: <corina@host> [...] From: bogdan@host Buna, Corina! Vii la filmul "Teambuilding"? Bogdan ? q Saved 1 message in /home/corina/mbox Held 0 messages in /var/mail/corina
Comanda mail, fără argumente citește căsuța poștală implicită a utilizatorului (din /var/mail/<username>). Promptul comenzii este ? și permite introducerea de comenzii. Mai sus am folosit comanda 1 pentru a citi primul mesaj și apoi comanda q pentru a părăsi utilitarul. În conținutul mesajului apare și destinatarul (câmpul To) și subiectul mesajului (câmpul Subject).
Mesajul nu este obligatoriu să fie scris la intrarea standard ci poate fi redirectat dintr-un fișier sau o altă comandă. Un mesaj simplu poate fi trimis și folosind comanda:
bogdan@host:~$ echo 'Hello, Corina' | mail -s "Salutari" corina
Verificăm mesajul folosind comanda mail în contul utilizatorului corina:
corina@host:~$ mail "/var/mail/corina": 1 message 1 new >N 1 bogdan@host Tue Nov 26 21:13 13/371 Salutari ? 1 [...] Subject: Salutari To: <corina@host> [...] From: bogdan@host Hello, Corina ? q Saved 1 message in /home/corina/mbox Held 0 messages in /var/mail/corina
Trimiteți un mesaj simplu din contul utilizatorului bogdan către o adresă a voastră de e-mail. Verificați și în Spam/Junk primirea mesajului. Dacă nu îl regăsiți, este posibil ca provider-ul de mail să filtreze mail-urile pe baza unor euristici.
La exercițiul anterior, mesajul primit apare ca sosind de la bogdan@host. Nu este foarte elegant și am vrea să schimbăm adresa expeditorului.
Pentru a specifica adresa expeditorului vom folosi comanda mail disponibilă în pachetul s-nail care permite această opțiune. Este posibil ca pachetul s-nail să fie deja instalat pe host. Dacă nu este instalat, atunci puteți folosi următoarea comandă pentru a-l instala:
root@host:~# apt-get install s-nail Reading package lists... Done Building dependency tree [...]
Odată ce pachetul s-nail a fost instalat, comanda mail este furnizată de acest pachet în mod implicit.
Trimiteți un mesaj la adresa voastră de e-mail astfel încât expeditorul mesajului să fie bogdan.georgescu@rl.cs.pub.ro.
mail din pachetul s-nail are opțiunea -r cu ajutorul căreia puteți preciza adresa de e-mail sursă care să fie folosită pentru trimiterea e-mail-ului.
Detalii despre fenomen și prevenirea e-mail forging/spoofing găsiți aici.
Dorim ca pe lângă download, să uploadăm fișiere prin FTP. Din rațiuni de securitate, nu se recomandă upload anonim, ci doar cu autentificare.
În directorul home al utilizatorului bogdan de pe stația host se găsește fișierul bogdan-ftp-data-3M.dat. Folosiți curl pentru a uploada acest fișier în directorul home al utilizatorului ana de pe stația red.
curl, șirul upload-file.
După ce ați realizat upload-ul, descărcați prin FTP, din directorul home al utilizatorului ana, fișierul bogdan-ftp-data-3M.dat în directorul home al utilizatorului corina de pe stația host.
Dorim să trimitem din linia de comandă mesaje cu atașament.
În contul utilizatorului bogdan creați o arhivă (în ce format doriți) a directorului /etc/init.d/. Trimiteți arhiva ca atașament într-un e-mail trimis în linia de comandă către adresa voastră.
Pentru trimiterea atașamentului, va trebui să folosiți utilitarul uuencode oferit de pachetul sharutils. Este posibil ca pachetul sharutils să fie deja instalat pe host. Dacă nu este instalat, atunci puteți folosi următoarea comandă pentru a-l instala:
root@host:~# apt-get install sharutils Reading package lists... Done Building dependency tree [...] Setting up sharutils (1:4.11-1) ...
uuencode primește două argumente cu aceeași valoare (de exemplu store.zip store.zip). Aceasta întrucât primul argument este numele fișierului care este codificat, iar al doilea argument este numele arhivei așa cum apare ea în atașament. Teoretic, este posibil să codifici un fișier și să aibă alt nume în atașament; în practică se folosește același nume, motiv pentru care apar două argumente cu aceeași valoare.
-s "<subiect>" la comanda mail pentru a preciza subiectul mesajului; înlocuiți <subiect> cu subiectul mesajului. Eticheta în Internet dictează să folosiți subiecte pentru e-mail-uri.