Centos 搭建Samba共享服务

Centos 搭建Samba共享服务

网盘搞过了,今天搞下Samba,方便windows通过资源管理器直接访问。

流程

  • 一,关闭Selinux
  • 二,防火墙放行端口
  • 三,安装samba
  • 四,创建用户及共享目录
  • 五,配置samba
  • 六,启动、测试

一,关闭selinux

#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i "s/SELINUX=enforcing/SELINUX=disable/g" /etc/selinux/config

二,防火墙放行端口

#放行端口TCP:139/445 和 UDP:137/138
firewall-cmd --zone=public --add-port=139/tcp --permanent 
firewall-cmd --zone=public --add-port=445/tcp --permanent 
firewall-cmd --zone=public --add-port=137/udp --permanent 
firewall-cmd --zone=public --add-port=138/udp --permanent   
#重新加载防火墙
firewall-cmd --reload

三,安装samba

#通过yum安装
yum -y install samba*

四,创建用户及共享目录

a.创建samba用户及密码

#创建用户名ffing
useradd ffing
#设置密码
smbpasswd -a ffing

b,创建samba共享目录 /ffing_share ,并设置目录所有者

#创建访问目录/ffing_share
mkdir /ffing_share
#设置目录所有者和组(具备读写权限)
chown -R ffing:ffing /ffing_share

五,配置samba

修改配置文件:/etc/samba/smb.conf

配置内容如下:(只留下global和你的共享名)

[global]
     workgroup = SAMBA
     security = user
     passdb backend = tdbsam
     printing = cups
     printcap name = cups
     load printers = yes
     cups options = raw

#共享名(根据自己需求更改)
 [ffing_share]
         #共享目录(绝对路径)
         path = /ffing_share
         browseable = yes
         guest ok =yes
         writable =yes
         create mask =0644
         directory mask =0755

六,启动、测试

启动smb服务:systemctl start smb

smb开机启动:systemctl enable smb

windows测试:

注:如果更新过smb帐号密码或者切换账号,需清除windows登录信息才可正常访问

windows清除登录信息命令:net use * /del /y

https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-14.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0
https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-16.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0
https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-17-1024x590.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

MAC测试

https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-18.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0
https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-19.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0
https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-20.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0
https://qnimg.ffing.cn/wp-content/uploads/2021/05/图片-21.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

#其他

列出samba用户

pdbedit -L

smbpasswd语法

smbpasswd [option] username
#options:
-a 添加用户 
-x 删除用户
-d 冻结用户
-n 密码置空

smb.conf详解(复制过来的有待验证)

