|
|||||||
SSHFS AUTOmount on Fesity, Gutsy, Hardy, Intrepid
Время создания: 01.03.2017 09:31
Автор: https://ubuntuforums.org/member.php?u=233493&s=ce0f59e8e0cb82605710b26d1d1c0f05
Текстовые метки: linux ubuntu ssh sshfs network
Раздел: Linux
Запись: Velonski/mytetra-database/master/base/14883426984u8ourtu9f/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
HOWTO: Automount sshfs filesystems as soon as the network becomes available.
Code: sudo apt-get install sshfs
That should also install any other dependencies, including Fuse, if they aren't already installed. Code: gksu gedit /etc/fstab
A typical sshfs fstab entry ready for automounting looks something like this: 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
If you're familiar with fstab entries, the only thing that should look new is the filesystem specification at the beginning of the line. If you're new at this, I'll provide a quick explanation. The first part determines the sshfs share. The syntax is the same as when you are using sshfs on the command line, except that it is prefixed by "sshfs#" to tell the mount program what kind of filesystem this is. (By the way,This kind of syntax probably works for other fuse filesystems as well, but I haven't tried it.) Also, make sure to put your username in, or else the system will not know which user to log in to the remote host as.
Code: user_allow_other
STEP 2: Testing Your Fstab entries Code: mount /mnt/sshfs/homebox
Then see if your sshfs share has been successfully mounted, for example, by: Code: ls /mnt/sshfs/homebox
If you see the contents of your remote share, then you're good to go. 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
/etc/network/if-down.d/umountsshfs 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; }
Now make both files executable and owned by root: 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
That should be it! If your shares are configured as above, they should now automatically mount and unmount with your network. Try disconnecting and reconnecting. Code: sudo perl -lape 's/(sshfs#\S+)(\s+\S+\s+\S+\s+)(.*)/\1\2fsname=\1,\3/' -i /etc/fstab
Thanks to conchyliferous for bringing this to my attention. |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|