vendredi 14 octobre 2011

Ssh to VirtualBox

Hello, 

If you always ask yourself how to make an ssh connection to a virtualbox guest OS, this tutorial is for you. 

As you may know, VirtualBox supports NAT (Network Address Translation) as default networking mode. A virtual machine with NAT enabled acts  much like a real computer that connects to the Internet through a router. The "router", in this case, is the VirtualBox networking engine, which maps traffic from and to the virtual machine transparently. The disadvantage of NAT mode is that, much like a private network behind a router, the virtual machine is invisible and unreachable from the outside internet; you cannot run a server this way unless you set up port forwarding (described below). 

So our goal, in this to tutorial is to make virtualbox forward all the packets arriving to a certain port of the Host machine. For instance, any connection that arrives at a given TCP port (i.e. 2222) of the Host machine, will be forwarded to the TCP port 22 of the Guest Machine.

This tutorial is divided in 2 steps : 
  1. In the first step, you gonna make sure that we have a ssh server running on the guest operating system, otherwise we must install one. 
  2. In the second we are going to set up port forwarding in virtualbox.

For my experience, I used Windows 7 is the hosting system and Linux Mint as a guest. 


Let's go to the first step. We are going to make sure that ssh is already running on our guest operating system otherwise we must install the package openssh-server on the guest operating system. The process of installing a package on Linux Mint is similar in Ubuntu (or Debian) with the command : apt-get install openssh-server.

After installing the server, we are going to make some basic configuration. For that, go to the directory /etc/ssh and edit the file sshd_config (must have root access). This file contains all the configuration of our ssh server. Go the line that begins with 'PermitRootLogin'. 'PermitRootLogin' gives the possibility to connect to the server with a root user account. By default, this line is set to yes but change it to no if you dont want this possibility.


Then, launch the server with the following command : sudo service ssh start.

The second step is to enable port forwarding on the virtualbox machine. There is to 2 ways to do that : with the GUI or the commanline. But before we get into that, we must turn off the guest machine otherwise it won't work. 

If you want to use the gui, you must follow this steps : 
Open virtualbox main interface and selects your guest operation system. Mine is named mint.     
  1. Go to the network tab and selects Advanced -> Port Forwarding.
  2. Create a new rule by giving a name (ssh), a protocol (TCP), a host IP (if necessary), the host port (2222), the guest IP (also if necessary) and the host IP (22).
  3. Then save

If you want to do it with the command line, Virtualbox shifts with a command utility called VBoxManage. On windows 7, this command is on the directory C:\Program Files\Oracle\VirtualBox. You can use Windows PowerShell as a terminal and change directory by typing the cd command : cd ../../Program Files/Oracle/VirtualBox

Choose the VirtualBoxManage.exe file and type the following command :

VBoxManage.exe modifyvm "VM name" --natpf1 "ssh,tcp,,2222,,22" 

With the above command, all TCP traffic arriving on port 2222 on any host interface will be forwarded to port 22 in the guest. The protocol name tcp is a mandatory attribute defining which protocol should be used for forwarding (udp could also be used). The name ssh is purely descriptive and will be auto-generated if omitted. The number after --natpf denotes the network card, like in other parts of VBoxManage.


 Now you can relaunch your guest operating system and make sure that the ssh service is running. For isntance, you can execute the command : ps aux | grep sshd. 


If your host is a Linux machine,  you can execute the following commands  to connect to the guest OS:


ssh -l -p 2222 localhost 


or 


ssh -l -p 2222 aa.bb.cc.dd


aa.bb.cc.dd is the host IP address.


