Montare un filesystem in remoto può essere molto comodo, perché permette di lavorare sui file della macchina remota come se si fosse in locale. Per farlo ci sono molte possibilità, come NFS o Samba, ma quasi sempre queste soluzioni hanno bisogno di configurazioni sia sul client che sul server, inoltre, la gestione degli utenti e delle password sono spesso faticosi, con ripercussioni non indifferenti sulla sicurezza.
Qualsiasi utente Linux conosce OpenSSH, un insieme di programmi che permettono il trasferimento di file e sessioni crittografate in una rete di computer usando il protocollo SSH. La semplicità d'uso di questo software è stupefacente: basta infatti possedere un account di sistema sulla macchina remota per lavorarvi in tutta sicurezza.
Oggi, grazie a shfs (ssh-file-system), un modulo del kernel Linux, è possibile usare questo protocollo per montare un filesystem remoto, senza che sia necessario impostare preventivamente la macchina server[1].
L'installazione su Debian Sarge non presenta grandi difficoltà. Una volta accreditati come root è suffiente installare qualche pacchetto.
sancho:~# apt-get install shfs-source shfs-utils module-assistant
Durante l'installazione vi verrà chiesto se volete permettere via SUID agli utenti di usare shfsmount, e quindi permettergli di montare filesystem remoti via SSH: a voi la scelta!
Ottenuti e installati i pacchetti è necessario costruire il modulo, per farlo però è necessario disporre dei kernel-headers giusti, che possono essere scaricati e installati attraverso dselect.
sancho:~# module-assistant build shfs
L'output del comando dovrebbe essere simile a:
Extracting the package tarball, /usr/src/shfs.tar.bz2 modules/ modules/shfs/ modules/shfs/Linux-2.4/ modules/shfs/Linux-2.4/Makefile modules/shfs/Linux-2.4/dcache.c modules/shfs/Linux-2.4/dir.c modules/shfs/Linux-2.4/fcache.c modules/shfs/Linux-2.4/file.c modules/shfs/Linux-2.4/inode.c modules/shfs/Linux-2.4/ioctl.c modules/shfs/Linux-2.4/kernel-config.diff modules/shfs/Linux-2.4/proc.c modules/shfs/Linux-2.4/proc.h modules/shfs/Linux-2.4/shell.c modules/shfs/Linux-2.4/shfs.h modules/shfs/Linux-2.4/shfs_debug.h modules/shfs/Linux-2.4/shfs_fs.h modules/shfs/Linux-2.4/shfs_fs_i.h modules/shfs/Linux-2.4/shfs_fs_sb.h modules/shfs/Linux-2.4/symlink.c modules/shfs/Linux-2.6/ modules/shfs/Linux-2.6/Makefile modules/shfs/Linux-2.6/dcache.c modules/shfs/Linux-2.6/dir.c modules/shfs/Linux-2.6/fcache.c modules/shfs/Linux-2.6/file.c modules/shfs/Linux-2.6/inode.c modules/shfs/Linux-2.6/ioctl.c modules/shfs/Linux-2.6/kernel-config.diff modules/shfs/Linux-2.6/proc.c modules/shfs/Linux-2.6/proc.h modules/shfs/Linux-2.6/shell.c modules/shfs/Linux-2.6/shfs.h modules/shfs/Linux-2.6/shfs_debug.h modules/shfs/Linux-2.6/shfs_fs.h modules/shfs/Linux-2.6/shfs_fs_i.h modules/shfs/Linux-2.6/shfs_fs_sb.h modules/shfs/Linux-2.6/symlink.c modules/shfs/Makefile modules/shfs/debian/ modules/shfs/debian/changelog modules/shfs/debian/compat modules/shfs/debian/control modules/shfs/debian/control.modules.in modules/shfs/debian/copyright modules/shfs/debian/rules modules/shfs/debian/shfs-module-_KVERS_.postinst.modules.in Done with /usr/src/shfs-module-2.6.8-2-386_0.35-2+2.6.8-16sarge1_i386.deb .
Ora è necessario installare il modulo che può essere fatto in due modi diversi, sempre con module-assistant
sancho:~# module-assistant install shfs
oppure con dpkg.
sancho:~# cd /usr/src sancho:/usr/src# dpkg -i shfs-module-2.6.8-2-386_0.35-2+2.6.8-16sarge1_i386.deb Selecting previously deselected package shfs-module-2.6.8-2-386. (Reading database ... 30906 files and directories currently installed.) Unpacking shfs-module-2.6.8-2-386 (from shfs-module-2.6.8-2-386_0.35-2+2.6.8-16sarge1_i386.deb) ... Setting up shfs-module-2.6.8-2-386 (0.35-2+2.6.8-16sarge1) ...
Per essere certi che il modulo sia attivato al boot della macchina:
sancho:~# echo 'shfs' >> /etc/modules
Una delle peculiarità di shfs è che potete montare qualsiasi albero di filesystem sulla macchina remota. Ad esempio potreste montare la root (e avere a disposizione tutto l'albero), oppure una particolare directory, come /var/www, o ancora la $HOME dell'utente ~/.
Ecco un esempio, montiamo l'intero filesystem del host Openclose.it come utente, questa macchima ha sshd che punta alla porta 6456.
sancho:~# mkdir -p /mnt/openclose sancho:~# shfsmount -P 6456 -s -p gandu@openclose.it:/ /mnt/openclose Password: sancho:~# ll /mnt/openclose total 134 drwxr-xr-x 2 root root 4096 2006-03-29 18:28 bin drwxr-xr-x 3 root root 4096 2006-03-29 18:33 boot lrwxrwxrwx 1 root root 11 2005-07-05 14:00 cdrom -> media/cdrom drwxr-xr-x 11 root root 24576 2005-09-14 14:00 dev drwxr-xr-x 66 root root 4096 2006-04-04 22:51 etc drwxrwsr-x 4 root root 4096 2005-07-05 14:00 home drwxr-xr-x 2 root root 4096 2005-07-05 14:00 initrd lrwxrwxrwx 1 root root 27 2005-07-05 14:00 initrd.img -> boot/initrd.img-2.6.8-2-386 drwxr-xr-x 8 root root 4096 2005-07-05 14:00 lib drwxr-xr-x 2 root root 49152 2005-07-05 14:00 lost+found drwxr-xr-x 4 root root 4096 2005-07-05 14:00 media drwxr-xr-x 2 root root 4096 2004-12-15 13:00 mnt drwxr-xr-x 2 root root 4096 2005-07-05 14:00 opt dr-xr-xr-x 49 root root 0 2005-08-03 14:00 proc drwxr-xr-x 12 root root 4096 2006-04-27 17:17 root drwxr-xr-x 2 root root 4096 2006-03-29 18:28 sbin drwxr-xr-x 2 root root 4096 2005-07-05 14:00 srv drwxr-xr-x 9 root root 0 2005-08-03 14:00 sys drwxrwxrwt 2 root root 4096 2006-04-29 20:12 tmp drwxr-xr-x 12 root root 4096 2005-07-05 14:00 usr drwxr-xr-x 13 root root 4096 2005-07-05 14:00 var lrwxrwxrwx 1 root root 24 2005-07-05 14:00 vmlinuz -> boot/vmlinuz-2.6.8-2-386 sancho:~#
Ovviamente ci siamo loggati come gandu, un utente che ha privilegi ristretti su questo filesystem; anche se ls -l riporta che i file sono di root, il nostro utente locale, se proveremo ad agire su quei file saremo gandu sulla macchina remota, che ha ragionevolmente accesso all'albero sotto /mnt/openclose/home/gandu.
shfsmount è dotato di molte caratteristiche interessanti, tra cui la possibilità di risolvere i link simbolici (-s), di preservare la connessione anche in caso questa si interrompa (-p) ed altro che può essere letto con man shfsmount.
Note al documento
Ovviamente è necessario avere su questa un account di sistema e l'accesso SSH.