在Linux风行的今天,与Windows机器相互共享文件已经是非常普遍的应用了,关于samba的设置的文档也相当的多,本站也有不少了。不过在使用它的高级功能方面还是比较欠缺的,这类文档是非常稀有的,而且只有英文版的,为了方便国内的Linux用户,我将这些文档整理一下,翻译过来,并结合自己一些经验,为大家提供一些帮助。
注:这篇文章并不是一篇关于如何配置samba的基础文档,而是需要阅读者有一定的Linux使用经验,熟悉脚本语言,并且对samba有一定的使用经验。主要是针对于一些企业的Linux网管,或比较有经验的Linux爱好者。
这篇文章也其说是文章,不如说是一个技巧提示,但是我个人觉得它意义非常大,特别是对于大中型企业的用户来讲,它可能非常重要。
它主要描述了如果在Linux下使用samba来为使用Windows系统的机器作备份,并且描述了如何跨子网共享samba。
1、将Windows机器备分到一台Linux主机上
Adam Neat(adamneat@ipax.com.au),向我们提供了以下一段代码,它描述了如何使用smbclient软件包将windows机器备份到Linux主机上。Adam说它可以用来备份windows 3.x和NT机器到一台Linux的磁带机上。
另一段代码,是Dan Tager (dtager@marsala.com),提供的,Dan的脚本是通过rsh来备份Unix机器,尽管它可以修改成ssh以便使其更简单些。
在下面这个脚本中,字符串“agnea1”是作备份工作的Linux主机的一个用户名。
#!/bin/bash
clear
echo Initialising ...
checkdate=`date | awk '{print $1}'`
if [ -f "~agnea1/backup-dir/backup-data" ]; then
echo "ERROR: No config file for today!"
echo "FATAL!"
exit 1
fi
if [ -d "~agnea1/backup-dir/temp" ]; then
echo "ERROR: No tempoary directory found!"
echo
echo "Attempting to create"
cd ~agnea1
cd backup-dir
mkdir temp
echo "Directory Made - temp"
fi
if [ "$1" = "" ]; then
echo "ERROR: enter in a machine name (ie: cdwriter)"
exit 1
fi
if [ "$2" = "" ]; then
echo "ERROR: enter in a SMB (Lan Manager) Resource (ie: work)"
exit 1
fi
if [ "$3" = "" ]; then
echo "ERROR: enter in an IP address for $1 (ie:
130.xxx.xxx.52)" exit 1
fi
#########################################################
# Main Section
#
#########################################################
cd ~agnea1/backup-dir/temp
rm -r ~agnea1/backup-dir/temp/*
cd ~agnea1/backup-dir/
case "$checkdate"
in
Mon)
echo "Backuping for Monday"
cat backup-data | /usr/local/samba/bin/smbclient
$1$2 -I$3 -N echo "Complete"
if [ -d "~agnea1/backup-dir/Monday" ]; then
echo "Directory Monday Not found ...
making" mkdir
~agnea1/backup-dir/Monday
fi
echo "Archiving ..."
cd ~agnea1/backup-dir/temp
tar -cf monday.tar *echo "done ..."
rm ~agnea1/backup-dir/Monday/monday.tar
mv monday.tar ~agnea1/backup-dir/Monday
;;
Tue)
echo "Backuping for Tuesday"
cat backup-data | /usr/local/samba/bin/smbclient
$1$2 -I$3 -N echo "Complete"
if [ -d "~agnea1/backup-dir/Tuesday" ]; then
echo "Directory Tuesday Not found ...
making" mkdir
~agnea1/backup-dir/Tuesday
fi
echo "Archiving ..."
cd ~agnea1/backup-dir/temp
tar -cf tuesday.tar *
echo "done ..."
rm ~agnea1/backup-dir/Tuesday/tuesday.tar
mv tuesday.tar ~agnea1/backup-dir/Tuesday
;;
Wed)
echo "Backuping for Wednesday"
cat backup-data | /usr/local/samba/bin/smbclient
$1$2 -I$3 -N echo "Complete"
if [ -d "~agnea1/backup-dir/Wednesday" ]; then
echo "Directory Wednesday Not found
... making" mkdir
~agnea1/backup-dir/Wednesday
fi
echo "Archiving ..."
cd ~agnea1/backup-dir/temp
tar -cf wednesday.tar *
echo "done ..."
rm ~agnea1/backup-dir/Wednesday/wednesday.tar
mv wednesday.tar ~agnea1/backup-dir/Wednesday
;;
Thu)
echo "Backuping for Thrusday"
cat backup-data | /usr/local/samba/bin/smbclient
$1$2 -I$3 -N echo "Complete"
if [ -d "~agnea1/backup-dir/Thursday" ]; then
echo "Directory Thrusday Not found ...
making" mkdir
~agnea1/backup-dir/Thursday
fi
echo "Archiving ..."
cd ~agnea1/backup-dir/temp
tar -cf thursday.tar *
echo "done ..."
rm ~agnea1/backup-dir/Thursday/thursday.tar
mv thursday.tar ~agnea1/backup-dir/Thursday
;;
Fri)
echo "Backuping for Friday"
cat backup-data | /usr/local/samba/bin/smbclient
$1$2 -I$3 -N echo "Complete"
if [ -d "~agnea1/backup-dir/Friday" ]; then
echo "Directory Friday Not found ...
making" mkdir
~agnea1/backup-dir/Friday
fi
echo "Archiving ..."
cd ~agnea1/backup-dir/temp
tar -cf friday.tar *
echo "done ..."
rm ~agnea1/backup-dir/Friday/friday.tar
mv friday.tar ~agnea1/backup-dir/Friday
;;
*)
echo "FATAL ERROR: Unknown variable passed for day"
exit 1;;
esac
###########
______________________________________________________
这里是Dan的备份脚本:
______________________________________________________
#!/bin/bash
BACKDIR=3D/backup
WINCMD=3D/usr/bin/smbclient
function CopyWinHost(){
# tars and gzips "windows shares" to a local directory using samba's
# smbclient
# argument 1 is the remote host window's host name
# argument 2 is the share name to be backed up
echo $1,$2,$3
REMOTE=3D$1
SHARE=3D$2
DEST=3D$3
# create a tarred gzip file using samba to copy direct from a
# windows pc
# 12345 is a password. Needs some password even if not defined on
# remote system
$WINCMD $REMOTE$SHARE 12345 -Tc -|gzip > $DEST
echo `date`": Done backing up "$REMOTE" to "$DEST
echo
}
function CopyUnixHost(){
# tars and gzips a directory using rsh
# argument 1 is the name of the remote source host
# argument 2 is the full path to the remote source directory
# argument 3 is the name of the local tar-gzip file. day of week
# plus .tgz will be appended to argument 3
REMOTE=3D$1
SRC=3D$2
DEST=3D$3
if rsh $REMOTE tar -cf - $SRC |gzip > $DEST; then
echo `date`": Done backing up "$REMOTE":"$SRC" to "$DEST
else
echo `date`": Error backing up "$REMOTE":"$SRC" to "$DEST
fi
}
# $1: win=3Dbackup windows machine, unix=3Dbackup unix machine
case $1 in
win)
# $2=3D remote windows name, $3=3Dremote share name,
# $4=3Dlocal destination directory
CopyWinHost $2 $3 $4;;
unix)
# $2 =3D remote host, $3 =3D remote directory,
# $4 =3D destination name
CopyUnixHost $2 $3 $4;;
esac
以上两个文件都是针对于具体的机器而设计的,如果您准备对自己的机器也进行备份,那么请您安照您自己的机器的具体情况来修改这两个文件的一个,就可以使用了。
2、跨子网使用samba
许多大型企业有不同的子网,但是如何将另一个子网的内容被其它子网共享,是一个非常关键的问题,许多samba的用户在这里遇到许多麻烦,如果这点被解决了,那么可以使资源利用率大大提高。使企业的成本降低不少。
Andrew Tridgell声称SMB主机在通过有路由的网络共享时有一些问题。这是他的一些建议:
跨子网(例如,通过路由)资源浏览,你需要作以下事情。
1.所有希望被浏览的的计算机应该使用一个单个的WINS服务器(Samba或NT可以作到这点)
2.每个子网的master brower必须不是NT就是samba。(win9x不能正常地跨子网工作通讯)
3.你必须将所有子网的workgroup名字都设成一样的。这并不需要非常严格地遵守,但是这是保证成功的最简单的方式之一。如果你不能遵守这一条,那么你必须组织一种可以连接两个网络的方式,它可以由两种方式实现:
(1)每个browse master注意到在同一广播域中其它的borwse masters的workgroup的描述(2)每个非win9x的browse master要接触全部workgroup的DMB(常用的有:将主域控制器或一个samba服务器标记为domain master),并且周期性地交换browse 信息。
当然,其它用户指出,cisco的路由器可以通过一种方式被设置成解析SMB的交流,并允许浏览。它的建议是将SMB主机的路由接口设置成:
ip helper-address x.x.x.x
这里x.x.x.x是这台SMB服务器的IP地址。