netcat
, wget
, curl
, mail
)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 clients
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.