Laborator 10. Clienți de rețea

Cunoștințe și abilități ce vor fi dobândite

  • Identificarea porturilor deschise pe un sistem
  • Folosirea clienților de rețea în linia de comandă în Linux (netcat, wget, curl, mail)
  • Accesarea serviciilor de web, transfer de fișiere (FTP) și e-mail

Pregătire infrastructură de laborator

  • Vom rula o masină virtuală în cloud-ul facultății. Folositi imaginea RL2018.
  • Pentru a porni o astfel de masină urmăriți tutorialul de la această adresă
  • FOLOSIȚI IMAGINEA RL_2018
  • Pentru a pregăti configurația de laborator, pe mașina virtuală (stația 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:~# wget https://raw.github.com/RL-UPB/rl-lab-prepare/master/rl-lab-10-prepare
    root@host:~# chmod +x rl-lab-10-prepare
    root@host:~# ./rl-lab-10-prepare

    Comanda durează circa 20 de secunde. Lasați-o să ruleze complet.

  • Deschideți trei noi tab-uri în terminal (folosiți combinația de taste Ctrl+Shift+t), și conectați-vă, din nou, la mașina virtuală folosind comanda ssh de mai sus.
    • De pe cele trei noi tab-uri, conectați-vă la cele trei containere (red, green și blue).

Detalii rulare masina virtuala VMware local

Detalii rulare masina virtuala VMware local

  • Deschideți VMware și porniți mașina virtuală RL_lab.
  • Dorim să folosim terminalul sistemului fizic și să lucrăm peste SSH cu mașina virtuală VMware (denumită și host). În acest fel vom putea folosi copy-paste în terminal sau alte facilități. Pentru aceasta urmați pașii de mai jos:
    • Autentificați-vă în mașina virtuală folosind contul root cu parola student.
    • Aflați adresa IP a mașinii virtuale de pe interfața eth0:
      root@host:~# ifconfig eth0
    • De pe sistemul fizic, deschideți un terminal și realizați o sesiune SSH folosind:
      student@mjolnir:~$ ssh root@$ADRESA_IP_MV

      unde $ADRESA_IP_MV este adresa IP a mașinii virtuale așa cum ați obținut-o mai sus.

Pentru a vedea cum accesați stațiile red, green și blue (containere LXC configurate peste mașina virtuală VMware - stația host) urmăriți pașii de aici.

Conturile de acces la mașina virtuală (stația host) sunt (username:parola):

  • root:student
  • student:student

Topologie

Exerciții

În cadrul exercițiilor din laboratoarele de Linux vom folosi topologia de mai sus.

01. [15p] Observare porturi deschise pe o stație

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 TCP
  • l - afișează serviciile care așteaptă (listen) conexiuni
  • n - 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 prospă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:

  • creați un server care ascultă pachete UDP pe portul 2024;
  • listați serviciile care ascultă pachete UDP pe stația host;
  • porniți un client UDP și comunicați cu serverul de mai sus.

Pentru a afla ce opțiune trebuie transmisă comenzii 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.

Rezolvare
Pornim serverul:
root@host:~# netcat -u -l 2024

Afișăm sockeții UDP de la nivelul sistemului:

root@host:~# netstat -ulpn
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
udp        0      0 0.0.0.0:2024            0.0.0.0:*                           6088/netcat     
[...]

Pornim un client UDP și comunicăm cu serverul creat anterior:

root@host:~# netcat -u localhost 2024

02. [10p] Port forwarding pentru accesare serviciu web

Pe stația red este instalat un server de HTTP pe care dorim să îl accesăm din browser-ul stației 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 browser-ul web de pe fep.grid.pub.ro și accesați adresa IP a stației host pe portul 8080. Vă va apărea o pagină web cu mesajul Laboratorul 10 - pe red. Pentru a porni browser-ul pe stația fep.grid.pub.ro conectați-vă cu parametrul -X al comenzii ssh:

student@mjolnir:~$ ssh -X mihai.carabas@fep.grid.pub.ro
mihai.carabas@fep.grid.pub.ro's password:
 
[mihai.carabas@fep-62-2 ~]$ firefox

Din cadrul browser-ului pornit pe stația fep.grid.pub.ro vrem să accesăm serviciul web de pe stația red prin intermediul stației host pe care facem NAT; adică pachetele HTTP trimise de pe stația fep.grid.pub.ro către portul 8080 al stației host să ajungă pe stația red pe portul 80. Pentru aceasta, în address bar-ul din browser-ul Firefox deschis pe stația fep.grid.pub.ro scriem URL-ul http://<adresa-ip-mv>:8080/, unde <adresa-ip-vm> este adresa IP publică a mașinii, adresă pe care o putem obține din dashboard-ul OpenStack.

Rezolvare
Introducem regula de tip DNAT în lanțul PREROUTING pe stația host și validăm introducerea acestei reguli:
root@host:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.2:80
root@host:~# iptables -t nat -L PREROUTING -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   120 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:192.168.1.2:80

Accesăm URL-ul http://<adresa-ip-mv>:8080/ din browser-ul grafic (Firefox, Chrome) de pe stația fizică și apare mesajul Laboratorul 10 - pe red.

03. [10p] Accesare serviciu web folosind wget

Sunt situații în care:

  • vrem doar să descărcăm o resursă, nu să accesăm o pagină web și să o parcurgem;
  • vrem să testăm serviciul web;
  • nu avem acces la o interfață grafică (pe un server sau pe o mașină virtuală) pentru accesarea web;
  • vrem să automatizăm, într-un script, procesul de acces al unor resurse în web.

Î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.

În a doua comandă am folosit opțiunea -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.

Rezolvare
root@host:~# wget -q http://red/file.dat
root@host:~# ls -l file.dat 
-rw-r--r-- 1 root root 1024 Nov 26 18:10 file.dat

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]

