Andries filmer

Feel free with Open Source Software

Andries Filmer - Internet professional sinds 1996.
Ik ben groot voorstander van Free- en Opensource Software (FOSS) en laat deze site jouw overtuigen waarom dit goed is.
Home Over deze website Kennisbank Ezelsoren Freelancer Online gereedschap

Mouting with sshfs

Index
  1. Install sshfs
  2. Password less mounting
  3. My Mounts
  4. Auto mount script
  5. Auto umount script
  6. More information
  7. Comments

Install sshfs

 sudo apt-get install sshfs

Where 'you' is your username

 useradd -G fuse you

Password less mounting

Create a key without passphrase

 ssh-keygen -t dsa

Copy the pubkey to your server

 cat ~/.ssh/id_dsa.pub | ssh you@other-host 'cat >> ~/.ssh/authorized_keys'

My Mounts

Create mount points

 sudo mkdir /mnt/sshfs/home
 sudo mkdir /mnt/sshfs/share
 sudo mkdir /mnt/sshfs/media
 sudo mkdir /mnt/sshfs/stock

Add these to your /etc/fstab (as root)

 sshfs#you@other-host:/home/andries   /mnt/sshfs/home   fuse fsname=Home,comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0
 sshfs#you@other-host:/storage/share  /mnt/sshfs/share  fuse fsname=Share,comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0
 sshfs#you@other-host:/storage/media  /mnt/sshfs/media  fuse fsname=Media,comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0
 sshfs#you@other-host:/storage/stock  /mnt/sshfs/stock  fuse fsname=Stock,comment=sshfs,noauto,users,exec,uid=1000,gid=1000,allow_other,reconnect,transform_symlinks,BatchMode=yes 0 0

 vi /etc/fuse.conf 

Add this line

 user_allow_other

Auto mount script

Create a file as root /etc/network/if-up.d/mountsshfs

 #!/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

Auto umount script

Create a file as root /etc/network/if-down.d/umountsshfs.

 #!/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; }

More information

This page is created on 2011-04-09 and updated on 2011-05-28

I appreciate if you give some comment about this page. Please go ahead.
Your e-mailaddress will not be published it is only to contact you (if needed).

 
Your name
Your e-mailaddress
To prefent robots to use this form I ask you kindly to type the next characters in the input field.
 

 


Mijn Curriculum vitae | De content op deze website heeft de Creativecommons 3.0 licentie | © 2011
Andries Filmer | http://andries.filmer.nl | andries@filmer.nl | © 2011
Deze website wordt gerealiseerd met Free- en Open Source Software: | | | | | |