El teu blog de Linux en català

Hui parlem d’una altra eina molt útil quan hem de fer múltiples connexions ssh a servidors diversos. Per exemple, nosaltres a la feina tenim projectes que tenen 6, 8 o 10 frontals. A voltes cal connectar-se a tots per fer alguna operació simultània.

mssh permet connectar-se a tots els servidors alhora i executar les comandes de forma sincronitzada sobre totes les connexions obertes.

mssh_window

Instal·lació i ús

La instal·lació de l’mssh és ràpida, el trobareu als repositoris de la vostra distribució sense haver d’afegir-ne cap altra font. A distribucions amb apt:

sudo apt-get install mssh

Una vegada que el tingueu instal·lat, ja podeu executar-lo. La forma d’executar-ho és senzilla, però sempre és recomanable un fitxer config definint les diferents connexions ssh. Per exemple, jo tinc el fitxer .ssh/config on definisc els àlies de les connexions:

Host server1 User user1 HostName 1.1.1.1 Host server2 User user2 HostName 1.2.2.2 Host server3 User user3 HostName 1.2.3.3 Host server4 User user4 HostName 1.3.4.4

D’esta manera, amb mssh, puc obrir la connexió als quatre servidors simplement executant:

mssh server{1..4}

sshpass és el tipus d’ordre que no s’hauria de fer servir en un terminal. El que fa bàsicament és permetre introduir la contrasenya directament a la mateixa línia quan fem una connexió ssh, evitant-nos així haver d’introduir-la després d’executar l’ordre ssh.

Per exemple, una connexió normal a un servidor per ssh i executar una ordre concreta:

ssh usuari@adreçaip mplayer '/media/data/musica.mp3'

I llavors (si no tenim la nostra clau pública al servidor), se’ns demanarà la contrasenya. Amb sshpass podem passar la contrasenya directament:

sshpass -pcontrasenya ssh -o StrictHostKeyChecking=no usuari@adreçaip mplayer '/media/data/musica.mp3'

Una setmana més amb moltes novetats, destacant la versió alfa de Chakra 0.7, que inclou la primera beta de KDE 4.6 (es publicarà al gener) i la primera alfa de l’Ubuntu 11.04, que ja inclou Unity com a interfície per defecte. I a més…

A la feina normalment hem de connectar-nos als servidors mitjançant SSH. A més, no és només un servidor, sinó que en tenim 4 o 5. Des de GNU/Linux tenim diferents formes de connectar-nos, la més clàssica és fer-ho per terminal amb l’ordre:

ssh usuari@servidor -port

També hi ha altres formes, com fer servir clients com el Filezilla, que ens permet crear connexions SSH i navegar com si ho estiguérem fent per un servidor FTP. Entre els ginys del tauler del GNOME també és possible trobar-ne un anomenat Connecta al servidor que també ens donarà l’opció de connectar a un servidor SSH i navegar com si ho férem a un servidor FTP.

Ara bé, la connexió per terminal ens permet fer infinites coses més, ja que en realitat entrem a la màquina i actuem com si fórem un usuari més. Quan cada dia hem de connectar-nos a diferents servidors en mode terminal, el més útil i ràpid és fer servir el giny SSH menu del gnome: permet configurar diferents servidors SSH i connectar-nos a ells amb un sol clic (en fer clic s’obri un terminal).

La gran part de les distros el tenen als seus repositoris. Només heu de cercar per sshmenu. A Debian i Ubuntu:

sudo apt-get install sshmenu-gnome

Una volta instal·lat, només cal fer clic amb el botó dret sobre el tauler del gnome i després sobre Afegeix al quadre… Cerqueu per SSH menu Applet i afegiu-lo al tauler.

SSH Menu applet als ginys del tauler

Ara cal configurar els diferents servidors SSH que tinguem. Per a això, feu clic sobre el giny i seleccioneu Preferences. Allà haureu d’afegir un nou host amb les dades del mateix. Un cop creat, vos apareixerà l’opció de connectar-vos al servidor quan feu clic sobre el giny, de forma que s’obrirà un terminal on se us demanarà la contrasenya (si hi ha). Com podeu veure, això és molt còmode quan treballeu amb molts servidors alhora.

Configuració i connexió al servidor ssh

Un cop hem après a executar comandes de forma segura en un ordinador remot, ens falta veure com executar programes que tinguin interfície gràfica. Havent llegit l’anotació aquesta és força senzilla, perquè només cal afegir el paràmetre “-X” al programa ssh.

Això ens pot servir, per exemple, si volem jugar en un ordinador on no el tenim instal·lat, al Secret Maryo Chronicles, sempre i quan estigui instal·lat en l’ordinador que ens farà de servidor. O també si volem executar una còpia de seguretat dels fitxers del servidor per mitjà del Grsync que té instal·lat. Per a fer aquest segona opció, des del nostre ordinador client executem la comanda següent:

ssh -X usuari_servidor@ip_servidor grsync