Samba配置文件常用参数详解
 Samba的主配置文件叫smb.conf,默认在/etc/samba/目录下。
 smb.conf含有多个段,每个段由段名开始,直到下个段名。每个段名放在方括号中间。每段的参数的格式是:名称=指。配置文件中一行一个段名和参数,段名和参数名不分大小写。
 除了[global]段外,所有的段都可以看作是一个共享资源。段名是该共享资源的名字,段里的参数是该共享资源的属性。
 Samba安装好后,使用testparm命令可以测试smb.conf配置是否正确。使用testparm –v命令可以详细的列出smb.conf支持的配置参数。
 全局参数:
 ==================Global Settings ===================
 [global]
 config file = /usr/local/samba/lib/smb.conf.%m
 说明:config file可以让你使用另一个配置文件来覆盖缺省的配置文件。如果文件 不存在,则该项无效。这个参数很有用,可以使得samba配置更灵活,可以让一台samba服务器模拟多台不同配置的服务器。比如,你想让PC1(主机名)这台电脑在访问Samba Server时使用它自己的配置文件,那么先在/etc/samba/host/下为PC1配置一个名为smb.conf.pc1的文件,然后在smb.conf中加入:config file = /etc/samba/host/smb.conf.%m。这样当PC1请求连接Samba Server时,smb.conf.%m就被替换成smb.conf.pc1。这样,对于PC1来说,它所使用的Samba服务就是由smb.conf.pc1定义的,而其他机器访问Samba Server则还是应用smb.conf。
 workgroup = WORKGROUP
 说明:设定 Samba Server 所要加入的工作组或者域。
 server string = Samba Server Version %v
 说明:设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。
 netbios name = smbserver
 说明:设置Samba Server的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。netbios name和workgroup名字不要设置成一样了。
 interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
 说明:设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
 hosts allow = 127. 192.168.1. 192.168.10.1
 说明:表示允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。hosts deny 与hosts allow 刚好相反。
 例如:hosts allow=172.17.2.EXCEPT172.17.2.50
 表示容许来自172.17.2..的主机连接,但排除172.17.2.50
 hosts allow=172.17.2.0/255.255.0.0
 表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接
 hosts allow=M1,M2
 表示容许来自M1和M2两台计算机连接
 hosts allow=@xq
 表示容许来自XQ网域的所有计算机连接
 max connections = 0
 说明:max connections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
 deadtime = 0
 说明:deadtime用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
 time server = yes/no
 说明:time server用来设置让nmdb成为windows客户端的时间服务器。
 log file = /var/log/samba/log.%m
 说明:设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个宏%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。如果pc1、pc2访问过Samba Server,就会在/var/log/samba目录下留下log.pc1和log.pc2两个日志文件。
 max log size = 50
 说明:设置Samba Server日志文件的最大容量,单位为kB,0代表不限制。
 security = user
 说明:设置用户访问Samba Server的验证方式,一共有四种验证方式。
 share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
 user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
 server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
 domain:域安全级别,使用主域控制器(PDC)来完成认证。 
 passdb backend = tdbsam
 说明:passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。
 1.smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实
 用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。
 2.tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的参数很多,我们列出几个主要的。
 pdbedit –a username:新建Samba账户。
 pdbedit –x username:删除Samba账户。
 pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
 pdbedit –Lv:列出Samba用户列表的详细信息。
 pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
 pdbedit –c “[]” –u username:恢复该Samba用户的账号。
 3.ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”
 encrypt passwords = yes/no
 说明:是否将认证密码加密。因为现在windows操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。
 smb passwd file = /etc/samba/smbpasswd
 说明:用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。
 username map = /etc/samba/smbusers
 说明:用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。
 guest account = nobody
 说明:用来设置guest用户名。
 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
 说明:用来设置服务器和客户端之间会话的Socket选项,可以优化传输速度。
 domain master = yes/no
 说明:设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务。
 local master = yes/no
 说明:local master用来指定Samba Server是否试图成为本地网域主浏览器。如果设为no,则永远不会成为本地网域主浏览器。但是即使设置为yes,也不等于该Samba Server就能成为主浏览器,还需要参加选举。
 preferred master = yes/no
 说明:设置Samba Server一开机就强迫进行主浏览器选举,可以提高Samba Server成为本地网域主浏览器的机会。如果该参数指定为yes时,最好把domain master也指定为yes。使用该参数时要注意:如果在本Samba Server所在的子网有其他的机器(不论是windows NT还是其他Samba Server)也指定为首要主浏览器时,那么这些机器将会因为争夺主浏览器而在网络上大发广播,影响网络性能。
 如果同一个区域内有多台Samba Server,将上面三个参数设定在一台即可。
 os level = 200
 说明:设置samba服务器的os level。该参数决定Samba Server是否有机会成为本地网域的主浏览器。os level从0到255,winNT的os level是32,win95/98的os level是1。Windows 2000的os level是64。如果设置为0,则意味着Samba Server将失去浏览选择。如果想让Samba Server成为PDC,那么将它的os level值设大些。
 domain logons = yes/no
 说明:设置Samba Server是否要做为本地域控制器。主域控制器和备份域控制器都需要开启此项。
 logon . = %u.bat
 说明:当使用者用windows客户端登陆,那么Samba将提供一个登陆档。如果设置成%u.bat,那么就要为每个用户提供一个登陆档。如果人比较多,那就比较麻烦。可以设置成一个具体的文件名,比如start.bat,那么用户登陆后都会去执行start.bat,而不用为每个用户设定一个登陆档了。这个文件要放置在[netlogon]的path设置的目录路径下。
 wins support = yes/no
 说明:设置samba服务器是否提供wins服务。
 wins server = wins服务器IP地址
 说明:设置Samba Server是否使用别的wins服务器提供wins服务。
 wins proxy = yes/no
 说明:设置Samba Server是否开启wins代理服务。
 dns proxy = yes/no
 说明:设置Samba Server是否开启dns代理服务。
 load printers = yes/no
 说明:设置是否在启动Samba时就共享打印机。
 printcap name = cups
 说明:设置共享打印机的配置文件。
 printing = cups
 说明:设置Samba共享打印机的类型。现在支持的打印系统有:bsd, sysv, plp, lprng, aix, hpux, qnx
 共享参数:
 ================== Share Definitions ==================
 [共享名]
 comment = 任意字符串
 说明:comment是对该共享的描述,可以是任意字符串。
 path = 共享目录路径
 说明:path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes]共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以这样写:path = /home/share/%m 。
 browseable = yes/no
 说明:browseable用来指定该共享是否可以浏览。
 writable = yes/no
 说明:writable用来指定该共享路径是否可写。
 available = yes/no
 说明:available用来指定该共享资源是否可用。
 admin users = 该共享的管理者
 说明:admin users用来指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。
 例如:admin users =bobyuan,jane(多个用户中间用逗号隔开)。
 valid users = 允许访问该共享的用户
 说明:valid users用来指定允许访问该共享资源的用户。
 例如:valid users = bobyuan,@bob,@tech(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@+组名”表示。)
 invalid users = 禁止访问该共享的用户
 说明:invalid users用来指定不允许访问该共享资源的用户。
 例如:invalid users = root,@bob(多个用户或者组中间用逗号隔开。)
 write list = 允许写入该共享的用户
 说明:write list用来指定可以在该共享下写入文件的用户。
 例如:write list = bobyuan,@bob
 public = yes/no
 说明:public用来指定该共享是否允许guest账户访问。
 guest ok = yes/no
 说明:意义同“public”。

