![]() |
ubuntu.com - launchpad.net - ubuntu help
|
|
|||||||
|
Tutorials & Tips The place to find Ubuntu related Tips & Tricks. |
|
|
Thread Tools | Display Modes |
|
|
#1 |
|
Just Give Me the Beans!
![]() Join Date: Feb 2007
Beans: 60
|
HOWTO: Automount sshfs filesystems as soon as the network becomes available.
Ubuntu Version: Feisty or later If you are looking for a way to easily do remote backups or any other sort of mass network transfer, you have come to the wrong place. Sshfs is nice, but it tends to be unreliable under heavy load. You would be much better off looking into rsync or Unison, for example. Update: New Features!
This isn't just a howto on writing fstab lines for sshfs shares. That's part of it, yes, but the idea here is that you want you be able to walk into a cafe somewhere, start up your laptop, connect to the nearest wireless network, and immediately have your sshfs shares available without having to do anything extra beyond connecting to the network. This howto looks long, but it really isn't; I'm just providing lots of background information for those that are interested, and for those that are not very familiar with fstab entries. A lot of this howto is a crash course in the salient points of fstab entries. If you already know these, you can skip down to the good stuff in step 3. REQUIREMENTS: Feisty Fawn! (or later) The versions of fuse in Edgy and earlier releases are incapable of handling sshfs lines in /etc/fstab If you don't want to upgrade to Feisty, another possible solution might be to install the fuse packages provided here. Your mileage may vary. Next requirement: Sshfs. Sshfs is the tool used to mount any remote folder that you can access via ssh as a filesystem. To install it, Code:
sudo apt-get install sshfs Finally, and very importantly, you must have set up PASSWORDLESS login to the ssh host that you wish to mount. For details on how to set this up, go here. A non-automatic variation of this howto is possible without passowrdless logins. Also, you should already know how to mount your sshfs shares manually. There are plenty of howto's for this on these forums and elsewhere. PROCEDURE: Before you can automount your shares, you first have to mount them, and you have top set them up in your /etc/fstab so that they can be mounted with a simple command. So, STEP 1: Setting up fstab and fuse.conf. My source for this section is this page (the same one mentioned above). /etc/fstab is a critical system file, so naturally you will need administrator privileges to edit it: Code:
gksu gedit /etc/fstab Code:
# <file system> <mount point> <type> <options> sshfs#myname@www.myhome.com:/home/myname /mnt/sshfs/homebox fuse comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0 The next part is the mount point. Again, you can simply use the same folder that you always use when you mount the share manually. The next part tells mount that this is a Fuse filesystem. The options are also the same options you use when you mount the share manually, with a few additions:
Next, you should put the following in /etc/fuse.conf (create the file if it doesn't exist): Code:
user_allow_other (If you already know how to do this, then go ahead and do it, then skip to step 3.) To see if your fstab entry works, open up a terminal and try to mount it like this (I will continue with the example above): Code:
mount /mnt/sshfs/homebox Code:
ls /mnt/sshfs/homebox At this point, if you have not set up passwordless ssh logins, then mounting will still work, but you will have to provide your password on each mounting, and step 3 will not work for you. STEP 3: Automounting your shares when you connect to the internet Ok, now that your computer knows how to mount your shares, it's time to tell it when to mount them. Also, just as importantly, you need to tell your compute when to unmount them as well, because if you lose your network connection and forget to unmount the shares, any program that tries to access them will freeze indefinitely and will need to be killed. Accomplishing both of these is actually quite easy. You should have a pair of directories called /etc/network/if-up.d and /etc/network/if-down.d. Scripts in the first directory will be executed when the computer connects to the network, and scripts in the second one will be executes when it disconnects. Again, editing files in these directories requires administrator privileges. Create the following two files: /etc/network/if-up.d/mountsshfs Code:
#!/bin/sh
## http://ubuntuforums.org/showthread.php?t=430312
## The script will attempt to mount any fstab entry with an option
## "...,comment=$SELECTED_STRING,..."
## Use this to select specific sshfs mounts rather than all of them.
SELECTED_STRING="sshfs"
# Not for loopback
[ "$IFACE" != "lo" ] || exit 0
## define a number of useful functions
## returns true if input contains nothing but the digits 0-9, false otherwise
## so realy, more like isa_positive_integer
isa_number () {
! echo $1 | egrep -q '[^0-9]'
return $?
}
## returns true if the given uid or username is that of the current user
am_i () {
[ "$1" = "`id -u`" ] || [ "$1" = "`id -un`" ]
}
## takes a username or uid and finds it in /etc/passwd
## echoes the name and returns true on success
## echoes nothing and returns false on failure
user_from_uid () {
if isa_number "$1"
then
# look for the corresponding name in /etc/passwd
local IFS=":"
while read name x uid the_rest
do
if [ "$1" = "$uid" ]
then
echo "$name"
return 0
fi
done </etc/passwd
else
# look for the username in /etc/passwd
if grep -q "^${1}:" /etc/passwd
then
echo "$1"
return 0
fi
fi
# if nothing was found, return false
return 1
}
## Parses a string of comma-separated fstab options and finds out the
## username/uid assigned within them.
## echoes the found username/uid and returns true if found
## echoes "root" and returns false if none found
uid_from_fs_opts () {
local uid=`echo $1 | egrep -o 'uid=[^,]+'`
if [ -z "$uid" ]; then
# no uid was specified, so default is root
echo "root"
return 1
else
# delete the "uid=" at the beginning
uid_length=`expr length $uid - 3`
uid=`expr substr $uid 5 $uid_length`
echo $uid
return 0
fi
}
# unmount all shares first
sh "/etc/network/if-down.d/umountsshfs"
while read fs mp type opts dump pass extra
do
# check validity of line
if [ -z "$pass" -o -n "$extra" -o "`expr substr ${fs}x 1 1`" = "#" ];
then
# line is invalid or a comment, so skip it
continue
# check if the line is a selected line
elif echo $opts | grep -q "comment=$SELECTED_STRING"; then
# get the uid of the mount
mp_uid=`uid_from_fs_opts $opts`
if am_i "$mp_uid"; then
# current user owns the mount, so mount it normally
{ sh -c "mount $mp" &&
echo "$mp mounted as current user (`id -un`)" ||
echo "$mp failed to mount as current user (`id -un`)";
} &
elif am_i root; then
# running as root, so sudo mount as user
if isa_number "$mp_uid"; then
# sudo wants a "#" sign icon front of a numeric uid
mp_uid="#$mp_uid"
fi
{ sudo -u "$mp_uid" sh -c "mount $mp" &&
echo "$mp mounted as $mp_uid" ||
echo "$mp failed to mount as $mp_uid";
} &
else
# otherwise, don't try to mount another user's mount point
echo "Not attempting to mount $mp as other user $mp_uid"
fi
fi
# if not an sshfs line, do nothing
done </etc/fstab
wait
Code:
#!/bin/bash
# Not for loopback!
[ "$IFACE" != "lo" ] || exit 0
# comment this for testing
exec 1>/dev/null # squelch output for non-interactive
# umount all sshfs mounts
mounted=`grep 'fuse.sshfs\|sshfs#' /etc/mtab | awk '{ print $2 }'`
[ -n "$mounted" ] && { for mount in $mounted; do umount -l $mount; done; }
Code:
sudo chmod 755 /etc/network/if-up.d/mountsshfs /etc/network/if-down.d/umountsshfs sudo chown root:root /etc/network/if-up.d/mountsshfs /etc/network/if-down.d/umountsshfs ADDITIONAL COMMENTS: As an added bonus, since these shares are in fstab, GNOME will automatically create desktop icons for them when they are mounted, so you will have easy access to them. Those more familiar with mount might point out that the -a option could be used in these scripts instead of loops and grep, awk, etc. Indeed, my first implementation used this. However, the current form of the scripts allows them to be executed successfully by any user. By the way, remember that comment option? Well, that's how the mounting script knows which filesystems to mount. The mounting script can also be run manually at any time to remount your shares. There is no need to use sudo. When run as a user, the script will only remount your shares. When, your computer boots, it may complain that the fstab lines that you entered are invalid, but nothing should go wrong. And lastly, like most of the open source/free software world, this guide comes with no warranty. UPDATE In Hardy Heron and above, there is a bug in sshfs that prevents non-root unmounting of sshfs. There is a workaround described in https://bugs.launchpad.net/ubuntu/+s...se/+bug/243298 that makes things work for now. You can try the following perl one-liner to automatically apply the workaround to your fstab, but I only guarantee that it worked for me: Code:
sudo perl -lape 's/(sshfs#\S+)(\s+\S+\s+\S+\s+)(.*)/\1\2fsname=\1,\3/' -i /etc/fstab Last edited by Darwin Award Winner; January 3rd, 2009 at 04:11 PM.. Reason: Updated Script; Warning when not to use; Hardy update |
|
|
|
|
|
#2 |
|
First Cup of Ubuntu
![]() Join Date: Feb 2007
Beans: 9
|
Re: SSHFS AUTOmount on Feisty
Thanks. I use Xubuntu and I now have an easy way to access ssh shares (thunar does not have native ssh browsing support).
|
|
|
|
|
|
#3 |
|
Just Give Me the Beans!
![]() Join Date: Jan 2006
Beans: 66
|
Re: SSHFS AUTOmount on Feisty
How do you do this on an alternate port?
__________________
Packet8 Coupon Code |
|
|
|
|
|
#4 |
|
Just Give Me the Beans!
![]() Join Date: Feb 2007
Beans: 60
|
Re: SSHFS AUTOmount on Feisty
Code:
$ sshfs -h 2>&1 | grep -i port
-p PORT equivalent to '-o port=PORT'
-o directport=PORT directly connect to PORT bypassing ssh
|
|
|
|
|
|
#5 |
|
Gee! These Aren't Roasted!
![]() Join Date: Apr 2006
Beans: 157
|
Re: SSHFS AUTOmount on Feisty
My entry in fstab looks like this:
Code:
sshfs#xxxxxx@rattler.few.vu.nl:/home/xxxxxx/ /media/VU fuse comment=sshfs,users,noauto,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks 0 0 Code:
/sbin/mount.fuse: 23: function: not found -e mount.fuse# sshfs#xxxxxx@rattler.few.vu.nl:/home/xxxxxx/ exit: 26: Illegal number: /media/VU Update I installed FUSE 2.6.5, and now I get this output: Code:
[: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator [: 54: ==: unexpected operator Password: fuse: unknown option `IGNORE' The share is not mounted Last edited by ernstblaauw; May 14th, 2007 at 03:34 AM.. Reason: Update |
|
|
|
|
|
#6 |
|
Just Give Me the Beans!
![]() Join Date: Feb 2007
Beans: 60
|
Re: SSHFS AUTOmount on Feisty
Fuse 2.6.5? The latest version of Fuse in Feisty (i.e. the one that I am using) is 2.6.3. I don't know if something might have changed between those two versions. Anyway, you can try the following:
|
|
|
|
|
|
#7 | |
|
Just Give Me the Beans!
![]() Join Date: Jan 2006
Beans: 66
|
Re: SSHFS AUTOmount on Feisty
Quote:
your pointer to filesytem options gave me a clue, so I decided to read through the documentation of fstab and found the solution that works for me. Code:
sshfs#me@remoteserver:/remote/folder/ /media/myserver fuse port=123,noauto,user 0 0
__________________
Packet8 Coupon Code |
|
|
|
|
|
|
#8 | |
|
Gee! These Aren't Roasted!
![]() Join Date: Apr 2006
Beans: 157
|
Re: SSHFS AUTOmount on Feisty
Quote:
I got another question: I really need a password to log in. Is it possible to store it somewhere and then use it to automatically log in? |
|
|
|
|
|
|
#9 |
|
5 Cups of Ubuntu
![]() Join Date: Apr 2007
Location: Salem, Oregon
Beans: 32
Ubuntu 7.10 Gutsy Gibbon
|
Re: SSHFS AUTOmount on Feisty
For those of you asking about being able to mount sshfs without a password, you can setup a trust relationship between your local and remote machines as follows:
Make sure you are logged in as the user you want to set up the trust relationship. Then go to your home directory on your client machine: Code:
cd $HOME Code:
ssh-keygen -t rsa Now go ahead and enter your .ssh directory: Code:
cd $HOME/.ssh Code:
sftp <login>@<server_name>:/home/<login>/.ssh Code:
put id_rsa.pub Then quit sftp and ssh to the server box from your client box: Code:
ssh <login>@<server_name>:/home/<login>/.ssh Code:
cat id_rsa.pub >> authorized_keys Code:
chmod 600 authorized_keys Go ahead and test out an ssh or sftp connection from your client box to make sure it is working: Code:
ssh <login>@<server_name> |
|
|
|
|
|
#10 |
|
First Cup of Ubuntu
![]() Join Date: Mar 2006
Beans: 11
|
Re: SSHFS AUTOmount on Feisty
Passwordless Logons
Here's a simpler method # Create a public key-pair for whichever user you are using on the local PC ssh-keygen -t rsa # Give the user's public key to admin1@myServer ssh-copy-id -i .ssh/id_rsa.pub admin1@myServer # ... admin1@myserver's password:XXXXXX # You must know admin1's password # The user can now automatically connect as admin1 ssh admin1@myServer @myserver This saves all that copying, etc. I did the same for the local PC's root account # Switch to the root account su - I got this from Item 6 at http://www.venturecake.com/10-linux-...know-for-once/ Thanks to both of you - I spent hours screwing this up and never did get it to work until now. |
|
|
|
| Bookmarks |
| Thread Tools | |
| Display Modes | |
|
|