En executar aquesta comanda, se’ns obrirà una finestra del Grsync. És important saber que el programa realment s’està executant en el servidor, però que aquest l’està mostrant per la pantalla del client, en comptes de la seva pròpia pantalla. És a dir, aquest programa consumeix la memòria i la cpu del servidor. A més, el servidor “encripta” la pantalla a mostrar i ens l’envia per la xarxa. El nostre ordinador client, l'”únic” que fa és desencriptar-la i mostrar-la.

O sigui, que aquest mètode carrega molt el servidor, sobretot depenent del programa que executem, perquè a més d’executar el programa en sí, ha d’anar encriptant en temps real les pantalles que ens ha d’enviar. Si l’ordinador al que us connecteu no és molt potent, aquest no és el mètode més adient per a executar remotament alguns programes “gràficament potents”.

Per exemple, amb l’ordinador que jo estic utilitzant de servidor, que té uns 6 anys, i està força desfasat, no tinc cap problema per executar remotament el Grsync, però l’execució remota del Secret Maryo Chronicles el satura. Amb ordinadors més nous, es pot fer sense problemes.

Fins ara, hem après algunes eines que formen part de ssh i que ens permetien, per mitjà d’una connexió xifrada, copiar fitxers amb scp o navegar pels directoris remots amb sftp. En aquesta anotació veurem com connectar-nos des d’un terminal del nostre ordinador a l’equip remot, de manera que totes les comandes que executem es faran en el servidor.

Això ens serà molt útil en entorns empresarials, on tenim diversos servidors, i no podem anar a treballar físicament en cadascun d’ells, perquè potser estan en diverses ubicacions, o en CPDs. En entorns domèstics, on els ordinadors són molt més propers, segurament la seva utilitat és més limitada, però no descartable.

Per a connectar-nos des d’un terminal a un ordinador remot (com hem comentat en articles anteriors, ha de tenir instal·lat el paquet “openssh-server”), cal executar la comanda següent:

ssh usuari_servidor@ip_servidor

Aquesta comanda ens connectarà directament amb el servidor si hem configurat correctament la connexió a través de clau pública+clau privada. En cas contrari, ens demanarà la paraula de pas de l’usuari en el servidor.

Un cop establerta la connexió, totes les comandes que escrivim en aquest terminal seran executades en el servidor, i aquest ens mostrarà la resposta de les comandes a través del mateix terminal des del que estem connectat. És a dir, és com si, en el terminal, estiguéssim connectats de forma local en el servidor i, per tant, veurem la seva estructura de directoris i els seus fitxers, però no els “nostres”. Per a tancar la connexió amb el servidor, només cal executar en el mateix terminal l’ordre següent:

exit

Una altra opció que tenim amb ssh és la d’executar-hi una comanda qualsevol, però sense mantenir la connexió establerta un cop s’acabi l’ordre. Això es pot fer amb la comanda següent:

ssh usuari_servidor@ip_servidor "ordre_a_executar_al_servidor"

Aquesta comanda executa l’ordre indicada en el servidor. El servidor ens retorna la resposta de la comanda i, un cop acabada, tornem a tenir el terminal desconnectat del servidor (de forma que no cal executar “exit” per a desconnectar-nos).

De moment, tal i com ho hem vist fins ara, només podrem executar comandes del servidor que no tinguin interfície gràfica (si ho provem, ens donarà l’error “no display specified“). En la propera anotació veurem com executar programes de l’ordinador remot que tinguin interfície gràfica.

Fins avui, hem vist un parell d’eines que permeten la connexió segura entre dues màquines a través del protocol ssh (en el cas de Linux, l’estem fent amb la implementació lliure openssh). Els dos programes que hem vist fins ara, i que formen part del grup d’eines de ssh són el scp i el sftp (totes dues ens servien per a copiar fitxers de forma segura entre equips). El protocol ssh funciona amb una arquitectura client-servidor. És a dir, hi ha un ordinador (el client) des del qual ens connectem a un equip remot (el servidor). Com vam veure en l’anotació del sftp, a la majoria de distribucions hi ha instal·lat el client ssh (per a poder-nos connectar amb altres equips per mitjà de ssh), però no el servidor, i per tant, hem d’instal·lar el paquet “openssh-server” en aquells equips on volem acceptar connexions d’altres ordinadors (els servidors).

Logo d'OpenSSH

A l’hora d’identificar-nos en el servidor, ssh preveu dos mètodes bàsics. El primer és el que hem vist fins ara: ens intentem connectar, i el servidor ens demana l’usuari i la contrasenya. El segon mètode és el que mostrarem en aquesta anotació: emprar l’infrastructura de clau pública i clau privada. Bàsicament, el que farem és, en el client, generar un parell de claus: una de privada, que ens quedarem per a nosaltres, i una altra de pública, que enviarem als equips als quals ens vulguem connectar per tal que puguin desxifrar el que els enviem. L’avantatge d’això és que, un cop el servidor accepti la nostra clau pública, no haurem d’entrar mai la contrasenya de l’usuari de connexió.

Per a generar el nostre parell de claus (pública + privada), hem d’executar la comanda següent des d’un terminal de l’ordinador client:

ssh-keygen