贴个我原来的脚本,可正常使用!

因为当时写的仓促,本来想再完善一下,放gitee上,一直没时间整理,先贴上,如果某天我再用的话,再完善吧。

#!/bin/bash
#about:ffing.cn

#samba共享基目录:默认/Share_Dir,可自行修改
#本脚本创建的共享目录都在基目录之下
#牵涉共享组成员管理,放弃!!中文共享名!!

#基目录
SMBDIR=/Share_Dir
mkdir -p $SMBDIR

############################  函数start ############################
#创建系统用户
FUNUSERADD(){
cat /etc/passwd|awk -F":" '{print $1}'|grep "^$USERNAME$" >/dev/null 2>&1
if [  $? -eq 0 ];then
FUNPASSWD123456
echo -e "\e[32m $USERNAME 用户名创建完成,初始密码123456\e[0m"

else
		useradd -M -n -s /sbin/nologin $USERNAME  >/dev/null 2>&1
		if [  $? -eq 0 ];then
		FUNPASSWD123456
		echo -e "\e[32m $USERNAME 用户名创建完成,初始密码123456\e[0m"
		else
		echo -e "\e[31m $USERNAME 用户名创建失败,请输入有效的用户名\e[0m"
		fi
fi

}





#初始密码123456
FUNPASSWD123456(){
smbpasswd -a $USERNAME <<EOF  >/dev/null 2>&1
123456
123456
EOF
}





#用户追加组
FUNDANDGROUP(){
usermod -a -G  $GROUP $USERNAME
}



