Jan 292014
 

Often one wants a shared access to files across machines. Traditionally one uses the network file system (nfs). The network file server works as follows: There is an nfs server that exports some directories in its filesystem hiearchy to various nfs clients that mount these directory over the network into their file system hierarchy. As a result, each of the clients shares the directories exported by the nfs server.

However a lot of times you just have to mount a directory from a server to your local computer and in these cases NFS it’s not so useful, sshfs it’s much better

Sshfs is a filesystem client based on the SSH File Transfer Protocol. Since most SSH servers already support this protocol it is very easy to set up: i.e. on the server side there’s nothing to do.  On the client side mounting the filesystem is as easy as logging into the server with ssh.



How it works.

Sshfs is a userspace file system (fuse) that works over ssh, or rather sftp. Fuse is an implementation of filesystem primitives in userspace rather than in kernel space. This essentially means that users can mount and unmount file system without having to be root. Sshfs makes use of the sftp subsystem to do the remote file system operations. Thus all the great features of ssh holds true, i.e. key based authentication, use of ssh-agents.

Installing sshfs.

All linux distros have a prebuilt package for sshfs. On Debian/Ubuntu and Arch the relevant package is sshfs. So all you need to do is to install it.

   $ aptitude install sshfs # as root.
   $ sudo aptitude install sshfs # if you are on Unbutu
   $ pacman -S sshfs # as root on an Arch machine

On Fedora it looks like it is called fuse-sshfs so something like this should work.

   $ yum install fuse-sshfs

How to mount a filesystem

Once sshfs is installed running it is very simple:

> sshfs hostname: mountpoint

Note, that it’s recommended to run it as user, not as root.  For this to work the mountpoint must be owned by the user.  If the username is different on the host you are connecting to, then use the “username@host:” form.  If you need to enter a password sshfs will ask for it (actually it just runs ssh which ask for the password if needed).  You can also specify a directory after the “:”.  The default is the home directory.

Another example:

$ sshfs [email protected]:/home/linuxaria /mnt/linuxaria.com -C -p 2222

Where 2222 is the port number.

Also, make certain that before connecting, you set the file permissions for any local client folders you will attempt to mount a remote directory to. I.e., do not have everything owned by root!

To unmount the filesystem:

> fusermount -u mountpoint

Automounting on Startup on Debian/Ubuntu:

From /etc/fstab

Add a line similar to this one to your /etc/fstab :

sshfs#$USER@far:/projects /home/$USER/far_projects fuse defaults,idmap=user 0 0

Note that you have to change $USER to your login name when editing fstab, but it is not necessary when typing commands (the shell does it for you in that case). The idmap=user option ensures that files owned by the remote user are owned by the local user. If you don’t use idmap=user, files in the mounted directory might appear to be owned by someone else, because your computer and the remote computer have different ideas about the numeric user ID associated with each user name. idmap=user will not translate UIDs for other users.

With crontab

Another solution would be to put the following line in your crontab (edit /etc/crontab with sudo privileges):

@reboot sshfs [email protected]:/dir/dir /home/username/mount/xxx

But since ubuntu’s password manager is not present when the command is run you need to use a password-less private/public key pair to authenticate with the ssh server in question (or a similar method of authentication). This would mount it on every reboot.

Using the GUI

Alternatively you can mount a directory over SSHFS using the Gnome “Connect to Server” tool in the desktop Places menu. In the tool, set the service type to SSH and fill in the boxes as needed. If a password is required when connecting then you will be prompted for it. Unmounting a SSHFS connection is the same as for any other volume. Open the File Browser (Nautilus). In the Places panel on the left click the arrow next to the SSHFS mount you want to disconnect or right-click it and select “Unmount”.

Automounting on Arch-Linux (or systemd systems in general)

Automounting can happen on boot, or on demand (when accessing the directory). For both, the setup happens in /etc/fstab

On demand

With systemd on-demand mounting is possible using /etc/fstab entries.

Example:

user@host:/remote/folder /mount/point  fuse.sshfs noauto,x-systemd.automount,_netdev,users,idmap=user,IdentityFile=/home/user/.ssh/id_rsa,allow_other,reconnect 0 0

The important mount options here are noauto,x-systemd.automount,_netdev.

  • noauto tells it not to mount at boot
  • x-systemd.automount does the on-demand magic
  • _netdev tells it that it’s a network device, not a block device (without it “No such device” errors might happen)

On boot

An example on how to use sshfs to mount a remote filesystem through /etc/fstab

USERNAME@HOSTNAME_OR_IP:/REMOTE/DIRECTORY  /LOCAL/MOUNTPOINT  fuse.sshfs  defaults,_netdev  0  0

Take for example the fstab line

[email protected]:/home/llib/FAH  /media/FAH2  fuse.sshfs  defaults,_netdev  0  0

The above will work automatically if you are using an SSH key for the user.

Ssh is working but not sshfs.

A common error that people have reported is that ssh works but sshfs fails. If this happens, check whether your sftp subsystem is working. Most probably this too would fail or work incorrectly. One of the main reasons why sshfs/sftp does not work is because your startup scripts in the remote machine prints stuff on the screen. To check this out, try the following command.

    $ ssh ppk@remote /bin/true

If this command produces any output then you are in trouble. You have to fix your startup script in your remote machine — .bash_profile and .bashrc , if you are using bash as your default shell. The startup script should check whether the standard output is a terminal before it outputs something. For this protect your output generating commands inside a test -t 1 block as follows

    $ cat .bash_profile

    if [ -t 1 ] # Check if stdout is connected to a terminal
    then
        echo "The answer is 42"
    fi

Reference:

SSHFS from the Archlinux wiki
SSHFS from the Ubuntu Guides

sshfs: Remote directory over ssh


Popular Posts:

Flattr this!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*