(openssh、telnet、vsftpd、nfs、rsync、inotify、samba)

一:OpenSSH服务与Telnet服务(必须掌握)

前言:OpenSSH是加密传输,Telnet是明文传输。这两个服务都是用来登入其他的主机的。

  • (一)服务进程的类型介绍(了解)
  • 服务进程有两种类型
  • 第一类是用户很少访问的服务:瞬时守护进程, 如:telnet服务托管给超级守护进程:xinetd
  • CentOS 5/6 :服务托管给超级守护进程,xinetd 
  • xinetd其配置文件为: /etc/xinetd.conf , /etc/xinetd.d/托管的服务进程名 
  • 例如:/etc/xinetd.d/rsync服务是托管到xinetd下的。
  • 启用某个瞬时守护进程
  • disable = yes:每一个托管服务都是禁用的,如果要托管,直接将disable = no, 这就是启用某个瞬时守护进程的方式
  • 或者使用chkconfig 命令 
  • chkconfig NAME on | off
  • 重启超级守护进程会重读配置文件:service xinetd restart
  • 第二类是用户大量访问的访问:独立守护进程,如:httpd、xinetd
  • (二)telnet命令(必须掌握)
  • 远程登入服务
  • C/S架构,监听在23/tcp
  • 明文的协议:认证等均为非加密过程
  • linux上:禁止root用户直接使用登入Telnet客户端登入到其他主机,只能是使用普通用户登入,然后再使用su命令切换到root用户
  • CentOS 6上 telnet服务介绍
  • Sever:服务端程序 telnet-server
  • Client: 客户端程序 telnet
  • 在centos6上安装了telnet-server,会将xinetd作为依赖被安装,如果需要启动被xinetd管控的服务,需要在/etc/xinetd.d/telnet配置文件中将disable改为no,然后重启xinetd服务,就会看到23号端口被监听了。
  • 但是使用telnet登入其他的主机的时候必须使用普通用户登入,然后再通过su 命令切换到root用户,例如:在安装了telnet客户端的主机上,登入其他主机
  • [root@dns2 ~]# telnet 192.168.23.4 
    Trying 192.168.23.4... 
    Connected to 192.168.23.4. 
    Escape character is '^]'. 
    CentOS release 6.6 (Final) 
    Kernel 2.6.32-504.el6.x86_64 on an x86_64 
    login: yhy 
    Password: 
    Last login: Sun Aug 20 02:40:41 from 192.168.23.11 
    [yhy@6 ~]$
  • CentOS 7上 telnet服务介绍
  • Sever:服务端程序 telnet-server 
  • 主程序的名字为: /usr/sbin/in.telnetd
  • rpm -ql telnet-server 
  • /usr/lib/systemd/system/telnet.socket 说明监听的只是一个端口 
    /usr/lib/systemd/system/telnet@.service 
    /usr/sbin/in.telnetd 
    /usr/share/man/man5/issue.net.5.gz 
    /usr/share/man/man8/in.telnetd.8.gz 
    /usr/share/man/man8/telnetd.8.gz
  • systemctl start telnet.socket 启动telnet服务 
  • netstat -lntup 显示如下:
  • tcp6 0 0 :::23 :::* LISTEN 1/systemd显示是systemd 帮助netstat监听的23端口
  • Client: 客户端程序 telnet 
  • 注意:在客户端通过telnet登入远程的服务端不能使用root的账号和密码登入,只能通过普通用户进行登入
  • telnet 192.168.23.12:23 指定某个端口登入,默认就是23号端口
  • (三)OpenSSH:Secure Shell:安全的shell,ssh是一种协议,OpenSSH是ssh协议的实现
  • C/S架构模式,监听在22/tcp
  • 协议: 
  • ssh v1:有漏洞,非常容易收到攻击
  • ssh v2:通过公钥加密(数字签名和密钥交换)的方式进行的,确保服务器端的身份识别,通过对称密钥确保传输的数据不被窃取
  • 公钥加密常用的有三种算法:RSA,DSA,椭圆曲线算法
  • 主机认证:需要用到主机认证密钥,由服务器端维护和提供
  • 用户远程登入两种方式
  • 基于口令的认证
  • 输入账号密码
  • 基于密钥的认证
  • 由用户提供一对密钥,私钥留存于客户端,公钥保存于远程服务器端的某用户的家目录的特定文件中
  • OpenSSH:ssh协议的开源实现
  • sshd:服务端程序,ssh的daemon守护进程 
  • 配置文件为:/etc/ssh/sshd_config
  • ssh:客户端程序
  • 配置文件为:/etc/ssh/ssh_config
  • scp:客户端程序
  • sftp:客户端程序
  • (1)ssh客户端的使用(必须掌握)
  • ssh [选项] [用户名@]host [命令]
  • 例如:ssh root@192.168.23.12 ifconfig
  • 例如:ssh -l root 192.168.23.12 ifconfig 切换到root用户执行ifconfig命令
  • 省略用户名意味:使用本地用户名作为远程登入的用户
  • 常用的选项 [options] 
  • -l :以自定用户的身份进行远程登入
  • -p:指明远程服务器的端口号
  • -o option: 
  • StrictHostKeyChecking
  • -X:支持转发X11
  • -Y:只支持信任的X11转发
  • -b bind_address:指定源地址
  • -i identify_file:基于密钥的认证执行认证操作时使用的本地密钥 
  • ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, 
    ~/.ssh/id_ed25519 and ~/.ssh/id_rsa
  • 配置文件:/etc/ssh/ssh_config(对于写脚本很重要)
  • 为了避免第一次登入其他主机的时候输入yes,修改StrictHostKeyChecking no即可
  • SSH支持的认证的方式 
  • 基于口令
  • 基于密钥
  • (1)生成密钥对 
  • ssh-keygen [-b bits] [-t type] [-f output_keyfile] [-N new_passphrase] 
  • type:有 
  • rsa:默认算法,密钥长度为2048(最常用)
  • dsa:密钥长短为1024
  • ecdsa:密钥长度为256,284,521
  • 例如:ssh-keygen -t rsa -P ""(很重要)
  • (2) 将生成的密钥对中的公钥复制到远程主机的用户的家目录下的authorization_keys文件中
  • ssh-copy-id [-n] [-i [identity_file]] [-p port] [user@]hostname
  • 例如:ssh-copy-id -i .ssh/id_rsa.pub root@192.168.23.12
  • (3)测试 
  • ssh root@192.168.23.12
  • 2:scp工具:secure copy 跨主机进行安全文件传输的工具(必须掌握)
  • 两种使用方式,一种是推送,另一种是拉取
  • PUSH : scp [options] 源文件路径 [user@]Hostname:目标文件路径
  • 例如:scp /etc/fstab root@192.168.23.12:/root
  • PULL:scp [options] [user@]Hostname:Derection_file Source_file
  • 例如:scp root@192.168.23.12:/root/fstab /root/fstab
  • 常用选项 
  • -r:递归复制
  • -p:保存源文件权限及从属关系
  • -q:静默模式
  • -p PORT:指明ssh协议监听的窗口
  • 3:ftp子系统:OpenSSH服务自带(需要会使用)
  • ftp:file transfer protocol ,明文的 
  • 安全传输机制 
  • ftps : ftp over ssl
  • sftp:ftp over ssh
  • sftp:C/S架构 
  • S:由sshd服务进程实现,是ssh的一个子系统,在CentOS上默认启用
  • C:sftp命令
  • sftp root@192.168.23.10 登入192.168.23.10主机
  • 登入之后可以使用help命令先查看帮助
  • get anaconda-ks.cfg:表示从目标主机下载一个文件到当前主机
  • sshd(服务器端)
  • 配置文件:/etc/ssh/sshd_config
  • 常用指令 
  • Port 22
  • ListenAddress 0.0.0.0 监听的地址
  • Protocol 2 指定协议版本
  • SyslogFacility AUTHPRIV :日志记录方式,AUTHPRIV表示记录于/var/log/secure
  • LogLevel INFO:日志事件级别的信息
  • PermitRootLogin yes :是否允许管理员直接登入
  • MaxSessions 10 :最大的连接数
  • PubkeyAuthentication yes :基于密钥的认证方式
  • AuthorizedKeysFile .ssh/authorized_keys :基于密钥认证的方式放在哪个文件中
  • PasswordAuthentication yes :是否支持口令认证
  • PermitEmptyPasswords no:是否支持空密码登入
  • ChallengeResponseAuthentication no :是否支持挑战式响应认证
  • Kerberos options
  • UseDNS no :禁止使用DNS分解主机名,需要修改为no(非常重要)
  • Subsystem sftp /usr/libexec/openssh/sftp-server
  • 补充指令 
  • 限制可登入的用户
  • AllowUsers user1 user2 :允许使用ssh服务的用户白名单
  • AllowGroups group1 group2 :允许使用ssh服务的用户组白名单
  • DenyUsers user1 user2:禁止的黑名单
  • DenyGroups group1 group2
  • 改了脚本需要重启服务 
  • CentOS 6:/etc/rc.d/init.d/sshd
  • CentOS 7:/usr/lib/systemd/system/sshd.service
  • 作业题