#判断smb用户是否存在
FUNCHECKUSERNAMEYES(){
while true
do
read -p "请输入要修改密码的用户名:" USERNAME
pdbedit -L |cut -d":" -f1|grep "^$USERNAME$" >/dev/null 2>&1
if [  $? -eq 0 ];then
break
else
	echo -e "\e[31m 错误用户名不存在,请输入存在的用户名!\e[0m"
fi
done
}

FUNCHECKUSERNAMENO(){
while true
do
read -p "请输入新的用户名:" USERNAME
if [ ! -z $USERNAME ];then
		pdbedit -L |cut -d":" -f1|grep "^$USERNAME$" >/dev/null 2>&1
		if [  $? -eq 0 ];then
			echo -e "\e[31m 错误用户名已存在,请输入新的用户名!\e[0m"
		else
		break
		fi
fi
done
}




#输入SMB密码
FUNPASSWD(){
while true
do
read -p "请输入密码:" PASSWD
if [ -z $PASSWD  ];then
echo -e "\e[31m 输入错误,密码不能为空! \e[0m"
else
break
fi
done
}



#执行SMB密码
FUNRUNPASSWD(){
smbpasswd -a $USERNAME <<EOF >/dev/null 2>&1
$PASSWD
$PASSWD
EOF

echo -e "\e[32m $USERNAME 密码设置完成\e[0m"
}



#创建共享目录名
FUNGROUPADD(){
while true
do
read -p "请输入新的共享名:" GROUP
if [ ! -z $GROUP ];then	
	cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |grep "^$GROUP$" >/dev/null 2>&1
	if [ $? -eq 0 ];then
	echo -e "\e[31m $GROUP 共享目录已存在,请重新输入\e[0m"
	else
	groupadd $GROUP > /dev/null 2>&1

				if [ $? -eq 0 ];then
				echo -e "\e[32m $GROUP 共享目录名创建完成\e[0m"
				break
				else
				echo -e "\e[31m 错误,请输入有效的共享目录名!\e[0m"
				fi
	fi
fi
done
}





#创建共享目录
FUNMKDIR(){
cd $SMBDIR
mkdir -p $GROUP
}

#目录授权
#配置samba目录所有者
FUNOWNDIR(){
cd $SMBDIR
chown -R :$GROUP $GROUP
chmod 770 $GROUP
}


#samba全局配置
FUNGLCONF(){
echo "
[global]
     workgroup = WORKGROUP
     security = user
     passdb backend = tdbsam
     printing = cups
     printcap name = cups
     load printers = yes
     cups options = raw
" > /etc/samba/smb.conf
}

#添加共享名配置
FUNADDCONF(){
sed -i '/\['"$GROUP"'\]/,+6d' /etc/samba/smb.conf 
echo "
[$GROUP]
    path =$SMBDIR/$GROUP
    browseable =yes
    guest ok =no
    writable =yes
    create mask =0644
    directory mask =0755
" >> /etc/samba/smb.conf
}












#修改SMB用户密码
FUNMODPASSWD(){
#输入密码	
FUNPASSWD
#执行SMB密码
FUNRUNPASSWD
}















#修改SMB共享目录名称
FUNMODDGROUP(){
while true
do
FUNLISTGROUP
read -p "请输入要被修改的共享名(回车返回上级):" GROUP
if [ -z $GROUP ];then
break
else
	cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |grep "^$GROUP$" >/dev/null 2>&1
	if [ $? -eq 0 ];then
			while true
			do
			read -p "请输入新的共享名:" NEWGROUP
			if [ ! -z $NEWGROUP ];then
			groupmod -n   $NEWGROUP $GROUP  >/dev/null 2>&1
				if [  $? -eq 0 ];then
					#修改本地共享目录名称
					cd $SMBDIR
					mv  $GROUP  $NEWGROUP
					#修改SMB配置中共享名
					sed -i "s/\[$GROUP\]/\[$NEWGROUP\]/" /etc/samba/smb.conf
					echo -e "\e[32m 修改共享目录名称完成\e[0m"
					break 2
				else
				echo -e "\e[31m 错误,请输入有效的共享目录名\e[0m"
				fi

			fi
			done
	else
	echo -e "\e[31m 错误,共享目录名不存在!\e[0m"
	fi	
fi
done
}