Si premem [Enter] a totes les preguntes que ens faci el programa, ens generarà dos fitxers en el propi equip client, tots dos en el directori /home/el_nostre_usuari/.ssh:

  • id_rsa: És la nostra clau privada. L’hem de deixar tal qual.
  • id_rsa.pub: És la clau pública. La passarem a l’equip que faci de servidor.

Ara, hem de copiar la nostra clau pública a l’ordinador que ens fa de servidor. Podem aprofitar el propi programa scp, executant des d’un terminal en l’equip client:

scp /home/el_nostre_usuari/.ssh/id_rsa.pub usuari_servidor@ip_servidor:id_rsa.pub

Aquesta comanda ens demanarà la paraula de pas de l’usuari del servidor (perquè encara no hi tenim acceptada la nostra clau). Aquesta ordre ens haurà deixat la nostra clau pública al directori /home/usuari_servidor. Per tal que el servidor accepti aquesta clau, només cal afegir el contingut de la clau pública al final del fitxer authorized_keys del servidor. O sigui que, en el servidor, i des d’un terminal, executem la comanda següent:

cd /home/usuari_servidor
cat id_rsa.pub >> .ssh/authorized_keys

I ja ho tenim. A partir d’ara, quan des de l’equip client utilitzem qualsevol programa que formi part del grup d’eines de ssh (com el scp, el sftp i alguna altra que veurem en anotacions futures), com a destí només caldrà posar “usuari_servidor@ip_servidor“, i en cap moment ens demanarà la seva contrasenya, perquè s’acceptarà automàticament. Per exemple, ens podrem connectar via sftp amb les comandes següents:

sftp://usuari_servidor@ip_servidor

En cap moment ens demanarà la contrasenya de l’usuari. És més, si el nom d’usuari del client i del servidor són el mateix, nomès caldrà posar “ip_servidor” (en el cas de sftp, serà “sftp://ip_servidor“).

En anotacions posteriors veurem altres coses que podem fer amb les eines del paquet ssh.

Fa unes setmanes, el Pol ens va explicar com copiar fitxers des de terminal de forma segura a un ordinador remot. Avui veurem com navegar, també de forma segura, per les carpetes i fitxers d’un equip remot, de manera que hi treballarem com si fos un directori propi, i hi podrem copiar dades, visualitzar documents, o el que més ens interessi.

El primer que necessitem és instal·lar el servidor ssh en l’equip al qual ens volem connectar (això també era necessari en l’scp que ens va presentar el Pol). Això es pot fer a través del paquet “openssh-server”, que tenim disponible directament des dels repositoris oficials de la majoria de distribucions. En el cas d’Ubuntu, el podem instal·lar directament des del Synaptic o, si ho preferim, des d’un terminal:

sudo apt-get install openssh-server

D’aquest ordinador remot, apart, necessitem saber la seva adreça ip. Podem conèixer-la executant-hi la comanda següent:

ifconfig | grep "inet addr"

Aquesta comanda ens retornarà dues adreces ip: la 127.0.0.1 i una altra. Ens interessa l’altra. 🙂

Un cop instal·lat el servidor en la màquina remota, en el nostre equip local obrim un Nautilus (o l’explorador de fitxers que utilitzem habitualment) i, en la barra d’adreces escrivim el següent:

sftp://adreça_ip_remota

Amb aquesta comanda, el primer cop que ens connectem ens demanarà confirmació. Acceptem, i després ens demanarà l’usuari i constrasenya amb què ens volem connectar.

El servidor remot ens demana l'usuari de connexió

El servidor remot ens demana l'usuari de connexió

Un cop entrades, ja hi estarem connectats, i ens podrem moure pels seus directoris com si fos la nostra màquina local. Com sabrem si estem veient els nostres directoris o els remots? Doncs, perquè a la barra d’adreces el nostre directori actual començarà per “sftp://adreça_ip_remota” si estem veient els directoris remots.

Nautilus amb la connexió a l'equip remot

Nautilus amb la connexió a l'equip remot

Apart d’això, si us fixeu en la captura anterior, a la barra lateral del Nautilus tindrem un accés directe a aquest equip remot, com si fos un dispositiu que hàgim connectat, del qual ens podrem desonnectar també com si desmuntéssim un dispositiu.

Amb aquesta connexió, com he comentat abans, podrem copiar fitxers d’un equip a l’altre, obrir els documents remots, copiar carpetes, o el que més ens interessi. A més, com que estem utilitzant la infrastructura ssh, totes les dades viatjaran xifrades.

Per últim, només volia comentar que el programa sftp també es pot invocar des d’un terminal, de la mateixa manera que ho hem fet des del Nautilus.

Avui fent projecte m’han ensenyat una cosa ben útil que no sabia que es podia fer: Obrir un display X11 a través d’ssh, és a dir, disposar d’entorn gràfic al executar aplicacions remotes.

Encara desconec com s’ha d’establir el servidor, però haig d’utilitzar el matlab i només cal executar

ssh -X nomusuari@nomservidor

i quan llances el matlab des del servidor, voilà! Una aplicació remota. Molt pràctic! Si em munto quelcom semblant al servidor ho postejo!