(1)不要使用默认的端口;修改方式
    port 2222
(2)不要支持使用第一版协议
    protocal 2
(3)限制可以登入的用户
 AllowUsers, AllowGroups
(4)设定空闲会话超时时长
(6)仅仅监听于指定的IP地址
 ListenAddress 
(7)基于口令认证时,使用强密码策略
 openssl rand -base64 30
(8)最好基于密钥的认证
(9)禁止使用空密码
(10)禁止管理员直接登入
(11)限制ssh的访问频道和并发在线
(12)做好日志分析

二:FTP协议与vsftpd服务(必须掌握)

前言:ftp:文件传输协议, 属于应用层协议。vsftpd服务是ftp协议的一种实现

(一)FTP协议详解
  • ftp 协议:明文的协议,数据传输过程中不加密,可以使用抓包工具拿到数据
  • 21/tcp(监听连接请求) 20/tcp(传输数据)
  • 服务端实现ftp协议的程序:vsftpd , pureftpd , proftpd , Filezilla Server
  • 客户端实现ftp协议的程序: 
  • linux :ftp客户端 , lftp 客户端
  • ftp 使用匿名用户登入 
  • ftp 192.168.23.12 用户名为:anonymous,密码为空即可
  • ftp 使用本地用户登入 
  • ftp 192.168.23.12 用户名为:yhy,密码为:123456
  • lftp 使用匿名用户登入 
  • lftp 192.168.23.12
  • lftp 使用本地用户登入 
  • lftp -u yhy,123456 192.168.23.12
  • windows :cuteftp, Filezilla,flashfxp(了解)
  • ftp的连接类型
  • 命令连接:传输指令
  • 客户端发出请求,服务端响应
  • 数据连接:传输数据
  • 注意:数据连接必然是通过某个命令连接发起的
  • 主动连接模式(port):服务器向客户端发起数据传输请求
  • 服务器端口:固定
  • 被动连接模式(pasv):客户端向服务器端发起数据传输请求 
  • 服务器端口:随机
  • 数据传输格式
  • ASCLL码传输
  • binary传输
  • 用户分类(必须掌握)
  • 1:匿名用户(映射到某个固定的系统用户):ftp用户 或者 vsftp用户请求的资源应该在/var/ftp目录下,登入的时候不需要用户名和密码
  • 2:本地用户(系统用户和普通用户):系统用户和普通用户,登入的时候需要用户名和密码
  • 3:虚拟用户:不是系统/etc/passwd里面的用户,而是文件系统上某个目录的某个文件中指定的用户,或者是一些存储系统上的某个用户(也是映射到某个本地用户)
  • snswitch服务:name service switch
  • Pam服务
  • Openldap服务(非常适合存储账号和密码)
  • 注意:资源位于ftp服务器某个用户的家目录下,那么其实我们访问资源就是访问某个用户家目录下的资源
  • vsftpd:非常安全的ftp服务端程序(必须掌握)
  • 主程序:/usr/sbin/vsftpd
  • 主配置文件:/etc/vsftpd/vsftpd.conf
  • CentOS 6
  • /etc/rc.d/init.d/vsftpd
  • chkconfig vsftpd on
  • CentOS 7
  • /usr/lib/systemd/system/vsftpd.service
  • systemctl enable vsftpd.service
  • 配置过程详解
  • /etc/vsftpd/vsftpd.conf可以使用man vsftpd.conf查看指令的定义
  • 匿名用户
  • anonymous_enable=yes 是否允许匿名用户登入
  • anon_upload_enable=yes 是否允许匿名用户上传文件, 同时需要开启write_enable=yes
  • write_enable=yes 如果匿名用户要上传,必须是write_enable=YES,这是一个全局配置
  • anon_mkdir_write_enable=yes 使得匿名用户能够在有目录中有写权限的基础上能够创建目录
  • anon_other_write_enable=yes 匿名用户的删除和重命名权限
  • 本地用户
  • local_enable=yes 开放本地用户登入,并且所有的非匿名用户登入必须开启这个指令才能登入
  • local_umake=022 指定本地用户上传权限的掩码
  • dirmessage_enable=YES 用户第一次进入目录时,.massage文件里面的信息会显示给用户,可以使用message_file指定文件的路径,而不使用默认的.message,但是lftp程序无法看到消息提示,ftp程序可以
  • 数据传输日志的相关日志
  • xferlog_enable=YES
  • xferlog_std_format
  • xferlog_file=/var/log/vsftpd.log 指定访问日志的存放路径
  • 数据传输模式
  • connect_from_port_20:是否启用被动模式
  • 修改匿名用户上传文件的属主
  • chown_uploads:是否修改
  • chown_username:启用chown_uploads指令时,将文件属主修改为此命令指定的用户,默认为root
  • chown_upload_mode:匿名用户上传文件完成后文件的权限默认为600
  • 设定会话的超时时长
  • idle_session_timeout :空闲会话的超时时长,默认是300秒
  • connect_timeout:服务器连接客户端的超时时长
  • data_connection_timeout:数据传输的超时时长
  • 命令连接的监听端口
  • listen_port :默认是21
  • 当匿名用户连接到ftp服务端是否显示banner信息,只有ftp客户端可以,lftp不行
  • ftpd_banner=Welcome to blah FTP service.
  • 设置连接及传输速率
  • local_max_rate:本地用户的传输速率,默认是0,表示无限制
  • max_clients:最大并发连接数,最多允许多少个客户端连接
  • max_per_ip:每个IP允许的最大连接数
  • anno_max_rate:本地用户的传输速率,默认是0,表示无限制
  • 禁锢本地用户
  • chroot_local_user=YES:禁锢所有本地的用户,将用户锁定在其家目录下 
  • 注意:要求用户不能够对家目录有写权限,如果具有写权限的话,那么本地用户登入ftp的时候就会连接拒绝了(禁锢所有的本地用户和禁锢白名单不能同时开启)
  • chroot_list_enable=yes : 是否开启禁锢的白名单
  • chroot_list_file=/etc/vsftpd/chroot_list:如果写在这个文件里面的本地用户都会被禁锢,而没有在这个文件里面的本地用户不会被禁锢
  • /etc/vsftpd/ftpusers:指定哪些本地用户无法登入
  • 是本地用户的黑名单,如果在这个名单里面的用户无法登入
  • userlist_enable :是否开启本地用户登入认证
  • 如果userlist_enable=YES,vsftpd将加载一个由userlist_file指定的用户列表文件,此文件中的用户是否能够访问vsftpd服务取决于userlist_deny这个指令,且用户写在/etc/vsftpd/user_list文件中
  • 如果userlist_deny=yes,表示此列表为黑名单,表示列表中的用户不能登入
  • 如果userlist_deny=no,表示此列表为白名单, 表示只有列表中的本地用户才能登入
  • 虚拟用户(先给大家入门一下mysql数据库服务)
  • 基于db文件
  • /etc/vsftpd/vusers.txt文件
  • 奇数行:用户名
  • 偶数行:密码
  • 基于mysql服务
  • 编译安装pam-mysql
  • yum groupinstall -y “Development tools” “Server Platform Development”
  • yum install -y pam-devel openssl-devel mariadb-devel
  • cd pam-mysql
  • ./configure --with-mysql=/usr --with-openssl=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
  • make && make install (只要存在/lib64/security/pam_mysql.so文件,说明编译成功)
  • 为了演示pam认证,将以前的/etc/vsftpd/vsftpd.conf还原
  • 在mysql数据库上的操作写如下
