This is an old revision of the document!
puccini
.
În sala EG306, mașina virtuală se află pe pe partiția de 10 GB.
În sala EG106, imaginea de mașină virtuală se află la /mnt/unfrozen/uso/mv/puccini-lab7.ova
.
Credențialele de autentificare în cadrul mașinii virtuale sunt:
student
student
Telnet (TELetype NETwork) este un serviciu de tip client-server. In mod implicit nu există nicio diferență între resursele disponibile unui utilizator ce rulează un interpretor local și unul ce rulează prin telnet. Pentru a iniția o conexiune folosim comanda telnet
. Trebuie să specificăm adresa stației unde dorim să ne conectăm și pe această stație trebuie să ruleze un server de telnet.
La mașina virtuală puccini
ne conectăm folosind IP-ul 192.168.56.101
. Pe ea rulează un server de telnet
student@uso:~$ telnet 192.168.56.101 Trying 192.168.56.101... Connected to 192.168.56.101. Escape character is '^]'. Ubuntu 14.04.1 LTS puccini login: student Password: Last login: Sun Aug 2 13:45:53 EEST 2015 from 192.168.56.1 on pts/1 Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic i686) * Documentation: https://help.ubuntu.com/ student@puccini:~$ student@puccini:~$ student@puccini:~$ pwd /home/student
SSH (Secure Shell) este un serviciu de acces la distață securizat. Funcționează similar cu telnet dar, spre deosebire de acesta, toată comunicația este criptată. Din această cauză este serviciul pe care îl veți folosi cel mai des atunci când va trebui să lucrați pe o stație la distanță. Comanda pentru a iniția o conexiune este ssh
. Ea primeste un argument de forma user@host
, unde user
este numele utilizatorului drept care dorim să ne autentificăm și host
este adresa stației pe care dorim să ne autentificăm.
student@uso:~$ ssh student@192.168.56.101 student@192.168.56.101's password: Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-39-generic i686) * Documentation: https://help.ubuntu.com/ Last login: Sun Aug 2 14:01:44 2015 from 192.168.56.1 student@puccini:~$ student@puccini:~$ student@puccini:~$ pwd /home/student student@puccini:~$
Deși nu este un serviciu de conexiune la distanță vom începe cu netcat. Acest serviciu permite crearea de conexiuni între două mașini. Prin aceste conexiuni pot apoi circula date, aceste date fiind o conversație, rezultatul unei comenzi sau conținutul unui fișier. Pentru a folosi netcat pentru a crea o conexiune între două mașini vom rula comanda nc
pe ambele mașini. Serviciul este unul de tip client-server deci una dintre mașini va avea rolul de client (va transmite date) iar cealaltă de server (va asculta după conexiuni și date noi).
Pentru a porni netcat în modul de transmisie vom rula o comandă de tipul nc 192.168.0.1 1234
, unde 192.168.0.1
este adresa IP a mașini căreia dorim să îi transmitem date, iar 1234
este portul pe care să transmită (poate fi orice număr dar unele porturi sunt deja folosite, și nu pot fi folosite și de netcat). Comanda va prelua date la intrarea standard si le va transmite destinației pe portul specificat până când întâlnește simbolul EOF
(end-of-file, poate fi generat prin combinația de taste CTRL+d
).
<
) sau rezultatul altei comenzi (printr-un pipe, |
).
Pentru a porni netcat în modul de ascultare vom rula o comandă de tipul nc -l 1234
, unde argumentul -l
specifică pornirea în starea de ascultare iar 1234
este portul pe care să asculte. Comanda va asculta pe portul respectiv până la întâlnirea simbolului EOF
.
Să vedem un exemplu de comunicație între mașina gazdă (calculatorul din EG306/EG106) și mașina virtuală puccini
.
Pe puccini
vom porni un server de netcat
:
student@puccini:~$ netcat -l 4444
Deși nu pare că face nimic, puccini
ascultă pe portul 4444
după mesaje. Să îi trimitem unul:
student@eg306:~$ nc 192.168.56.101 4444 tosca [CTRL+d]
Mergem din nou pe terminalul deschis din puccini
și observăm că am primit tosca
. Puteam face și direct trimiterea, folosind pipe-uri:
student@eg306:~$ echo "tosca" | nc 192.168.56.101 4444
Prin netcat
putem transfera conținutul unor fișiere text tot folosind pipe-uri:
student@puccini:~$ netcat -l 4444
student@eg306:~$ cat song.txt nessun dorma student@eg306:~$ cat song.txt | nc 192.168.56.101 4444
student@puccini:~$ netcat -l 4444 nessun dorma
Până acum am folosit servicii de rețea pentru a transforma informații sub formă de mesaje, comenzi sau rezultatul acestora. Putem să le folosim și pentru a transfera fișiere. Probabil cel mai cunoscut dintre aceste servicii este BitTorrent (există și transmission-cli
pentru download torrente în linia de comandă).
Acest utilitar ofera suport pentru a descărca pagini și fișiere folosind două protocoale foarte comune, HTTP (HyperText Transfer Protocol) și FTP (File Transfer Protocol). Comanda pentru a-l folosi este wget
, căreia îi vom transmite ca argument URL-ul (Universal Resource Locator) resursei pe care dorim să o descărcăm.
student@uso:~$ wget http://ocw.cs.pub.ro/courses//res/sigla_uso.png [...] 100%[=============================>] 44.091 --.-K/s in 0,08s 2014-11-18 01:29:52 (524 KB/s) - ‘sigla_uso.png’ saved [44091/44091] student@uso:~$ wget ftp://swarm.cs.pub.ro/exec.zip [...] 100%[=============================>] 13.961.705 636KB/s in 21s 2014-11-18 01:32:33 (635 KB/s) - ‘exec.zip’ saved [13961705]
Descărcarea are loc în mod neinteractiv ceea ce face ca acest utilitar să poată fi folosit eficient în script-uri.
SCP (Secure CoPy) este un utilitar ce permite transferul de fișiere între stațiile din rețea. El folosește ssh pentru a transfera datele deoarece acesta oferă deja suport pentru autentificare și criptare. Pentru a putea fi folosit pe stația remote trebuie să ruleze un server ssh.
Comanda pentru a folosi acest utilitar este scp
. Sintaxa este asemănătoare comenzii cp
: scp sursă destinație
. Diferența este că oricare sau ambele dintre sursă
și destinație
pot referi fișiere sau directoare ce se află pe o altă stație decât cea pe care introducem comanda. În cazul în care vrem să referim un fișier de pe o altă statie trebuie să prefixăm calea către acel fișier cu user@host:
, unde, la fel ca în cazul lui ssh
, user
este numele utilizatorului drept care dorim să ne autentificăm și host
este adresa IP a stației pe care dorim să ne autentificăm.
user@host:
versus user@host
(fără 2 puncte la final). Dacă folosim ca destinație a doua nu se va face nici un transfer remote, ci va fi creat un fișier cu numele user@host
.
Exemple:
student@uso:~$ scp ~/foo.txt student@192.168.56.101:~/ student@192.168.0.114's password: foo.txt 100% 0 0.0KB/s 00:00
student@uso:~$ scp student@192.168.56.101:~/bar.txt . student@192.168.0.114's password: bar.txt 100% 0 0.0KB/s 00:00
Sistemul fizic se referă la sistemul fizic din sala de laborator (rulând Ubuntu GNOME 16.04), în vreme ce mașina virtuală se referă la mașina virtuală puccini
pornită prin VirtualBox.
Deschideți VirtualBox și importați fișierul puccini-lab7.ova
.
virtualbox
. Fie folosiți Alt+F2
și tastați virtualbox
. Fie porniți virtualbox de pe Desktop. Fie folosiți comanda virtualbox
în linia de comandă.File -> Import Appliance
pentru a ajunge la interfața de import.
Avem nevoie de o interfață host-only. E posibil ca atunci când importâm mașina virtuală să primim eroarea Invalid settings detected
. Soluția este că trebuie să adăugăm o interfață virtuală de rețea care să conecteze sistemul fizic de mașina virtuală. Aceasta se face astfel:
Din VirtualBox mergem la File
–> Preferences
–> Network
. Mergem la tab-ul Host-only Networks
și apăsăm butonul de add. Urmăriți detalii în poza de mai jos:
Observați că s-a adăugat o nouă interfață vboxnet0
.
Vrem să ne conectăm la un sistem la distanță; alegem sistemul fep.grid.pub.ro
.
Conectați-vă de pe sistemul fizic prin SSH la stația fep.grid.pub.ro
. Numele utilizatorului pe care trebuie să îl folosiți este numele utilizator vostru pe cs.curs.pub.ro
. Spre exemplu, dacă numele utilizatorul de pe cs.curs.pub.ro
ar fi ion.popescu
atunci comanda ar fi ssh ion.popescu@fep.grid.pub.ro
.
[ion.ionescu@fep-62-1 ~]
fep.grid.pub.ro
deconectați-vă folosind comanda exit
sau combinația de taste Ctrl+d
.
După rularea comenzii promtp-ul va reveni la valoarea cunoscută, specifică mașinii fizice, adică va avea forma:
student@asgard:~$
puccini
student@puccini:~$ echo 127.0.0.1 puccini | sudo tee -a /etc/hosts
Pentru a lucra mai ușor, dorim să ne conectăm prin SSH la mașina virtuală.
Pentru început, faceți configurările necesare pe mașina virtuală astfel încât sa că puteți conecta prin SSH de pe sistemul fizic.
Pentru a verifica dacă serviciul SSH rulează folosi comanda
sudo service ssh status
Pentru a opri, porni și reporni seriviciul de SSH folosiți comenzile
sudo service ssh stop sudo service ssh start sudo service ssh restart
În mod generic, folosiți comenzi de forma
sudo service <service-name> status sudo service <service-name> stop sudo service <service-name> start sudo service <service-name> restart
pentru a afla informații despre, sau pentru a opri, porni sau reporni serviciul identificat de <service-name>
. Exemple sunt ssh
, postfix
, apache2
, cron
și altele, depinzând ce servicii sunt instalate și configurate pe sistemul vostru.
Acum, cu serverul SSH pornit pe mașina virtuală, conectați-vă la mașina virtuală.
ip address show dev eth1
Dacă a reușit conectarea prin SSH prompt-ul va fi schimbat într-un prompt de forma
student@puccini:~$
După ce vă conectați prin SSH la mașina virtuală deconectați-vă folosind comanda exit
sau combinația de taste Ctrl+d
.
Acum că avem acces prin SSH la mașina virtuală, dorim să nu mai trebuiască să ne introducem parola atunci când deschidem o noua conexiune. Pentru aceasta va trebui să stabilim o autentificare bazată pe chei. Primul pas este să generăm o pereche de chei SSH pe sistemul fizic.
apropos
(vedeți laboratorul 2). Pentru a găsi comanda dorită folosiți comanda
apropos ssh
Comanda pe care o căutați sigur are legătura cu authentication
și key
*wink*. Dacă ați găsit comanda, când o apelați nu trebuie să specificați niciun parametru.
Pentru a verifica generarea cu succes de chei, folosiți comanda de mai jos. Ar trebui să obțineți un output similar:
student@asgard:~$ ls ~/.ssh/ id_rsa id_rsa.pub
Am reușit să generăm o pereche de chei pentru autentificare prin SSH. Această pereche este formată dintr-o cheie publică și una privată. Pentru a ne putea autentifica fără a mai introduce parola trebuie să ne instalăm cheia publică de pe sistemul fizic.
Ne propunem să copiem cheia publică SSH de pe sistemul fizic pe mașina virtuală.
ssh-copy-id
. Comanda ssh-copy-id
copiază cheia la distanță, pe sistemul pe care vreți să vă autentificați.
Sintaxa ei este asemănătoare cu cea a comenzii ssh
, adică este urmată de o construcție de forma <username>@<IP>
, unde <username>
este numele utilizatorului iar <IP>
este adresa IP a sitemului de la distanță.
În cazul de față veți folosi comanda ssh-copy-id
pe sistemul fizic pentru a copia cheia la distanță, pe mașina virtuală, folosind o comandă de foma
ssh-copy-id student@<IP-VM>
unde <IP-VM>
este adresa IP a mașinii virtuale.
ssh-add
După ce ați copiat cheia, conectați-vă la mașina virtuală folosind o comandă de forma ssh student@<IP-VM>
, unde <IP-VM>
este adresa IP a mașinii virtuale. Dacă ați configurat cum trebuie, ar trebui să vă conectați la mașina virtuală fără parolă.
-i
. De exemplu, ssh -i private_key student@172.16.14.133
.
Pe sistemul fizic, folosind utilitarul curl
și site-uri precum http://checkip.dyndns.org sau http://ipecho.net/plain sau http://icanhazip.com/, determinați, folosind linia de comandă, adresa voastră IP publică.
cut
, sed
, awk
etc.).
[0.5p] Creați un script care descarcă fișierul acesta, însă doar dacă el nu există deja în directorul curent.
O comandă ce returnează un cod de eroare în cazul în care fișierul trimis ca parametru nu există este comanda ls
iar pentru a executa o comandă doar dacă cea precedentă s-a terminat cu eșec înlănțuim cele două comenzi prin operatorul ||
.
[0.5p] Extindeți script-ul creat la exercițiul anterior astfel încât la fiecare rulare a scriptului fișierul respectiv să fie copiat în directorul home
al utilizatorului student
de pe mașina virtuală.
scp
.
chmod a+x <nume-script>
unde <nume-script>
este numele scriptului pe care l-ați creat.
Ne propunem să descărcăm acest fișier din linie de comandă. Din păcate dacă dăm direct wget
vom observa următoarea eroare:
student@uso:~$ wget http://repository.grid.pub.ro/cs/uso/USO-Mint-VM.ova.torrent --2015-08-02 14:42:20-- http://repository.grid.pub.ro/cs/uso/USO-Mint-VM.ova.torrent Resolving repository.grid.pub.ro (repository.grid.pub.ro)... 141.85.241.53 Connecting to repository.grid.pub.ro (repository.grid.pub.ro)|141.85.241.53|:80... connected. HTTP request sent, awaiting response... 401 Authorization Required Username/Password Authentication Failed.
Găsiți o modalitate prin care putem descărca fișierul autentificându-ne folosind credențialele de pe cs.curs.pub.ro
. Nu dați parola în linie de comandă. Hint man wget, ask-password
sau căutați pe Google după wget secure password
.
rtorrent
. Îl putem instala folosind comanda
student@midgard:~$ sudo apt-get install rtorrent
Folosiți Transmission
în linie de comandă pentru a descărca mașina virtuală pentru quest-ul final WoUSO din 2014, de aici. Este vorba de fișierul numit WoUSOv8-Final-Quest.ova.torrent
. Descărcați fișierul WoUSOv8-Final-Quest.ova.torrent
în /home/student/Downloads/
, folosind wget
.
.torrent
folosind wget
urmați pașii:
WoUSOv8-Final-Quest.ova.torrent
.Copy link location
(sau similar pentru browserul vostru)./home/student/Downloads/
,wget
și un caracter spațiu.Shift+Insert
pentru a face paste la link-ul copiat (link-ul către fișierul .torrent
).
.torrent
decât cel folosit la exercițiul anterior: 6. Descărcarea automată a unui fișier prin autentificare (1p).
Apoi folosiți rtorrent
pentru a descărca conținutul torrent-ului indicat de fișierul WoUSOv8-Final-Quest.ova.torrent
.
puccini
Deschideți un editor text și creați fișierul index.html
având următorul conținut:
HTTP/1.1 200 OK Date: Fri, 31 Dec 1999 23:59:59 GMT Content-Type: text/html Content-Length: 258 <html> <head> <title>USO Rulz</title> </head> <body> <h1>Yep, USO Rulz</h1> <h2>Subheading problems?</h2> <p>Sample paragraph text. It works!</p> </body> </html>
Pe mașina virtuală puccini
porniți un server web folosind netcat
pe portul 8888 astfel încât deschizând un browser la adresa http://192.168.56.101:8888
să vedem rezultatul HTML-ului de mai sus.
Pentru încă 1 karma point îmbunătățiți serverul astfel încât să servească permanent (netcat
listener-ul să nu fie închis după ce a deschis cineva pagina în browser).
index.html
, cel mai bine folosiți ca editor gedit
.