#查询共享组里存在哪些用户
FUNGROUPUSER(){
#获取组ID
GROUPID=` cat /etc/group |awk -F ":" '{print $1 " " $3}'|grep "^$GROUP " |awk '{print $2}' `
#获取组用户
echo > /tmp/ingroupuser
echo > /tmp/outgroupuser
		for USERNAME in `pdbedit -L |cut -d":" -f1`
		do
		id $USERNAME |awk -F"=" '{print $4}'|tr "," "\n"|cut -d "(" -f2|cut -d ")" -f1 |grep "^$GROUP$" >/dev/null 2>&1
			if [  $? -eq 0 ];then
			echo "$USERNAME" >> /tmp/ingroupuser
			else
			echo "$USERNAME" >> /tmp/outgroupuser
			fi
		done
echo "\/\/\/\/\/\/\/\/\/\/\/\/\/\//\/\/\/\/\/\//\/\/\/\/\//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/"
echo -e "\e[32m $GROUP 共享中已存在以下用户: \e[0m"
cat /tmp/ingroupuser |tr "\n" "\t"
echo
echo -e "\e[33m $GROUP 共享中未存在以下用户: \e[0m"
cat /tmp/outgroupuser|tr "\n" "\t"
echo
}










#所有共享目录总数
FUNSMBDIRSUM(){
SMBDIRSUM=`cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |wc -l`
echo "当前Samba共享目录:$SMBDIRSUM 个"
}

#列出共享权限信息
FUNLISTAUTH(){
FUNSMBDIRSUM
for GROUP in `cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1`
do
#获取组ID
GROUPID=` cat /etc/group |awk -F ":" '{print $1 " " $3}'|grep "^$GROUP " |awk '{print $2}' `
#获取组用户
echo "\/\/\/\/\/\/\/\/\/\/\/\/\/\//\/\/\/\/\/\//\/\/\/\/\//\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/"
echo -e "\e[33m $GROUP 共享中包含以下用户: \e[0m"
echo > /tmp/groupuser
		for USERNAME in `pdbedit -L |cut -d":" -f1`
		do
		id $USERNAME |awk -F"=" '{print $4}'|tr "," "\n"|cut -d "(" -f2|cut -d ")" -f1 |grep "^$GROUP$" >/dev/null 2>&1
			if [  $? -eq 0 ];then
			echo "$USERNAME" >> /tmp/groupuser
			fi
		done
cat /tmp/groupuser |tr "\n" "\t"
echo
done
}

#列出所有用户名
FUNLISTUSER(){
echo "当前samba用户列表:"
echo "------------------------------------------------------------------------------------------"
pdbedit -L |cut -d":" -f1 |tr "\n" "\t"
echo
echo "------------------------------------------------------------------------------------------" 
}




#列出所有共享名
FUNLISTGROUP(){
echo "当前samba共享目录列表:"
echo "------------------------------------------------------------------------------------------"
FUNSMBDIRSUM
cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |tr "\n" "\t" 2>/dev/null
echo
echo "------------------------------------------------------------------------------------------"

}












#删除SMB用户
FUNDELUSER(){
while true
do
read -p "请输入要删除的用户名:" USERNAME
if [ ! -z  $USERNAME ];then
smbpasswd -x $USERNAME > /dev/null 2>&1
		if [  $? -eq 0 ];then
		echo -e "\e[32m $USERNAME 用户删除成功\e[0m"
		break
		else
		echo -e "\e[31m $USERNAME 用户删除失败,用户不存在!\e[0m"
		fi
fi
done
}