1:将mariadb的配置文件中加入
skip_name_resolve=on
innodb_file_per_table=on

2:先执行mysql_secure_installation命令,给root用户初始化,在启动mariadb
mysql_secure_installation
systemctl start mariadb.service

3:登入Mariadb,先创建一个vsftpd数据库,在创建一个vsftpd用户,
create database vsftpd;
use vsftpd;
grant all on *.* to vsftpd@'192.168.23.%' identified by '123456';

4:在vsftpd数据库中创建一张users表,用户虚拟用户的认证
create table users (id int auto_increment not null primary key, name varchar(30), password char(48)binary);

5:给表先插入值
insert into users(name,password) values ('tom', password('123456'));
insert into users(name,password) values ('yhy', password('123456')); 

6:查看表
select * from users;
  • 编辑/etc/vsftpd/vsftpd.conf文件, 在文件最下方有一条指令pam_service_name=vsftpd,重新指定一个新的认证文件
pam_service_name=vsftpd.mysql   # 表示vsftpd的虚拟用户默认就是使用vsftpd.mysql文件进行的认证
  • 因为,原有的vsftpd文件的认证太复杂,因此,自己创建一个/etc/pam.d/vsftpd.mysql 文件。且文件的内容如下
# 第一行auth表示使用mysql进行虚拟用户的认证
auth required pam_mysql.so user=vsftpd passwd=123456 host=192.168.23.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