Since I am using windows, I had to download putty and puttygen and make some configuration. First, you must generate a pair of key (private/public) with puttygen. Launch puttygen and then click to the button Generate. You can also add a passphrase (not required) if you want. Copy/Paste the generated key in a txt file and saves it as client_id_dsa.pub. (the filename doesn't matter but his extension must be .pub).


Launch putty and go to the ssh category and next go to the auth category. And then upload your key (client_id_da.pub).


Then go in the Session section. And enter as hostname (or IP) : 127.0.0.1 and port 2222. Then open the connection. 


Tadaaa !!!


You can follow the same process to install other services like a web/ftp/pop/imap server, or a scm (source code management like SVN, git, bazaar), etc


Thanks for reading and don't forget to leave some comments!!


   












  




lundi 5 septembre 2011

Linux : 20 years already

For the 20 year anniversary of Linux, I decided to post 2 images that show the story and the evolution of Linux in the recent years.

lundi 15 août 2011

A Google+ joke


Retourner une valeur à partir d'un Thread

L'interface Runnable existe depuis le début de la plateforme Java et permet de créer des threads. Cette interface propose la méthode run qui ne prend aucun argument et ne retourne aucune valeur. Si on doit récupérer le résultat de calcul ou de l'exécution d'un thread, il faudrait passer par une classe intermédiaire et attendre la fin du thread pour récupérer le résultat. Par exemple :


Depuis Java 5, cela devient encore plus facile avec  l'interface Callable.  Cette interface est identique à Runnable sauf qu'elle définit la méthode call().

Cette méthode diffère de  run() en 2 points : elle peut retourner une valeur et peut lever une exception : 




Pour lancer un Callable, il faut passer l'objet Callable à un ExecutorService via la méthode submit dont voici la signature :



Comme l'implémentation des ExecutorService exécutent généralement leurs tâches de façon asynchrone, la méthode submit ne peut pas retourner le résultat de la méthode call. Elle retourne plutôt un objet de type Future qui est paramétré par le type du résultat du callable. L'objet Future est simplement une promesse de résultat dans le futur. 
 
La méthode get() de l'objet Future renvoie le résultat et sera bloqué jusqu'à ce que la tâche soit terminée. Cette méthode est équivalente à un join().
Imaginons un programme qui lance des objets Callable convertissant un String en majuscule. Voici le code : 


Chaque objet de type  StringCallable reçoit un String en paramètre et renvoie sa conversion en majuscule via la méthode call. On passe cet objet à un  ExecutorService via la méthode submit qui renvoie un objet de type Future. Pour récupérer le résultat, on utilise la méthode get().

Dans cet exemple, on a utilisé un ExecutorService pour lancer un Callable mais n'importe quel Executor fera l'affaire. Pour plus d'informations sur les Executors, je vous invite à visiter  cette page.








jeudi 11 août 2011

Java 7

Après quelques années de développement (au moins 3 ans), Oracle (anciennement Sun) a finalement sorti Java7.

Je suis actuellement en stage et je me suis demandé si ce n'était pas déjà possible d'intégrer les nouvelles fonctionalités de Java 7 dans mon projet. Opération risquée vu que je travaille sur Eclipse et que ce dernier est toujours en beta à l'heure où j'écris cet article : http://wiki.eclipse.org/JDT_Core/Java7.

Donc, j'ai décidé de tester les nouvelles fonctionalités du langage avec NetBeans qui supporte déjà toutes les fonctionalités de Java7

Donc, commencez par télécharger NetBeans.

Avant de parler des nouvelles fonctionalités du langage, j'aimerais aussi parler des ajouts au niveau de la plateforme :

  • Le support dans la JVM de langages dynamiques, telles que Groovy, Jython, JRuby, etc. L'intérêt est de faire coexister dans la JVM plusieurs langages avec la possibilité d'invoquer dynamiquement (au Runtime) du code de ces langages dans notre programme  avec invokeDynamic. Par exemple, il est possible d'invoquer invoquer du code scala ou groovy dans notre programme Java et vice-versa vu que le bytecode généré (je suppose) sera le même. J'imagine que par exemple dans un futur proche un portage de Bash sur la JVM (JBash) et exécuter un programme JBash sur Windows ou MacOsX. 
  • Une nouvelle API pour la manipulation des fichiers et une nouvelle gestion des entrées/sorties. Cette API est très intéressante et fera l'objet d'un autre article.
  • Au niveau cryptographie, le support des algorithmes de type Elliptic Curve y sont ajoutés également.
  • Il y'a aussi le support de nouveaux protocoles réseau tels que SCTP et Sockets Direct Protocol.
Pour une liste complète des fonctionalités, je vous invite à consulter la page dédiée au projet Java 7 : JDK7 Features.

Des apports ont aussi ajoutés au langage.

Switch sur des String

Actuellement, on pouvait faire un switch que sur des entiers et les enums. Maintenant il est possible de le faire sur des String

 

Possibilité de rajouter des underscores dans les entiers

Il est aussi possible de rajouter des underscores pour la lecture des chiffres assez longs. Par exemple :

 

 

Gestion automatique des ressources

Avant, pour accéder au contenu d'une ressource (File, Socket, etc), il fallait récupérer son InputStream/OutputStream dans un try-catch, accéder à son contenu et le fermer manuellement dans une clause finally. Comme ici : 

 

Maintenant, il est possible de déclarer nos ressources dans un bloc try et sa portée se limitera à ce bloc. Une fois que ce bloc est exécuté, les ressources seront fermés automatiquement : 

 

Multi-Catch

Maintenant, il est possible de rajouter plusieurs types d'exception dans un catch.
Imaginons qu'on ait ce code : 

 

 Ce code peut être réécrit de cette façon : 


Amélioration de l'inférence de type pour la création d'instances génériques

 

Avant, c'était chiant de faire ça : 

 

Mais maintenant : 

 

<> est appelé le diamond operator.

 

Binary Litterals

Avant les nombres étaient représentés uniquement en décimal, en octal et en hexadécimal. Maintenant, il est possible de représenter des nombres binaires en mettant le préfixe '0b' devant le nombre:




 

Les langages de programmation

Voici un joli slide présentant l'historique des langages de programmation. Intéressant.