#删除SMB共享目录配置
FUNDELSMBCONF(){
sed -i '/\['"$GROUP"'\]/,+6d' /etc/samba/smb.conf
}


#删除本地共享目录
FUNDELLOCALDIR(){
cd $SMBDIR
rm -rf $GROUP
}


#删除smb共享配置及目录
FUNDELSMBCONFDIR(){

FUNDELSMBCONF
FUNDELLOCALDIR
}


#删除共享目录及数据
FUNDELSMBDIR(){
while true
do
FUNLISTGROUP	
read -p "请输入要删除的共享名(回车返回上级):"  GROUP
if [  -z $GROUP ];then
break
else

cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |grep "^$GROUP$" >/dev/null 2>&1
		if [ $? -eq 0 ];then
		FUNDELSMBCONFDIR
		echo -e "\e[32m $GROUP 共享目录及数据删除成功 \e[0m"
		break
		else
		echo -e "\e[31m 输入错误,请输入正确的共享名!\e[0m"
		fi
fi
done
}










#删除所有共享用户
FUNDELALLUSER(){
for USER in ` pdbedit -L |cut -d":" -f1`
do	
smbpasswd -x $USER >/dev/null 2>&1
done
}


#删除所有共享目录
FUNDELALLDIR(){
for GROUP in ` cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 `
do
FUNDELSMBCONF
cd $SMBDIR
rm -rf $GROUP
done
}





#共享目录添加用户
FUNSMBDIRADDUSER(){
while true
do
FUNLISTGROUP
read -p "请输入要添加用户的共享名(回车返回上级):" GROUP
if [ -z $GROUP ];then
	break
else
	cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |grep "^$GROUP$" >/dev/null 2>&1
	if [ $? -eq 0 ] ;then
		while true
		do
		#显示组中存在用户,及未存在的用户
		FUNGROUPUSER
		
			read -p "请输入$GROUP 共享中要添加的用户名(回车返回上级):" USERNAME
			if [ -z $USERNAME ];then
				break
			else
						pdbedit -L |cut -d":" -f1 |grep "^$USERNAME$" >/dev/null 2>&1
						if [ $? -eq 0 ];then
						usermod -a -G  $GROUP $USERNAME
						echo -e "\e[32m $GROUP 共享中添加用户 $USERNAME 完成\e[0m"	
						else
						echo -e "\e[31m 输入错误,请输入存在的用户名!\e[0m"
						fi
			fi
		done
	else
	echo -e "\e[31m 输入错误,请输入正确的共享名!\e[0m"
	fi
fi
done
}







#共享目录删除用户
FUNSMBDELUSER(){
while true
do
FUNLISTGROUP
read -p "请输入要删除用户的共享名(回车返回上级):" GROUP
if [ -z $GROUP ];then
	break
else
	cat /etc/samba/smb.conf |tail -n +10|grep '^\['|cut -d"[" -f2|cut -d"]" -f1 |grep "^$GROUP$" >/dev/null 2>&1
	if [ $? -eq 0 ] ;then
		while true
		do
		FUNGROUPUSER
			read -p "请输入$GROUP  共享中要删除的用户名(回车返回上级):" USERNAME
			if [ -z $USERNAME ];then
				break
			else
						pdbedit -L |cut -d":" -f1 |grep "^$USERNAME$" >/dev/null 2>&1
						if [ $? -eq 0 ];then
						gpasswd -d $USERNAME  $GROUP 
						echo -e "\e[32m $GROUP 共享中删除用户 $USERNAME 完成\e[0m"
							
						else
						echo -e "\e[31m 输入错误,请输入正确的用户名\e[0m"
						fi
			fi
		done
	else
	echo -e "\e[31m 输入错误,请输入正确的共享名!\e[0m"
	fi
fi
done
}