# 第二行使用account表示认证用户存在
account required pam_mysql.so user=vsftpd passwd=123456 host=192.168.23.12 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
  • 由于虚拟用户也是映射为系统用户进行登入的,那么使用虚拟用户之前,需要先创建系统用户
# 使用/ftp/data作为虚拟用户的家目录,虚拟用户映射的系统用户为vuser
mkdir  /ftp
useradd -s /sbin/nologin -d /ftp/data vuser

chmod go+rx /ftp/data

# 默认虚拟用户是被禁锢在家目录下的,因此不能对家目录有写权限
chmod -w /ftp/data
  • 编辑/etc/vsftpd/vsftpd.conf文件,在pam_service_name=vsftpd.mysql指令上面添加
# 实现虚拟用户到系统用户的映射关系
guest_enable=YES
guest_username=vuser
  • 重启服务
systemctl restart vsftpd.service
  • 再使用ftp进行测试,登入成功
ftp> [root@nds1 ~]# ftp 192.168.23.12
Connected to 192.168.23.12 (192.168.23.12).
220 (vsFTPd 3.0.2)
Name (192.168.23.12:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
  • 如果要使得虚拟用户具有上传的权限,那么需要完成两步
# 使虚拟用户映射的vuser对upload具有写权限
mkdir /ftp/data/upload
chown vuser /ftp/data/upload

# 开启匿名用户上传功能, 编辑/etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
  • 使用ftp客户端进行测试:测试成功
  • 客户端使用lftp测试登入用户
  • lftp -u centos,123456 192.168.10.215(使用本地用户登入)
  • lftp 192.168.10.215(使用匿名用户登入)
  • 总结 
  • ftp:命令连接,数据连接(port,pasv)
  • vsftpd:/etc/vsftpd/vsftpd.conf
  • 用户类型 
  • 匿名用户
  • 本地用户 
  • 禁锢
  • 黑名单
  • 白名单
  • 虚拟用户 
  • 权限
  • 博客:vsftpd 基于pam_msyql的虚拟用户机制
  • vsftpd实战(服务端192.168.23.12,客户端192.168.23.11)
1:安装vsftpd
yum install -y vsftpd

2:客户端安装lftp
yum install -y lftp

3:在服务端创建一个用户yhy,密码为123456
useradd yhy
echo "123456" | passwd --stdin yhy

4:使用lftp登入
lftp -u yhy,123456 192.168.23.12
  • 使得匿名用户可以上传文件的条件
1:在服务端开启
anonymous_enable=yes 
anon_upload_enable=yes
write_enable=yes

2: 在服务端修改/var/ftp目录的属主为ftp用户,使得匿名用户在此目录下有写权限
chmod ftp /var/ftp
  • 使得匿名用户可以创建目录的条件
在服务端开启
anon_mkdir_write_enable=YES
  • 使得匿名用户可以删除文件的条件
anon_other_write_enable=yes

三:NFS网络文件系统(必须掌握)

前言:NFS即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
rpcbind是nfs进行共享本地文件系统的时候调用的服务。rpcbind监听在TCP的111端口上

  • 安装NFS
yum install -y nfs-utils
  • 启动NFS服务
  • CentOS 6 
  • service rpcbind start
  • service nfs start
  • CentOS 7 
  • systemctl start nfs.service
  • 网络文件系统的机制
  • 应用层对内核发起系统调用,内核的接口接受到系统调用的时候,并不在本地执行系统调用的代码,而是将这段代码通过网络发送给监听在另一台主机上的套接字程序,使得这段代码在另一台主机中的内核执行,并访问另一台主机上的块设备,之后再将结果原路返回给发起网络请求的主机。
  • PC:procedure call
  • RPC :remote procedure call 
  • rpc.mountd:主要用户完成认证机制和给远程的主机发放挂载令牌
  • rpc.lockd
  • prc.statd
  • (1)服务端安装nfs-utils,服务端的程序名就叫nfs
  • (2)编辑/etc/exports文件,指定允许挂载共享文件系统的主机
  • 一般每一行的格式为:共享目录 给哪个网段共享(选项1 , 选项2)
  • 例如:/data 192.168.0.0/16(rw) 将本地的/data目录共享给192.168网段的主机挂载,并且有读写权限
  • (3)重新导出文件系统,让内核重读/etc/exports文件,不需要重启nfs服务
  • exportfs -r (重新导出export list)
  • (4)在客户端查看导出的共享文件系统 
  • showmount -e 192.168.10.202
  • (5)客户端挂载远端共享的文件系统 
  • mount -t nfs 192.168.10.202:/data /web/html
  • (6)客户端通过文件系统挂载信息查看 
  • df -h 或 mount
  • (7)在服务端设置共享文件系统目录的访问权限 
  • 1:可以直接设置chmod
  • 2:可以通过setfacl 来设置 
  • setfacl -m u:archlinux:rwx /data (如果archlinux的uid为2000)
  • (8)在客户端有一个本地用户hadoop,其uid也为2000 
  • su - hadoop
  • 那么hadoop就能够在/web/html目录有读写权限(因为在/etc/exports文件中对于远端的主机只有读写权限)
  • 对于/etc/exports文件中,指定客户端访问的权限字段说明
  • 主机名格式(大多使用的是IP) 
  • 单个主机:ipv4 , ipv6 , FQDN
  • IP networks : 两种掩码格式均支持,例如:192.168.0.0/255.255.0.0 或者 192.168.0.0/16
  • wildcards:主机名通赔,例如:*uplooking.com
  • netgroups:NIS域内的主机组,@group_name
  • anonymous:使用* 表示所有的客户端主机
  • General Options 
  • rw:读写权限
  • root_squash:压缩root用户的权限
  • no_root_squash:不压缩root用户的权限
  • all_squash:压缩所有的用户
  • anonuid and anongid:映射至哪个用户
  • ro:只读
实战作业:
(1)nfs-server中导出/web/html ,客户端以此目录为其httpd服务的虚拟主机的根文档目录,并部署wordpress做测试
(2)nfs-server中导出/data目录,客户端以此目录为Mariadb的数据库目

四:rsync 远程同步工具(必须掌握)

前言:rsync是类unix系统下的数据镜像备份工具,可以镜像保存整个目录树和文件系统,可以很容易做到保持原来文件的权限、时间、软硬链接等等。
rsync同样属于C/S架构模型,服务端守护进程始终监听于873端口
对比rsync命令与scp命令的优劣性

  • rsync有六种不同的工作模式介绍
  • 1:拷贝本地文件;类似于cp命令
  • rsync grub.conf /data/
  • 2:使用一个远程shell程序(如rsh、ssh)将本地拷贝到远端主机的某个目录下 
  • rsync -avz grub.conf root@192.168.23.12:/data
  • 3:使用一个远程shell程序(如rsh、ssh)将远端主机的文件拉到本地的某个目录下 
  • rsync -avz root@192.168.23.12:/data/grub.conf /tmp/
  • 4:将远程rsync服务器中的文件拷贝到本地目录 
  • /usr/bin/rsync -avz --delete nfs@192.168.23.26::data /data/ --password-file=/etc/rsync.password
  • 5:将本地目录文件拷贝到远程rsync服务器中(非常重要)
  • /usr/bin/rsync -avz --delete /data/ nfs@192.168.23.26::data --password-file=/etc/rsync.password
  • 6:列出远程机的文件列表, 这类似于rsync传输
  • rsync命令格式
(一) Local:  rsync [OPTION...] SRC... [DEST]

 例如: rsync -avz /root/   /tmp/    # 将/root目录下的所有文件拷贝到/tmp目录下,默认是增量拷贝
 例如: rsync -avz --delete /root/   /tmp/    # 增加--delete选项,指明在增量拷贝的基础上全量拷贝,也就是说/root目录下有的文件,/tmp目录下要有,/root目录下没有的文件,/tmp目录下要将文件删除。最后表现为/tmp目录的文件与/root目录的文件一样


(二)Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

 例如:rsync -avz --delete -e "ssh -p 22" /tmp/ 192.168.23.26:/tmp # 通过ssh加密,使得192.168.23.26主机上的/tmp目录下的所有文件与本机的/tmp目录下的文件一样
 说明: 如何是本地拉取的话,如命令格式所示,源地址与目标地址需要调换一下位置


(三)Access via rsync daemon:
 Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
 Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
 rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

 例如:rsync -avz --delete /tmp/ rsync_backup@192.168.23.26::backup --password-file=/etc/rsync.password # 在daemon模式下,客户端将本地的/tmp目录下的所有文件推送到192.168.23.26主机的backup模块指定的目录中去
 例如:rsync -avz --delete rsync_backup@192.168.23.26::backup --password-file=/etc/rsync.password /tmp/ # 这就是将远端的拉倒本地的/tmp目录下
  • 重要选项介绍
-a: --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性
-v: --verbose 详细模式输出
-r: --recursive 对子目录以递归模式处理
-z: --compress 对备份的文件在传输时进行压缩处理
--delete :无差异拷贝
--exclude=somefile 指定排除不需要传输的文件模式
  • rsync的启动方式分
1:以守护进程的方式启动
/usr/bin/rsync --daemon

2:托管给xinetd服务,由xinetd代为管理
编辑 /etc/xinetd.d/rsync文件
将disable = no改为disable = yes
重启xinetd服务
此时可以看到xinetd服务监听在873端口上
  • rsync服务端配置(必须掌握)
0:创建一个/data目录,用来指定接受rsync客户端推送的文件
mkdir /data

1:编辑/etc/rsyncd.conf主配置文件
# 指定访问本地共享目录的属主和属组,当客户端连接到服务端,那么进程就以这里指定的uid和gid运行
uid = rsync
gid = rsync
# 不禁锢
 use chroot = no
# 指定服务端最大并发连接数量
 max connections = 2000
# 指定超时时长
timeout = 900
# 指定程序的pid路径
 pid file = /var/run/rsyncd.pid
# 指定日志路径
 log file = /var/log/rsyncd.log
# 指定文件系统锁路径
 lock file = /var/run/rsyncd.lock
# 指定推送时出现错误忽略
 ignore errors
# 指定客户端可以向服务端推送数据,因此必须是可读写
 read only = false
# 关闭远程列表
list = false
# 指定允许连接rsync服务端的网络地址
 hosts allow = 192.168.23.0/24
 hosts deny = 0.0.0.0/32
# 启用虚拟用户(无需是系统用户),虚拟用户的意义在于用户名和密码认证
 auth users = hello
# 指定用户名和密码的文件,这个文件里面的用户名就是auth users指定的用户名,然后给个密码就好
 secrets file = /etc/rsync.password
#transfer logging = yes
#ignore nonreadable = yes
#dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

# 指定一个模块,用来指定接受客户端推送的文件
 [data]
path = /data
comment = shared remoted NFS directory /data


2:创建一个rsync, 设置/data目录的属主为rsync,创建虚拟用户和密码
useradd rsync -s /sbin/nologin -M # 在rsync服务端一个rsync用户,不能登入,不创建家目录
chown -R rsync /data # 修改/data目录的属主为rsync,这样rsyncd进程就能够向目录里面写数据
echo "hello:123456" > /etc/rsync.password # 由于在/etc/rsyncd.conf主配置文件中指定了客户端登入的用户名以及密钥文件路径,那么根据路径创建用户密码即可
chmod 600 /etc/rsync.password # 修改密码文件的权限,注意,这里的客户端和服务端的/etc/rsync.password文件的权限都需要修改,且文件的属主和属组都是root,因为没有禁锢root。

3:配置rsync服务配置进程文件/etc/sysconfig/rsyncd
OPTIONS="--address=192.168.23.12" # 将rsync服务监听到固定的IP地址上
  • rsync客户端配置(必须掌握)
1:创建同步时候使用的密钥文件
echo "123456" > /etc/rsync.password

2:修改密钥文件的权限为600
chmod 600 /etc/rsync.password

2:手动同步本地的/data/目录的所有文件到rsync服务端
/usr/bin/rsync -avz --delete /data/ hello@192.168.23.12::data --password-file=/etc/rsync.password

五:inotify 工具(必须掌握)

前言:Inotify是一种强大的、细粒度的、异步文件系统监控机制,它满足各种各样的文件监控需要,可以监控文件系统的访问属性、读写属性、权限属性、删除创建、移动等操作,也就是可以监控文件发生的一切变化。
inotify-tools是一个C库和一组命令行的工作提供Linux下inotify的简单接口。inotify-tools安装后会得到inotifywait和inotifywatch这两条命令
inotifywait命令可以用来收集有关文件访问信息,Linux发行版一般没有包括这个命令,需要安装inotify-tools,这个命令还需要将inotify支持编译入Linux内核,好在大多数Linux发行版都在内核中启用了inotify。
inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。
inotifywait+rsync实现监控某目录于文件系统级别的任何变化

  • 1:安装inotify-tools监控工具
yum install -y inotify-tools
  • 2:查看inotify-tools包的工具程序
[root@dns3 ~]# rpm -ql inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
/usr/lib64/libinotifytools.so.0
/usr/lib64/libinotifytools.so.0.4.1
/usr/share/doc/inotify-tools-3.14
/usr/share/doc/inotify-tools-3.14/AUTHORS
/usr/share/doc/inotify-tools-3.14/COPYING
/usr/share/doc/inotify-tools-3.14/ChangeLog
/usr/share/doc/inotify-tools-3.14/NEWS
/usr/share/doc/inotify-tools-3.14/README
/usr/share/man/man1/inotifywait.1.gz
/usr/share/man/man1/inotifywatch.1.gz
  • 3:inotifywait使用格式介绍
示例:
inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %w %f' -e modify,delete,create,attrib /data

选项:
 -m:表示持续监视变化。 
 -r:表示使用递归形式监视目录。 
 -q:表示减少冗余信息,只打印出需要的信息。 
 -e:表示指定要监视的事件列表。 
 --timefmt是指定时间的输出格式。 
 --format指定文件变化的详细信息。其中 %w:表示监听的目录,%f表示触发事件的文件

事件:
 access 访问,读取文件。 
 modify 修改,文件内容被修改。 
 attrib 属性,文件元数据被修改。 
 move 移动,对文件进行移动操作。 
 create 创建,生成新文件 
open 打开,对文件进行打开操作。 
close 关闭,对文件进行关闭操作。 
 delete 删除,文件被删除。
  • 实战作业
写一个脚本
(1)在rsync的服务端有一个/data/用作rsync客户端的备份目录

(2)rsync客户端也存在一个/data/目录,且目录中有大量的数据库文件。使用inotifywait工具监听/data目录的变化,一旦/data/目录发生变化,立即调用rsync客户端工具实现/data/目录的无差异同步

(3)手动在rsync客户端的/data/目录中创建文件,看看rsync的客户端和服务端的/data/目录是否实时同步

(4)所有的搭建步骤使用脚本一键完成

六:Samba(必须掌握)

前言:为了实现Windows主机与Linux服务器之间的资源共享,Linux操作系统提供了Samba服务,Samba服务为两种不同的操作系统架起了一座桥梁,使Linux系统和Windows系统之间能够实现文件系统通信共享
smb协议:Server Message Block 它能被用于Web连接和客户端与服务器之间的信息沟通
cifs协议:Common Internet File System 它使程序可以访问远程Internet计算机上的文件并要求此计算机提供服务,CIFS可以看做是应用程序协议如文件传输协议和超文本传输协议的一个实现

  • Samba的功能 
  • 文件系统共享
  • 打印机共享
  • NetBIOS协议
  • 安装服务端程序包: yum install -y samba
  • nmbd程序:给windows系统提供共享服务
  • smbd:实现文件系统服务,如果是给windows主机提供共享服务,那么nmbd和smbd都需要启动,如果只给linux提供服务,那么只需要启动smbd就行
  • 主配置文件:/etc/samba/smb.conf
  • CentOS 6 : 
  • 1:service smb start
  • 2:service nmb start
  • CentOS 7: 
  • 1:systemctl start smb.service
  • 2:systemctl start nmb.service
  • 客户端程序包:samba-client
  • smbclient:交互式命令行客户端
  • mount -t cifs 远端IP地址:/data /mnt 可以直接提供挂载,因此就不需要交互式工具smbclient了
  • 监听的端口:137/udp , 138/udp , 139/tcp , 445/tcp
  • Samba服务的配置 
  • /etc/samba/smb.conf
  • 两类配置段 
  • 全局配置 
  • [global]
  • 每共享的专用配置 
  • [共享资源的共享名称]
  • 全局配置保留默认配置无需修改
  • workgroup = 
  • 当前Samba主机所属的工作组
  • netbios name = 
  • 当前Samba主机的netbios名称
  • server string = 
  • 主机注释
  • display charset = 
  • 当前Samba服务器所用的字符集
  • unix charset = 
  • 当前linux主机所用的字符集
  • dos charset = 
  • windows 端的字符集
  • interfaces = 
  • 当前服务器Samba主机监听的IP地址或网络接口
  • hosts allow = 
  • 客户端来源白名单
  • log file = 
  • 日志文件路径
  • max log size = 
  • 日志文件的体积上限,定位是kB
  • Standalone Server Options
  • security = user 
  • 设定安全级别的,取值为一下三者之一 
  • share:匿名共享
  • user:使用Samba服务自我管理的账号和密码进行用户认证,用户必须是操作系统用户,密码非为os的密码,而是访问Samba服务的专用密码
  • domain:使用DC进行用户认证
  • passwd backend = tbdsam 
  • 密码库文件的格式
  • 共享配置
[共享名称]:此名称即为共享服务名称
comment:注释信息
path:共享的文件系统的路径
    browseable:是否能够被所有用户看到
    writable:是否可写 指明所有的用户都用写权限
read only:是否为只读
public:是否是公开的服务
 guest ok:是否允许来宾账号访问
 writelist:可写用户或组列表 仅仅只有指定的用户或组内的用户有写权限,不能和writable同时使用。例如:
 writelist=用户名
 writelist=@组
  • 可用的宏列表(可以写在comment里面,作为变量替换)
  • %m:客户端主机的NetBIOS名称
  • %M:客户端的Internet主机名,及hostname
  • %H:当前用户的家目录
  • %U:当前用户的用户名
  • %g:当前用户所属的组名
  • %h:当前Samba主机的hostname
  • %I:客户端的主机IP
  • %T:当前的日期的时间
[data]
        comment = data %H
 path = /data
 guest ok = Yes
 write list = @uplooking
 read only = no

# 客户端查看的时候,可以查看到宏替换的yhy的家目录
smbclient -L 192.168.23.12/data -U yhy
  • Samba提供一个ftp匿名用户可以访问共享目录
1:编辑/etc/samba/samba.conf配置文件
[ftp]
comment = ftp share
path = /var/ftp
 guest ok = Yes

2:语法检查
testparm /etc/samba/smb.conf

3:重新启动Samba服务
systemctl reload smb.service
  • 访问Samba共享
# 不要输入密码,输入密码就错误了
smbclient  //192.168.23.12/ftp
  • 将系统用户添加Samba密码,成为samba用户
  • useradd gentoo
  • smbpasswd -a gentoo
  • 交互式访问共享目录方式
  • smbclient -L Samba服务器IP -U 用户名 查看共享目录
  • 例如:smbclient -L 192.168.23.12 -U yhy
  • smbclient //Samba服务器IP -U 用户名 登入共享目录
  • 例如:smbclient //192.168.23.12/mysqldata -U yhy
  • 客户端的挂载访问方式
  • mount -t cifs -o username=yhy,password=123456 //192.168.23.12/mysqldata /mydata/data 其中:cifs为文件系统的类型、-o表示挂载选项、yhy为本地用户,密码为123456, mysqldata为Samba服务端的共享目录、/mydata/data为客户端的挂载点注意服务端的mysqldata共享目录的对应于服务端的文件系统的路径再samba.conf文件中定义了
  • 将系统用户添加为Samba用户
  • smbpasswd [选项] 用户名
  • -a:添加
  • -x:删除
  • -d:禁用
  • -e:启用
  • 访问Samba共享
  • linux
  • sbmclient:交互式命令行客户端程序
  • mount -t cifs:挂载文件系统
  • windows:
  • \IP地址\共享目录
  • pdbedit命令(了解)
  • 类似于smbpasswd,用户管理本地用户成为samba用户
  • pdbedit -L :查看samba已经添加的用户
  • pdbedit -L -v :查看samba已经添加的用户的详细信息
  • pdbedit -a -u hadoop:将hadoop添加为samba用户
  • smbstatus命令(了解)
  • 显示samba服务被哪些客户端访问
  • -b:显示简要格式信息
  • -v:显示详细格式信息
  • 实战演练1(必须掌握)
  • 需求:在Samba服务端创建一个/ftp/data共享目录,且让centos和geetoo用户可读可写。在Samba客户端挂载这个共享目录,挂载点为也为/ftp/data。挂载完毕后,在挂载点测试创建文件和删除文件
(一):在samba的服务端设置
(1)先在本地文件系统上创建目录 
    mkdir -pv /ftp/data
(2)编辑samba的主配置文件/etc/samba/smb.conf 添加共享目录data
 [data] 
 comment = ftp data 
 path = /ftp/data 
 write list = centos,gentoo 
 public = no
(3)创建本地登入用户centos 和 gentoo 
 useradd centos
 useradd geetoo
(4)将centos用户和gentoo用户设置samba密码 
 smbpasswd -a centos
 smbpasswd -a geetoo
(5)给共享目录映射的文件系统设置读写权限 
 setfacl -m u:centos:wrx /ftp/data/
 setfacl -m u:gentoo:wrx /ftp/data/
(6)检查主配置文件语法,并查看配置信息 
 testparm

(二)在samba的客户端设置(192.168.23.11) 
(1)查看共享目录 
 smbclient -L 192.168.23.12 -U centos
(2)访问共享目录 
 smbclient //192.168.23.12/data -U centos 看看用户是否有读写权限
(3)创建本地文件系统的挂载点 
 mkdir /ftp/data -pv
(4)挂载samba服务端的共享目录 
 mount -t cifs -o username=centos,password=123456 //192.168.23.12/data /ftp/data
  • 实战演练2(必须掌握)
  • 创建一个/data目录,使得/data目录被Samba共享,且创建一个系统组为uplooking组,让uplooking组在/data目录具有可写权限,再创建一个普通用户yhy,yhy属于uplooking组,且被添加到Samba用户中
1: 创建组和用户,将yhy用户添加到Samba用户里
    useradd yhy
    groupadd uplooking
    usermod -aG uplooking yhy
    smbpasswd -a yhy

2:创建共享目录,编辑/etc/samba/smb.conf文件添加
[data]
 comment = data share
 path = /data
 guest ok = Yes
 read only = No
 write list = @uplooking

3:创建共享目录,设置yhy具有写权限
mkdir /data
setfacl -m user:yhy:rwx /data

4:使用yhy用户登入
smbclient //192.168.23.12/data -U yhy

# 上传
put yhy100

# 下载
get yhy100
  • 实战练习
  • 创建一个共享uplooking, 路径为/uplooking
  • 要求仅centos和gentoo能上传文件
  • 此路径对其它用户不可见
  • 并且实现客户端挂载