mirror of
https://github.com/samba-team/samba.git
synced 2025-01-11 05:18:09 +03:00
Contributed software for Linux autofs support.
(This used to be commit 883be39077
)
This commit is contained in:
parent
e40b24249b
commit
47ec2e09b7
18
examples/autofs/auto.a
Normal file
18
examples/autofs/auto.a
Normal file
@ -0,0 +1,18 @@
|
||||
# automount points below /a
|
||||
|
||||
# This is an automounter map and it has the following format
|
||||
# key [ -mount-options-separated-by-comma ] location
|
||||
# Details may be found in the autofs(5) manpage
|
||||
|
||||
# nfs servers
|
||||
valepp -fstype=nfs,rsize=8192,wsize=8192 valepp:/
|
||||
galaun -fstype=nfs,rsize=8192,wsize=8192 galaun:/
|
||||
|
||||
# smb-servers
|
||||
supra_andreas -fstype=smb,uuname=andreas supra:/aheinrich
|
||||
supra_cspiel -fstype=smb,uuname=cspiel supra:/cspiel
|
||||
phonon_andreas -fstype=smb,uuname=andreas,fmod=3700 phonon:/andreas
|
||||
helium_cspiel -fstype=smb,uuname=cspiel,fmod=3700 helium:/cspiel
|
||||
|
||||
#supra_jaz -fstype=smb,user,fmod=644,dmod=755 supra:/f
|
||||
|
65
examples/autofs/mount-smb.doc
Normal file
65
examples/autofs/mount-smb.doc
Normal file
@ -0,0 +1,65 @@
|
||||
Date: Tue, 07 Apr 1998
|
||||
Contributor: Christoph L. Spiel <Christoph_Spiel@physik.tu-muenchen.de>
|
||||
Organization: Munich Institute of Technology, Institute E10
|
||||
Subject: WISHES:LINUX:smbmount
|
||||
===============================================================================
|
||||
Machine Arch: i386
|
||||
Machine OS: linux
|
||||
Kernel: 2.1.85
|
||||
Samba Version: Version 1.9.18p3
|
||||
Mount Version: 2.7i
|
||||
Autofs Version: 0.3.14
|
||||
|
||||
|
||||
Hi SAMBA developers!
|
||||
|
||||
I have written a shell script that marries smbmount and mount
|
||||
on a Linux-machine with a 2.1.55+ kernel (i.e., a newer developper
|
||||
kernel. Especially it makes smbmount compatible
|
||||
with autofs! Now, You (when root :-) can say
|
||||
mount -t smb /win-machine/my-share /mntpt
|
||||
Concerning the management of the user/password-pairs I have already
|
||||
made a step in the right direction, but there is still a lot of
|
||||
brain-work to do :-(
|
||||
|
||||
The primary problem with the Win passwords
|
||||
is that they are under user-control, and not under admin-control
|
||||
as the Linux passwords are. Therfore, I give every SAMBA user
|
||||
a
|
||||
~/smb-pass
|
||||
file where she can manage her usernames and passwords herself.
|
||||
The fundamental mount-tables /etc/fstab and /etc/auto.* only
|
||||
list the mount-point and the respective options. The user´s
|
||||
password file is adressed via the uuname=<user_name>-option.
|
||||
|
||||
An important "side-effect" is that the password file need not to
|
||||
be word-readable. In fact my script tests for user-only rights of
|
||||
this file to close this potential security-hole.
|
||||
|
||||
The script mount.smb has to be installed in /sbin and given mode 755.
|
||||
No suid is necessary! I attached an automount table that is currently
|
||||
in use on my machine. A user´s password file looks like this:
|
||||
|
||||
$ cat ~/smb-pass
|
||||
supra:/cspiel cspiel secret
|
||||
helium:/c cspiel sesame
|
||||
^ ^ ^
|
||||
| | +- password
|
||||
| +- username
|
||||
+- share-name as in fundamental mount-table.
|
||||
|
||||
It would be nice, if someone else tests my script. Maybe, You have
|
||||
already found a better solution than mine. If You find it useful,
|
||||
I would be glad to donate it to the SAMBA-project.
|
||||
|
||||
BUGS:
|
||||
(1) There is no documentation yet. (Yes, I consider this a bug!)
|
||||
(2) When used with autofs the automounter overruns mount.smb.
|
||||
This means when accessing an automounted share for the 1st time
|
||||
You may get an empty directory. Retrying several times will
|
||||
cause the mount to complete successfully.
|
||||
|
||||
|
||||
Best,
|
||||
Christoph Spiel
|
||||
|
441
examples/autofs/mount.smb
Normal file
441
examples/autofs/mount.smb
Normal file
@ -0,0 +1,441 @@
|
||||
#!/bin/sh -x
|
||||
|
||||
|
||||
# name: mount.smb -- interface between mount and smbmount
|
||||
# author: Ch. L. Spiel (cspiel@physik.tu-muenchen.de)
|
||||
# $Id: mount.smb,v 1.1 1998/04/13 12:31:10 jht Exp $
|
||||
|
||||
# bash version: 1.14.7(1)
|
||||
# mount version: 2.7i
|
||||
# smbmount version: 1.9.18p3
|
||||
|
||||
|
||||
myname=`basename $0`
|
||||
passwd_filename="smb-pass" # name of user smb-password file
|
||||
lock_file="/var/lock/$myname"
|
||||
log_file="/tmp/mount.smb.log"
|
||||
|
||||
PATH=/usr/local/samba/bin:/usr/bin:/bin
|
||||
|
||||
# check for an existing lock-file quickly(!)
|
||||
if [ -e "$lock_file" ]; then
|
||||
# exit, but don´t touch lock-file
|
||||
exit 0
|
||||
fi
|
||||
# set up new lock-file
|
||||
echo > $lock_file
|
||||
|
||||
# initialise log-file
|
||||
echo "logging of $myname started at `date`" > $log_file
|
||||
chmod --silent 600 $log_file
|
||||
echo "called with: $@" >> $log_file
|
||||
exec >> $log_file 2>&1
|
||||
|
||||
|
||||
|
||||
# set default and initial values
|
||||
verbose=false # be silent
|
||||
fake=false # really do the mount
|
||||
fmode="-f 600" # default file mode
|
||||
dmode="-d 700" # default dir mode
|
||||
|
||||
#uid="-u `id | sed 's/^uid=\([0-9]*\).*$/\1/'`"
|
||||
uid="-u 0"
|
||||
#gid="-g `id | sed 's/^.*gid=\([0-9]*\).*$/\1/'`"
|
||||
gid="-g 0"
|
||||
|
||||
|
||||
#
|
||||
# functions
|
||||
#
|
||||
|
||||
# exitproc(int exit_code)
|
||||
function exit_proc
|
||||
{
|
||||
if [ -n "$lock_file" ]; then
|
||||
# remove current lock-file
|
||||
rm "$lock_file"
|
||||
fi
|
||||
# update log-file
|
||||
echo "" >> $log_file
|
||||
echo "$myname´s return value is $1." >> $log_file
|
||||
echo "logging of $myname ended at `date`." >> $log_file
|
||||
# done.
|
||||
exit $1
|
||||
}
|
||||
|
||||
|
||||
# split_arg(arg)
|
||||
# arg ::= id '=' val
|
||||
# set id and val on return
|
||||
function split_arg
|
||||
{
|
||||
id="$1"
|
||||
val="$2"
|
||||
extra="$3"
|
||||
} # end of split_arg
|
||||
|
||||
|
||||
# split_passwdline(uline)
|
||||
function split_passwdline
|
||||
{
|
||||
user_name=$1
|
||||
real_password=$2
|
||||
user_id=$3
|
||||
group_id=$4
|
||||
full_name=$5
|
||||
home_dir=$6
|
||||
shell_name=$7
|
||||
}
|
||||
|
||||
|
||||
# get_homedir(username)
|
||||
function get_homedir
|
||||
{
|
||||
local temp_ifs
|
||||
|
||||
temp_ifs="$IFS"
|
||||
uline=`grep "^$1" /etc/passwd`
|
||||
if [ -z "$uline" ]; then
|
||||
echo "$myname: unknown user \"$1\""
|
||||
exit_proc 1
|
||||
fi
|
||||
IFS=":"
|
||||
split_passwdline $uline
|
||||
if [ -z "$home_dir" ]; then
|
||||
echo "$myname: user \"$1\" has no home directory"
|
||||
exit_proc 1
|
||||
fi
|
||||
echo "$home_dir"
|
||||
IFS="$temp_ifs"
|
||||
}
|
||||
|
||||
|
||||
# get_uid(username)
|
||||
function get_uid
|
||||
{
|
||||
local temp_ifs
|
||||
|
||||
temp_ifs="$IFS"
|
||||
uline=`grep "^$1" /etc/passwd`
|
||||
if [ -z "$uline" ]; then
|
||||
echo "$myname: unknown user \"$1\""
|
||||
exit_proc 1
|
||||
fi
|
||||
IFS=":"
|
||||
split_passwdline $uline
|
||||
echo "$user_id"
|
||||
IFS="$temp_ifs"
|
||||
}
|
||||
|
||||
|
||||
# get_gid(username)
|
||||
function get_gid
|
||||
{
|
||||
local temp_ifs
|
||||
|
||||
temp_ifs="$IFS"
|
||||
uline=`grep "^$1" /etc/passwd`
|
||||
if [ -z "$uline" ]; then
|
||||
echo "$myname: unknown user \"$1\""
|
||||
exit_proc 1
|
||||
fi
|
||||
IFS=":"
|
||||
split_passwdline $uline
|
||||
echo "$group_id"
|
||||
IFS="$temp_ifs"
|
||||
}
|
||||
|
||||
|
||||
# read_passwd_file(sharename)
|
||||
function read_passwd_file
|
||||
{
|
||||
local pwd_filename pwd_entry temp_ifs share_name fmod
|
||||
|
||||
pwd_filename=`get_homedir $uuname`/$passwd_filename
|
||||
# use uid and gid of user´s /etc/password entry
|
||||
uid="-u `get_uid $uuname`"
|
||||
gid="-g `get_gid $uuname`"
|
||||
# check existence of password file
|
||||
if [ ! -f "$pwd_filename" -o ! -r "$pwd_filename" ]; then
|
||||
echo "$myname: cannot read from user password file \"$pwd_filename\""
|
||||
exit_proc 1
|
||||
fi
|
||||
# check file permissions
|
||||
for f in $pwd_filename{,~,%,.BAK,.bak,.new,.old,.orig,.sav}; do
|
||||
if [ ! -f $f ]; then continue; fi
|
||||
/bin/ls -l $f | grep -q -- "^-r\(w\|-\)------"
|
||||
if [ $? = 1 ]; then
|
||||
echo "$myname: Found security hole: mode of file \"$f\""
|
||||
echo "$myname: Password file must have permission 400 or 600."
|
||||
echo "$myname: Please fix the file´s mode."
|
||||
exit_proc 1
|
||||
fi
|
||||
done
|
||||
|
||||
share_name="$1" # sharename in smb-format!
|
||||
pwd_entry=`grep -v '^#' "$pwd_filename" | grep -i "^$share_name"`
|
||||
if [ -z "$pwd_entry" ]; then
|
||||
# try uni*-like sharename
|
||||
share_name=`echo $share_name | sed -e 's,^//,,' -e 's,/,:/,'`
|
||||
pwd_entry=`grep -v '^#' "$pwd_filename" | grep -i "^$share_name"`
|
||||
fi
|
||||
if [ -z "$pwd_entry" ]; then
|
||||
# sharename was not found in user´s password file
|
||||
echo "$myname: cannot authentify share named \"$1\" via file \"$pwd_filename\""
|
||||
exit_proc 1
|
||||
fi
|
||||
|
||||
# pwd_entry has the form:
|
||||
# sharename username password
|
||||
temp_ifs="$IFS"
|
||||
IFS=" " # <tab> and <space>
|
||||
split_arg $pwd_entry
|
||||
options="$options -U $val"
|
||||
password="$extra"
|
||||
IFS="$temp_ifs"
|
||||
}
|
||||
|
||||
|
||||
# process_options(opt1, opt2, ..., optN)
|
||||
function process_options
|
||||
{
|
||||
local temp_ifs
|
||||
|
||||
for j; do
|
||||
temp_ifs="$IFS" # save current internal-field separator
|
||||
IFS="=" # set new separator
|
||||
split_arg $j # split argument into identifier and value
|
||||
IFS="$temp_ifs" # reset old separator
|
||||
case "$id" in
|
||||
port)
|
||||
options="$options -p $val"
|
||||
;;
|
||||
debug)
|
||||
options="$options -d $val"
|
||||
;;
|
||||
log)
|
||||
options="$options -l $val"
|
||||
;;
|
||||
nbname)
|
||||
options="$options -n $val"
|
||||
;;
|
||||
nopwd)
|
||||
options="$options -N"
|
||||
;;
|
||||
maxproto)
|
||||
options="$options -m $val"
|
||||
;;
|
||||
ip)
|
||||
options="$options -I $val"
|
||||
;;
|
||||
uname)
|
||||
options="$options -U $val"
|
||||
;;
|
||||
wrkgrp)
|
||||
options="$options -W $val"
|
||||
;;
|
||||
term)
|
||||
options="$options -t $val"
|
||||
;;
|
||||
sdir)
|
||||
options="$options -D $val"
|
||||
;;
|
||||
pwd)
|
||||
# DO NOT USE THIS OPTION! It is a severe scurity hole.
|
||||
password="$val"
|
||||
;;
|
||||
uuname)
|
||||
# consult user´s smb-password file
|
||||
uuname="$val" # uni* user name
|
||||
read_passwd_file "$server_service"
|
||||
;;
|
||||
|
||||
# ignored options
|
||||
async)
|
||||
# do nothing
|
||||
;;
|
||||
atime)
|
||||
# do nothing
|
||||
;;
|
||||
auto)
|
||||
# do nothing
|
||||
;;
|
||||
defaults)
|
||||
# do nothing
|
||||
;;
|
||||
dev)
|
||||
# do nothing
|
||||
;;
|
||||
exec)
|
||||
# do nothing
|
||||
;;
|
||||
noatime)
|
||||
# do nothing
|
||||
;;
|
||||
noauto)
|
||||
# do nothing
|
||||
;;
|
||||
nodev)
|
||||
# do nothing
|
||||
;;
|
||||
noexec)
|
||||
# do nothing
|
||||
;;
|
||||
nosuid)
|
||||
# do nothing
|
||||
;;
|
||||
nouser)
|
||||
# do nothing
|
||||
;;
|
||||
ro)
|
||||
# do nothing
|
||||
;;
|
||||
rw)
|
||||
# do nothing
|
||||
;;
|
||||
suid)
|
||||
# do nothing
|
||||
;;
|
||||
sync)
|
||||
# do nothing
|
||||
;;
|
||||
user)
|
||||
# do nothing
|
||||
;;
|
||||
|
||||
# fs options
|
||||
fmod)
|
||||
fmode="-f $val"
|
||||
;;
|
||||
dmod)
|
||||
dmode="-d $val"
|
||||
;;
|
||||
uid)
|
||||
uid="-u $val"
|
||||
;;
|
||||
gid)
|
||||
gid="-g $val"
|
||||
;;
|
||||
|
||||
# fallthrough
|
||||
*)
|
||||
echo "$myname: unrecognized option $id"
|
||||
exit_proc 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
} # end of split_options
|
||||
|
||||
|
||||
|
||||
#
|
||||
# main
|
||||
#
|
||||
|
||||
|
||||
|
||||
if [ "$verbose" != "false" ]; then
|
||||
# show how we have been called
|
||||
echo "$myname: $*"
|
||||
fi
|
||||
|
||||
# some checks of the input parameters
|
||||
if [ "$#" -lt 2 ]; then
|
||||
echo "$myname: need at least service and mountpoint"
|
||||
exit_proc 1
|
||||
fi
|
||||
|
||||
if `echo "$2" | grep -vq "^/"`; then
|
||||
echo "$myname: mount point must be an absolut path"
|
||||
exit_proc 1
|
||||
fi
|
||||
|
||||
|
||||
# copy arguments
|
||||
if `echo "$1" | grep -q ":/"`; then
|
||||
# non--standard format, i.e., server:/service
|
||||
server_service=`echo "//$1" | sed -e "sx:/x/x"`
|
||||
else
|
||||
# standard format, i.e, //server/service
|
||||
server_service="$1"
|
||||
fi
|
||||
mntpt="$2"
|
||||
|
||||
# copy options
|
||||
shift 2 # skip arguments: //server/service and /mnt-point
|
||||
for i; do
|
||||
case "$i" in
|
||||
-f | --fake)
|
||||
fake=true
|
||||
;;
|
||||
-h | --help)
|
||||
echo "usage: mount.smb service [password] mountpoint [options]"
|
||||
exit_proc 0
|
||||
;;
|
||||
-v | --verbose)
|
||||
verbose=true
|
||||
;;
|
||||
-V | --version)
|
||||
echo "$myname: mount.smb-0.1.0"
|
||||
exit_proc 0
|
||||
;;
|
||||
-o)
|
||||
shift # skip leading -o
|
||||
temp_ifs="$IFS" # save current internal-field separator
|
||||
IFS="," # set new separator
|
||||
process_options $*
|
||||
IFS="$temp_ifs" # reset old separator
|
||||
break # mount places options at the end -> we are done
|
||||
;;
|
||||
*)
|
||||
echo "$myname: unrecognized option $i"
|
||||
exit_proc 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
IFS=' '
|
||||
|
||||
|
||||
#
|
||||
# be careful...
|
||||
#
|
||||
|
||||
|
||||
# nmblookup server: is node up and running?
|
||||
srv=`echo $server_service | sed 's,^//\(.*\)/.*$,\1,'` # server´s name
|
||||
nmblookup "$srv" | grep -q "failed to find name"
|
||||
if [ "$?" = 0 ]; then
|
||||
echo "$myname: failed to find server \"$srv\"."
|
||||
exit_proc 1
|
||||
fi
|
||||
|
||||
|
||||
#
|
||||
# perform mount
|
||||
#
|
||||
|
||||
|
||||
fs_options="$fmode $dmode $uid $gid" # all options concerning the mounted fs
|
||||
if [ "$verbose" = "true" ]; then
|
||||
# display what we would do. Do not show the password, only show "xxx".
|
||||
echo -n "smbmount $server_service "
|
||||
if [ -n "$password" ]; then # password is set
|
||||
echo -n "xxx " # ... but we don´t show it ;-)
|
||||
fi
|
||||
echo "-c \"mount $mntpt $fs_options\" $options"
|
||||
#else
|
||||
# supress further messages
|
||||
# exec > /dev/null 2>&1
|
||||
#:
|
||||
fi
|
||||
|
||||
if [ "$fake" != "true" ]; then
|
||||
smbmount $server_service $password -c "mount $mntpt $fs_options" $options
|
||||
echo "smbmount´s exit code was $?."
|
||||
fi
|
||||
|
||||
# clean up and exit
|
||||
exit_proc 0
|
||||
|
Loading…
Reference in New Issue
Block a user