#关闭selinux、防火墙
FUNSELINUX(){
#关闭selinux
setenforce 0 > /dev/null 2>&1
sed -i 's/enforcing/disable/g' /etc/selinux/config
}
#添加防火墙端口
FUNFWD(){
cat /etc/firewalld/zones/public.xml |grep port=\"139\"/  >/dev/null 2>&1
if [ ! $? -eq 0 ];then
sed -i "/<\/zone>/i <port protocol=\"tcp\" port=\"139\"/>" /etc/firewalld/zones/public.xml
sed -i "/<\/zone>/i <port protocol=\"tcp\" port=\"445\"/>" /etc/firewalld/zones/public.xml
sed -i "/<\/zone>/i <port protocol=\"tcp\" port=\"137\"/>" /etc/firewalld/zones/public.xml
sed -i "/<\/zone>/i <port protocol=\"tcp\" port=\"138\"/>" /etc/firewalld/zones/public.xml
fi
firewall-cmd --reload >/dev/null 2>&1
}

#重启smb
FUNRESTARTSMB(){
systemctl restart smb >/dev/null 2>&1
}

#启动samba、开机启动
FUNSTARTSMB(){

systemctl restart smb  >/dev/null 2>&1
systemctl enable smb >/dev/null 2>&1
}


#判断启动状态
FUNSTATUSSMB(){
systemctl status smb >/dev/null 2>&1
if [ $? -eq 0 ];then
	echo -e "\e[32m smb启动状态:成功 \e[0m"
else
	echo -e "\e[31m smb启动状态:失败 \e[0m"
fi
}




#IP

IPLAN=`hostname -I |awk '{print $1}'`
IPWAN=`curl http://pv.sohu.com/cityjson 2>> /dev/null | awk -F '"' '{print $4}'`