04. [15p] Descărcare recursivă de resurse web

La adresa http://red/folder se află o structură de directoare și fișiere. Pe stația host, descărcați întreaga structura folosind o singură comandă wget cu parametrul corespunzător.

Pentru a identifica opțiunea corespunzătoare, căutați în pagina de manual a wget după șirul recursive.

Instalați utilitarul tree și folosiți-l petru a lista conținutul directorului 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.

Urmăriți discuția de aici. Să aveți în vedere și partea din discuția care conține șirul "without the hostname".

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
Rezolvare
Pentru descărcarea inițială folosim comanda wget cu opțiunea -r apoi instalăm și rulăm tree:
root@host:~# wget -r http://red/folder/
[...]
root@host:~# apt-get install tree
[...]
root@host:~# tree red/
[...]

Ștergem vechea structură:

root@host:~# rm -fr folder/

Ca să avem un output mai aranjat, rulăm următoarea comandă wget:

root@host:~# wget -r -nH -np --reject "index.html*" http://red/folder/

Se vor descărca astfel doar fișierele utile, cele existente în structura de directoare de pe server.

05. [5p] Accesare URL conținând caractere speciale

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 folosiți pentru a descărca 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:~#

După output-ul comenzii de mai, pentru a vă reapărea prompt-ul consolei, apăsați pe 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 prin comanda de mai sus:

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>
Rezolvare
Cel mai simplu este să plasăm întregul URL între apostroafe:
root@host:~# wget 'http://localhost/login.php?name=Lab10&email=rl@upb.ro'

Resursa de la acel URL se va descărca în mod corect:

root@host:~# cat /var/www/login.php 
<html>
<body>
 
Welcome <?php echo $_GET["name"]; ?><br>
Your email address is: <?php echo $_GET["email"]; ?>
</body>
</html>

06. [5p] Accesare de pagini web folosind curl

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.

07. [5p] Download FTP folosind curl (fără autentificare)

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
[...]

Observăm că apar multe caractere ciudate pe ecran. Anulați folosind combinația de taste Ctrl+c.

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.

Același efect ca mai sus poate fi obținut prin rularea comenzii 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]

08. [10p] Download FTP folosind curl (cu autentificare)

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.

URL-ul folosit va fi 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.

Rezolvare
Comanda de descărcare este:
root@host:~# curl -u ana:student ftp://red/ana-ftp-file-5M.dat -o ana-ftp-file-5M.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5120k  100 5120k    0     0  37.5M      0 --:--:-- --:--:-- --:--:-- 39.3M
root@host:~# ls -l ana-ftp-file-5M.dat
-rw-r--r-- 1 root root 5242880 Nov 26 20:02 ana-ftp-file-5M.dat

Comanda echivalentă wget este:

root@host:~# wget --user="ana" --password="student" ftp://red/ana-ftp-file-5M.dat
--2013-11-26 20:03:38--  ftp://red/ana-ftp-file-5M.dat
           => `ana-ftp-file-5M.dat'
Resolving red (red)... 192.168.1.2
Connecting to red (red)|192.168.1.2|:21... connected.
Logging in as ana ... Logged in!
==> SYST ... done.    ==> PWD ... done.
==> TYPE I ... done.  ==> CWD not needed.
==> SIZE ana-ftp-file-5M.dat ... 5242880
==> PASV ... done.    ==> RETR ana-ftp-file-5M.dat ... done.
Length: 5242880 (5.0M) (unauthoritative)
 
100%[======================================>] 5,242,880   --.-K/s   in 0.03s   
 
2013-11-26 20:03:38 (156 MB/s) - `ana-ftp-file-5M.dat' saved [5242880]
 
root@host:~# ls -l ana-ftp-file-5M.dat
-rw-r--r-- 1 root root 5242880 Nov 26 20:03 ana-ftp-file-5M.dat

09. [10p] Trimitere e-mail din linia de comandă

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 trei componente așa cum se întâmplă și într-un client de e-mail:

  • destinatarul
  • subiectul mesajului
  • conținutul mesajului

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 "Ender's Game"?
 
Bogdan
^D