#display
FUNDISPLAY(){
echo -e "\e[33m
=================================================
samba外网:$IPWAN
Samba内网:$IPLAN
samba基目录:$SMBDIR
samba默认添加共享:$GROUP
Samba默认添加账号:$USERNAME
Samba默认添加密码:$PASSWD
================================================= \e[0m"
}




#yum-check-rpm
FUNCHECKRPM(){
RPM=samba
echo "正在检测 $RPM 安装包"	
yum provides $RPM >/dev/null 2>&1
if [ ! $? -eq 0 ];then
	echo -e "\e[31m 错误!yum源中未能找到 $RPM 安装包,请检测yum源或网络连接! \e[0m"
	exit
fi
}

#yum-install-rpm
FUNYUMRPM(){
echo "yum -y install $RPM" >/tmp/yuminstall
nohup bash /tmp/yuminstall  >/tmp/test 2>&1 &
}


#yun-check-installing
FUNCHECKYUM(){
while  [ $? -eq 0 ]
do
echo "$RPM 安装中,请等待 。。。 "
sleep 3
ps -ef |grep -v grep|grep "yum.*install.*$RPM.*" >/dev/null 2>&1
done
echo "$RPM 安装完成"
}        















#静默安装install
FUNINSTALL(){
#安装samba
FUNCHECKRPM
FUNYUMRPM
FUNCHECKYUM
#创建共享目录名
GROUP=ffing
groupadd $GROUP >/dev/null 2>&1
#创建共享目录
cd $SMBDIR
mkdir  -p $GROUP
#目录权限
FUNOWNDIR
#创建共享用户
USERNAME=ffing
useradd -g $GROUP -M -s /sbin/nologin $USERNAME >/dev/null 2>&1
#samba密码
PASSWD=123456
smbpasswd -a $USERNAME <<EOF >/dev/null 2>&1
$PASSWD
$PASSWD
EOF
#配置samba
FUNGLCONF
FUNADDCONF
#关闭selinux
FUNSELINUX
#防火墙放行
FUNFWD
#samba启动
FUNSTARTSMB
#samba状态
FUNSTATUSSMB
#display
FUNDISPLAY
}
############################函数end############################






























#判断是否存在samba
smbd --version > /dev/null 2>&1
if [ ! $? -eq 0 ];then
FUNINSTALL
fi

while true
do
echo "
=============================================================================================
                |-- 1.重置samba(清除所有用户及共享数据)
                |
                |-- 2.查看共享权限
                |
                |               |-- 添加用户
                |-- 3.用户管理--|-- 修改密码  
                |               |-- 删除用户
     Samba      |
     架构图     |               |-- 添加共享目录
                |-- 4.目录管理--|-- 修改目录名称
                |               |-- 删除共享目录
                |
                |               |-- 共享目录添加授权用户
                |-- 5.权限管理--|  
                |               |-- 共享目录删除授权用户
                |
                |-- 0.退出
=============================================================================================
Samba外网:$IPWAN 	Samba内网:$IPLAN 	Samba基目录:$SMBDIR 
注:本脚本创建的共享目录都在基目录之下,牵涉共享组成员管理!!放弃中文共享名!!
---------------------------------------------------------------------------------------------"
	read -p "请选择:" SUM
	case $SUM in
		1)
		FUNDELALLUSER
		FUNDELALLDIR
		FUNINSTALL
		;;


		2)
		FUNLISTAUTH
		;;
		
		3)
		while true
		do
			#列出用户
			FUNLISTUSER
			echo "1.添加用户"
			echo "2.修改密码"
			echo "3.删除用户"
			read -p "请选择(回车返回上级):" NUM
			if [ -z  $NUM ];then
			break
			else
			case $NUM in
				1)
				#检测用户是否存在
				FUNCHECKUSERNAMENO
				#添加用户
				FUNUSERADD
				;;

				2)

				#原用户名判断
				FUNCHECKUSERNAMEYES
				#设置密码
				FUNPASSWD
				FUNRUNPASSWD
				
				;;

				3)
				FUNDELUSER

				;;
				*)
				echo -e "\e[31m 错误,请输入1~3!\e[0m"
				;;				

			esac
			fi	
		done
		;;
		
		4)
		while true
		do
		#列出共享目录
		FUNLISTGROUP
		echo "1.添加共享目录"
		echo "2.修改共享目录名称"
		echo "3.删除共享目录及数据"
		read -p "请选择(回车返回上级):" NUM
		if [ -z $NUM ];then
			break
		else
			case $NUM in
				1)
				FUNGROUPADD
				FUNMKDIR
				FUNOWNDIR
				FUNADDCONF
				FUNRESTARTSMB
				;;

				2)
				FUNMODDGROUP
				FUNRESTARTSMB
				;;

				3)
				FUNDELSMBDIR
				
				FUNRESTARTSMB
				;;
				*)
				echo -e "\e[31m 错误,请输入1~3!\e[0m"
				;;				

			esac
		fi
		done
		;;
		
		5)
		while true
		do
		FUNLISTGROUP
		FUNLISTUSER
		echo "1.共享目录添加授权用户"
		echo "2.共享目录删除授权用户"
		read -p "请选择(回车返回上级):" NUM
		if [ -z $NUM ];then
			break
		else
			case $NUM in
				1)
				FUNSMBDIRADDUSER
				;;

				2)
				FUNSMBDELUSER
				;;

				*)
				echo -e "\e[31m 错误,请输入1~2!\e[0m"
				;;
			esac
		fi
		done
		;;
		
		0)
		exit
		;;
		
		
		*)
		echo -e "\e[31m 错误,请输入1~5!\e[0m"
		;;
		
	esac
done
good good study, day day up!

发表评论

textsms
account_circle
email

Centos 搭建Samba共享服务
网盘搞过了,今天搞下Samba,方便windows通过资源管理器直接访问。 流程 一,关闭Selinux二,防火墙放行端口三,安装samba四,创建用户及共享目录五,配置samba六,启动、测试 …
扫描二维码继续阅读
2021-05-26