Mesajul de mai sus a fost închis 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 "Ender's Game"?
 
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 (de preferat GMail). Verificați șî în Spam/Junk primirea mesajului.

Rezolvare
Pentru trimiterea mesajului folosim o comandă de forma
bogdan@host:~$ echo "E-mail de la RL" | mail -s "Test RL" adresa.de.email@gmail.com

10. [15p] Trimitere e-mail cu adresă personalizată din linia de comandă

La exercițiul anterior, mesajul primit apare ca sosind de la bogdan@host. Nu este foarte elegant și am vrea să-i schimbăm adresa expeditorului.

Pentru aceasta vom folosi comanda mail disponibilă în pachetul heirloom-mailx care permite această opțiune. Pentru început instalăm pachetul heirloom-mailx:

root@host:~# apt-get install heirloom-mailx
Reading package lists... Done
Building dependency tree 
[...]

Acum comanda mail va fi cea din pachetul heirloom-mailx.

Trimiteți un mesaj la adresa voastră de e-mail (de preferat GMail) astfel încât expeditorul mesajului să fie bogdan.georgescu@rl.cs.pub.ro.

Comanda mail din pachetul heirloom-mailx 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.

În forma sa simplă, protocolul SMTP nu face verificarea adresei sursă a utilizatorului. Dacă utilizatorul se conectează la Mail Transfer Agent de pe o stație considerată sigură (de exemplu chiar de pe stația locală – localhost), atunci acesta poate folosi orice adresă. Pentru autentificare se folosește SMTP cu suport SASL, care obligă autentificarea utilizatorului înainte de a folosi serviciul SMTP.

Detalii despre fenomen și prevenirea e-mail forging/spoofing găsiți aici.

Rezolvare
Folosim comanda de mai jos pentru a transmite e-mail cu adresa de e-mail sursă schimbată:
bogdan@host:~$ echo "Un nou e-mail de la RL" | mail -s "Test RL imbunatatit" -r bogdan.georgescu@rl.cs.pub.ro adresa.de.email@gmail.com

La destinatar, adresa expeditorului va fi afișată ca fiind bogdan.georgescu@rl.cs.pub.ro.

11. [BONUS - 10p] Upload prin FTP

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.

Căutați, în pagina de manual a comenzii 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.

Rezolvare
Folosim comanda de mai jos pentru a uploada fișierul bogdan-ftp-data-3M.dat prin FTP:
bogdan@host:~$ curl --user ana:student --upload-file bogdan-ftp-data-3M.dat ftp://red/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3072k    0     0  100 3072k      0  24.6M --:--:-- --:--:-- --:--:-- 26.0M

Verificăm, în contul utilizatorului ana de pe stația red că fișierul este acolo:

ana@red:~$ ls -l
total 8200
-rw-r--r-- 1 ana ana 5242880 Nov 26 19:49 ana-ftp-file-5M.dat
-rw------- 1 ana ana 3145728 Nov 26 19:52 bogdan-ftp-data-3M.dat

Apoi descărcam, prin FTP, fișierul în directorul home al utilizatorului corina de pe stația host:

corina@host:~$ curl --user ana:student ftp://red/bogdan-ftp-data-3M.dat --output bogdan-ftp-data-3M.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 3072k  100 3072k    0     0  22.6M      0 --:--:-- --:--:-- --:--:-- 23.8M
corina@host:~$ ls -l
total 3072
-rw-rw-r-- 1 corina corina 3145728 Nov 26 21:54 bogdan-ftp-data-3M.dat

12. [BONUS - 10p] Trimitere e-mail cu atașament din linia de comandă

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. Pentru aceasta trebuie să instalați pachetul sharutils:

root@host:~# apt-get install sharutils
Reading package lists... Done
Building dependency tree       
[...]
Setting up sharutils (1:4.11-1) ...

Pentru indicații legate de trimiterea de atașamente ca e-mail consulați această pagină.

În modul uzual de folosire comanda 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.

Folosiți opțiunea -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.

Afișează rezolvarea
Ascunde rezolvarea
Afișează rezolvarea
În primă fază arhivăm directorul /etc/init.d/ într-un fișier ZIP (etc-init.zip):
bogdan@host:~$ zip -qr etc-init.zip /etc/init.d/
bogdan@host:~$ ls -l etc-init.zip 
-rw-rw-r-- 1 bogdan bogdan 108215 Nov 26 22:50 etc-init.zip

Apoi, folosim comanda de mai jos pentru a trimite mesajul către o adresă externă (adresa expeditorului e schimbată în bogdan.georgescu@rl.cs.pub.ro):

bogdan@host:~$ (echo "Atasez arhiva /etc/init.d" ; uuencode etc-init.zip etc-init.zip ) | mail -s 'Arhiva /etc/init.d' adresa.de.email@gmail.com -- -f bogdan.georgescu@rl.cs.pub.ro
rl/labs/10.txt · Last modified: 2020/01/09 17:15 by octavian.grigorescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0