Centos下SFTP双机高可用环境部署记录

 

SFTP(SSH File Transfer Protocol),安全文件传送协议。有时也被称做 Secure File Transfer Protocol 或 SFTP。它和SCP的区别是它容许用户中断传输,SCP拷贝速度稍快一些。SFTP能够为传输文件提供一种安全的加密方法。SFTP与FTP有着几乎同样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至Blogger伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫做SFTP的安全文件传输子系统,SFTP自己没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的链接操做,因此从某种意义上来讲,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP一样是使用加密传输认证信息和传输的数据,因此,使用SFTP是很是安全的。可是,因为这种传输方式使用了加密/解密技术,因此传输效率比普通的FTP要低得多,若是您对网络安全性要求更高时,可使用SFTP代替FTP。node

下面说下SFTP+Keepalived双机高可用方案部署记录:
sftp-test01  172.16.51.191
sftp-test02  172.16.51.192
VIP          172.16.51.193

1、sftp-test01服务器操做:
1)查看openssh的版本
使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本须要升级。
[root@sftp-test01 ~]# ssh -V   
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

2)建立sftp组
[root@sftp-test01 ~]# groupadd sftp 

3)建立一个sftp用户,用户名为mysftp,密码为mysftp
修改用户密码和修改Linux用户密码是同样的。
[root@sftp-test01 ~]# useradd -g sftp -s /bin/false mysftp
[root@sftp-test01 ~]# passwd mysftp

4)sftp组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个mysftp目录,而后指定mysftp的home为/data/sftp/mysftp
[root@sftp-test01 ~]# mkdir -p /data/sftp/mysftp  
[root@sftp-test01 ~]# usermod -d /data/sftp/mysftp mysftp 

5)配置sshd_config,这个配置里的sftp要严格按照下面的配置来操做,不然重启sshd服务后,会形成sftp登陆成功,但ssh远程登陆失败的现象!
修改或添加下面配置。  能够直接下载sshd_config配置进行使用。下载地址:https://pan.baidu.com/s/1o3ILTiC7nClF9NxCmS8YHw    提取密码:de3x
[root@sftp-test01 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak2
[root@sftp-test01 ~]# vim /etc/ssh/sshd_config
......
#Subsystem  sftp  /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand    internal-sftp
AllowTcpForwarding no 
X11Forwarding no

设定Chroot目录权限
[root@sftp-test01 ~]# chown root:sftp /data/sftp/mysftp 
[root@sftp-test01 ~]# chmod 755 /data/sftp/mysftp

6)创建SFTP用户登入后可写入的目录
按照上面设置后,在重启sshd服务后,用户mysftp已经能够登陆。但使用chroot指定根目录后,根应该是没法写入的,因此要新建一个目录供mysftp上传文件。
这个目录全部者为mysftp,全部组为sftp,全部者有写入权限,而全部组无写入权限。
[root@sftp-test01 ~]# mkdir /data/sftp/mysftp/upload  
[root@sftp-test01 ~]# chown mysftp:sftp /data/sftp/mysftp/upload  
[root@sftp-test01 ~]# chmod 755 /data/sftp/mysftp/upload  

7)关闭防火墙
[root@sftp-test01 ~]# /etc/init.d/iptables stop
[root@sftp-test01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@sftp-test01 ~]# cat /etc/sysconfig/selinux 
.......
SELINUX=disabled

8)重启sshd服务
[root@sftp-test01 ~]# service sshd restart  
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]

9)验证sftp环境(如对sftp作白名单限制,则就是对sshd作白名单限制。能够在iptables里限制sshd的端口,也能够在/etc/hosts.allow里对sshd服务作限制)
以下显示,这说明SFTP已经搭建成功(若是ssh是非22端口,好比是6666端口,则链接命令:sftp -o port=6666 mysftp@172.16.51.191)
[root@sftp-test01 ~]# sftp mysftp@172.16.51.191
Connecting to 172.16.51.191...
The authenticity of host '172.16.51.191 (172.16.51.191)' can't be established.
RSA key fingerprint is c0:f5:1d:03:3b:00:4a:11:54:8c:a7:a3:6f:77:47:c7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.51.191' (RSA) to the list of known hosts.
mysftp@172.16.51.191's password: 
sftp> ls
upload  
sftp> cd upload
sftp> ls

10)使用FileZilla FTP Client链接SFTP服务器
输入主机IP地址172.16.51.19一、用户名mysftp、密码mysftp、端口(默认为22端口)链接SFTP服务器。
链接后,默认的路径是/data/sftp/mysftp

2、sftp-test02服务器须要和上面sftp-test01同样的操做!

3、sftp-test01和sftp-test02两台机器的/data/sftp目录作实时同步(rsync+inotify)
考虑到数据完整性和安全性,实施单向实时同步,即从sftp-test01机器的/data/sftp实时同步到sftp-test02的data/sftp
操做以下:
1)在目标服务器sftp-test02上的部署过程
安装配置rsync服务端
[root@sftp-test02 ~]# yum install rsync xinetd
[root@sftp-test02 ~]# vim /etc/xinetd.d/rsync 
......
   disable  = no
......

启动xineted服务
[root@sftp-test02 ~]#  /etc/init.d/xinetd start
Starting xinetd:                                           [  OK  ]

建立/etc/rsyncd.conf文件
[root@sftp-test02 ~]# vim /etc/rsyncd.conf
[root@sftp-test02 ~]# cat /etc/rsyncd.conf
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass
motd file = /etc/rsyncd.Motd

[sftp_upload]
path = /data/sftp
comment = sftp_upload
uid = root
gid = sftp
port=873
use chroot = no
read only = no
list = no
max connections = 200
timeout = 600
auth users = RSYNC_USER
hosts allow = 172.16.51.191

注意:权限不要搞错了!
上面填写的uid是root,gid是sftp,是由于/data/sftp/
[root@sftp-test02 ~]# ll -d /data/sftp
drwxr-xr-x 3 root root 4096 Nov 21 05:21 /data/sftp
[root@sftp-test02 ~]# ll /data/sftp/
total 4
drwxr-xr-x 3 root sftp 4096 Nov 21 07:28 mysftp

建立用户认证文件
[root@sftp-test02 ~]# vim /etc/rsync.pass 
RSYNC_USER:123456@rsync

设置文件权限,即rsyncd.conf和rsync.pass认证文件都是600权限!
[root@sftp-test02 ~]# chmod 600 /etc/rsyncd.conf
[root@sftp-test02 ~]# chmod 600 /etc/rsync.pass

重启rsync服务
[root@sftp-test02 ~]# /etc/init.d/xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@sftp-test02 ~]# lsof -i:873
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd  3797 root    5u  IPv6  16264      0t0  TCP *:rsync (LISTEN)

2)在源服务器172.16.51.191上的部署过程
[root@sftp-test01 ~]# yum install rsync xinetd
[root@sftp-test01 ~]# vim /etc/xinetd.d/rsync
......
   disable  = no
......
[root@sftp-test01 ~]# /etc/init.d/xinetd start 
Starting xinetd:                                           [  OK  ]
[root@sftp-test01 ~]# lsof -i:873
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xinetd  3444 root    5u  IPv6  15917      0t0  TCP *:rsync (LISTEN)

建立同步的密码文件,这个文件名能够跟服务端的认证文件不同,可是里面的密码必须一致!用于rsync同步命令中。
不过,最好两边的文件设置成同样,便于管理
[root@sftp-test01 ~]# cat /etc/rsync.pass
123456@rsync

设置rsync.pass密码文件为600权限
[root@sftp-test01 ~]# chmod 600 /etc/rsync.pass

查看服务器内核是否支持inotify,出现下面的内容,说明服务器内核支持inotify
[root@sftp-test01 ~]# ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Nov 21 08:12 max_queued_events
-rw-r--r-- 1 root root 0 Nov 21 08:12 max_user_instances
-rw-r--r-- 1 root root 0 Nov 21 08:12 max_user_watches

注意:Linux下支持inotify的内核最小为2.6.13,能够输入命令:uname -a查看内核
CentOS 5.X 内核为2.6.18,默认已经支持inotify
[root@sftp-test01 ~]# uname -a
Linux sftp-test01 2.6.32-696.13.2.el6.x86_64 #1 SMP Thu Oct 5 21:22:16 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

下面开始安装inotify-tools
[root@sftp-test01 ~]# yum install make gcc gcc-c++
[root@sftp-test01 ~]# cd /usr/local/src/
[root@sftp-test01 src]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[root@sftp-test01 src]# tar zxvf inotify-tools-3.14.tar.gz
[root@sftp-test01 src]# cd inotify-tools-3.14
[root@sftp-test01 inotify-tools-3.14]#  ./configure --prefix=/usr/local/inotify
[root@sftp-test01 inotify-tools-3.14]# make && make install

发现已经成功安装inotify-tools了
[root@sftp-test01 inotify-tools-3.14]# ll -d /usr/local/inotify/
drwxr-xr-x 6 root root 4096 Nov 21 08:14 /usr/local/inotify/

设置系统环境变量
[root@sftp-test01 inotify-tools-3.14]# vim /etc/profile
.......
export PATH=$PATH:/usr/local/inotify/bin
[root@sftp-test01 inotify-tools-3.14]# source /etc/profile

添加库文件
[root@sftp-test01 inotify-tools-3.14]# vim /etc/ld.so.conf
......
/usr/local/inotify/lib
[root@sftp-test01 inotify-tools-3.14]# ldconfig 

修改inotify默认参数(inotify默认内核参数值过小)
查看系统默认参数值
[root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_queued_events
fs.inotify.max_queued_events = 16384
[root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_watches
fs.inotify.max_user_watches = 8192
fs.epoll.max_user_watches = 796344
[root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_instances
fs.inotify.max_user_instances = 128

[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_queued_events="99999999"
fs.inotify.max_queued_events = 99999999
[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_watches="99999999"
fs.inotify.max_user_watches = 99999999
[root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_instances="65535"
fs.inotify.max_user_instances = 65535

参数说明:
max_queued_events:
inotify队列最大长度,若是值过小,会出现"** Event Queue Overflow **"错误,致使监控文件不许确
max_user_watches:
要同步的文件包含多少目录,能够用:find /Data/xqsj_upload -type d | wc -l 统计这些源目录下的目录数,必须保证max_user_watches值大于统计结果(这里/Data/xqsj_upload为同步的源文件目录)
max_user_instances:
每一个用户建立inotify实例最大值

接着执行同步操做:
在源服务器上执行rsync首次全量同步的操做(加--delete参数,保持目标目录和源目录下文件绝对一致)
[root@sftp-test01 ~]# rsync -avH --port=873 --progress --delete /data/sftp/ RSYNC_USER@172.16.51.192::sftp_upload --password-file=/etc/rsync.pass

待第一次rsync全量同步完成后,就进行rsync+inotify实时同步脚本操做。
实时同步脚本里添加的是--delete-before参数,而不是--delete参数(第一次全量同步时rsync用的参数),两者区别:
--delete参数:表示rsync同步前,暴力删除目标目录中的全部文件,而后再执行同步操做。
--delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录的多余文件,而后再执行同步操做。显然比--delete参数安全些。

[root@sftp-test01 data]# cd /data/script/
[root@sftp-test01 script]# vim sftp_data_rsync.sh
#!/bin/bash
SRCDIR=/data/sftp/
USER=RSYNC_USER
IP=172.16.51.192
DESTDIR=sftp_upload
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file
do
/usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done

[root@sftp-test01 script]# chmod 755 sftp_data_rsync.sh
[root@sftp-test01 script]# nohup sh sftp_data_rsync.sh &          //按ctrl+c结束
[1] 8807
[root@sftp-test01 script]# ps -ef|grep inotify
root      8808  8807  0 22:55 pts/0    00:00:00 /usr/local/inotify/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e close_write,modify,delete,create,attrib,move /data/sftp/
root      8811  8451  0 22:55 pts/0    00:00:00 grep inotify

这样,sftp-test01机器的/data/sftp目录下的文件就会自动实时同步到sftp-test02机器的/data/sftp目录下
注意:这是单向实时同步!若是要想作双向实时同步!那就须要在sftp-test02机器上再作个inotify监控脚本(同时,sftp-test01也要作个rsyncd.conf文件)


4、SFTP结合Keepalived作双机高可用
1)下载安装Keepalived(两台机器一样操做)
[root@sftp-test01 ~]# cd /usr/local/src/
[root@sftp-test01 src]# wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz
[root@sftp-test01 src]# tar -zvxf keepalived-1.3.2.tar.gz 
[root@sftp-test01 src]# cd keepalived-1.3.2
[root@sftp-test01 keepalived-1.3.2]# ./configure && make && make install
[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/src/keepalived-1.3.2/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
[root@sftp-test01 keepalived-1.3.2]# mkdir /etc/keepalived
[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
[root@sftp-test01 keepalived-1.3.2]# cp /usr/local/sbin/keepalived /usr/sbin/
[root@sftp-test01 keepalived-1.3.2]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

2)配置Keepalived.conf文件
[root@sftp-test01 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@sftp-test01 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
  
global_defs {
notification_email {
wangshibo@wangshibo.com
}
  
notification_email_from notice@wangshibo.com
smtp_server smtp.wangshibo.com
smtp_connect_timeout 30
router_id master-node
}
  
vrrp_script chk_sftp_port { 
    script "/data/chk_sftp.sh"  
    interval 2                 
    weight -5             
    fall 2               
    rise 1   
}
  
vrrp_instance VI_1 {  
    state MASTER 
    interface eth0
    mcast_src_ip 172.16.51.191
    virtual_router_id 51  
    priority 101        
    advert_int 1             
    authentication {         
        auth_type PASS         
        auth_pass 1111        
    }
    virtual_ipaddress {          
        172.16.51.193
    }
 
track_script {                      
   chk_sftp_port      
}
}


sftp-test02服务器做为backup端的Keepalived.conf配置以下:
[root@sftp-test02 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@sftp-test02 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
  
global_defs {
notification_email {
wangshibo@wangshibo.com
}
  
notification_email_from notice@wangshibo.com
smtp_server smtp.wangshibo.com
smtp_connect_timeout 30
router_id slave-node
}
  
vrrp_script chk_sftp_port { 
    script "/data/chk_sftp.sh"  
    interval 2                 
    weight -5             
    fall 2               
    rise 1   
}
  
vrrp_instance VI_1 {  
    state BACKUP
    interface eth0
    mcast_src_ip 172.16.51.192
    virtual_router_id 51  
    priority 99        
    advert_int 1             
    authentication {         
        auth_type PASS         
        auth_pass 1111        
    }
    virtual_ipaddress {          
        172.16.51.193
    }
 
track_script {                      
   chk_sftp_port      
}
}

编写sftp监控脚本(两台机器都要写)
[root@sftp-test01 keepalived-1.3.2]# vim /data/chk_sftp.sh
#!/bin/bash
counter=$(/etc/init.d/sshd status|grep running|wc -l)
if [ "${counter}" = "0" ]; then
    /etc/init.d/sshd start
    sleep 2
    counter=$(/etc/init.d/sshd status|grep running|wc -l)
    if [ "${counter}" = "0" ]; then
        /etc/init.d/keepalived stop
    fi
fi
[root@sftp-test01 keepalived-1.3.2]# chmod 755 /data/chk_sftp.sh

3)两台机器都要启动Keepalived
[root@sftp-test01 ~]# /etc/init.d/keepalived start
[root@sftp-test02 ~]# /etc/init.d/keepalived start

启动后发现sftp-test01已经有了vip资源
[root@sftp-test01 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 02:f6:cb:83:ad:03 brd ff:ff:ff:ff:ff:ff
    inet 172.16.51.191/24 brd 172.16.51.255 scope global eth0
    inet 172.16.51.193/32 scope global eth0
    inet6 fe80::f6:cbff:fe83:ad03/64 scope link 
       valid_lft forever preferred_lft forever


4)高可用测试:
-> 先关闭sftp-test01机器的Keepalived服务,发现vip资源就会自动漂到sftp-test02机器上继续提供服务。
   当sftp-test01机器的Keepalived服务恢复后,vip资源就会自动抢占回来。
-> 关闭sftp-test01机器的ssh服务,经过脚本会自动启动ssh服务,当启动失败后,会强制关闭Keepalived服务,从而实现vip资源的漂移!

注意:
在FileZilla客户端里使用172.16.51.193的vip进行链接。能够在FileZilla客户端的"文件"里创建"新站点",协议”SFTP
登录类型:正常

=====================================================================
发现上面双向实时同步的高可用方案实施后,文件上传到ftp目录下的状态有点问题,有的文件上传后大小变化严重以致文件损坏,没法打开!
后面将双向实时同步策略关闭,往单个机器上传文件就没问题,判断是rsync+inotify双向实时同步形成的。linux

调整后的新方案:
编写一个监控vip资源的脚本,当vip在哪台机器上时,就作这台机器到另外一台的rsync单向同步操做,而且后台一直运行这个脚本(经过循环语句保证脚本一直运行)
放弃原来的rsync+inotify双向实时同步脚本!

脚本内容以下:
中止以前的rsync+inotify实时监控脚本,而后作两台机器的相互信任关系。

1)第一台机器sftp-test01的操做
[root@sign-test01 ~]# cat /data/script/sftp_vip_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
  NUM=`ip addr|grep 172.16.51.193|wc -l`
  if [ $NUM -eq 0 ];then
     echo "vip is not at this server" >/dev/null 2>&1
  fi

  if [ $NUM -eq 1 ];then
     /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.192:/data/sftp/mysftp/
  fi

done


[root@sign-test01 ~]# chmod 755 /data/script/sftp_vip_monit.sh
[root@sign-test01 ~]# nohup sh /data/script/sftp_vip_monit.sh &      //按ctrl+c结束
[root@sign-test01 ~]# ps -ef|grep monit
root     10581 22167  0 19:42 pts/0    00:00:00 grep monit
root     15113     1  8 17:15 ?        00:13:00 sh sftp_vip_monit.sh

2)第二台机器sftp-test02
[root@sign-test02 ~]# cat /data/script/sftp_vip_monit.sh 
#!/bin/bash
while [ "1" = "1" ]
do
  NUM=`ip addr|grep 172.16.51.193|wc -l`
  if [ $NUM -eq 0 ];then
     echo "vip is not at this server" >/dev/null 2>&1
  fi

  if [ $NUM -eq 1 ];then
     /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.191:/data/sftp/mysftp/
  fi

done

[root@sign-test02 ~]# chmod 755 /data/script/sftp_vip_monit.sh
[root@sign-test02 ~]# nohup sh /data/script/sftp_vip_monit.sh &      //按ctrl+c结束
[root@sign-test02 ~]# ps -ef|grep monit
root     10581 22167  0 19:42 pts/0    00:00:00 grep monit
root     15113     1  8 17:15 ?        00:13:00 sh sftp_vip_monit.sh

=================建立sftp只读帐号================c++

原则上来讲,sftp帐号登陆后只能限定到其用户家目录下,即不能遍历除其家目录下以外的任何其余目录!
sftp添加只读帐号,这里我采用的方法以下(有些复杂,但经测试可用):
 
sftp-test01和sftp-test02两个节点机操做同样
[root@sftp-test01 ~]# useradd -g sftp -s /bin/false readftp
[root@sftp-test01 ~]# passwd readftp
 
[root@sftp-test01 ~]# mkdir /data/sftp/readftp
[root@sftp-test01 ~]# usermod -d  /data/sftp/readftp readftp
 
[root@sftp-test01 ~]# chown root:sftp /data/sftp/readftp
[root@sftp-test01 ~]# chmod 755 /data/sftp/readftp
 
# 注意将readftp下的upload目录权限设置成写帐号mysftp权限,这样readftp帐号登陆后就只有读权限。
[root@sftp-test01 ~]# mkdir /data/sftp/readftp/upload
[root@sftp-test01 ~]# chown mysftp:sftp /data/sftp/readftp/upload
 
因为上面已经编写了两个节点机关于/data/sftp/mysftp/目录的实时同步脚本sftp_vip_monit.sh
下面再在两台机器上编写:本机/data/sftp/mysftp/upload/到/data/sftp/readftp/upload/目录的实时同步脚本readftp_monit.sh
 
1)sftp-test01节点上
[root@sftp-test01 ~]# cd /data/script/
[root@sftp-test01 script]# vim readftp_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
  /usr/bin/rsync -e "ssh -p22" -avpgolr --delete-before /data/sftp/mysftp/upload/ /data/sftp/readftp/upload/
done
[root@sftp-test01 script]# nohup sh readftp_monit.sh &         #按ctrl+c结束
 
 
[root@sftp-test01 script]# ps -ef|grep monit
root      5285 17061  0 11:37 pts/0    00:00:07 sh readftp_monit.sh
root     22713 17061  0 10:42 pts/0    00:00:29 sh sftp_vip_monit.sh
root     28893 17061  0 12:00 pts/0    00:00:00 grep monit
 
2)sftp-test02节点上
[root@sftp-test02 ~]# cd /data/script/
[root@sftp-test02 script]# vim readftp_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
  /usr/bin/rsync -e "ssh -p22" -avpgolr --delete-before /data/sftp/mysftp/upload/ /data/sftp/readftp/upload/
done
[root@sftp-test02 script]# nohup sh readftp_monit.sh &         #按ctrl+c结束
 
 
[root@sftp-test02 script]# ps -ef|grep monit
root      5285 17061  0 11:37 pts/0    00:00:07 sh readftp_monit.sh
root     22713 17061  0 10:42 pts/0    00:00:29 sh sftp_vip_monit.sh
root     28893 17061  0 12:00 pts/0    00:00:00 grep monit
 
以上操做作,就能保证mysftp为写帐号,readftp为只读帐号,思路:
a)经过mysftp帐号登陆sftp服务后,能够进行上传、建立,删除和下载的读写操做,操做的文件存在在/data/sftp/mysftp/upload目录下,而后实时同步到
   /data/sftp/readftp/upload目录下。
b)经过readftp帐号登陆sfto服务器,只能进行下载的只读操做。因为/data/sftp/mysftp/upload为mysftp权限,没有写权限。并且就算能够进行写操做,写
  以后的文件放在/data/sftp/mysftp/upload目录下也会被覆盖掉(由于跟mysftp/upload单向实时同步的),也即写操做失败!

=========================只读帐号目录权限的坑========================
根据上面的操做完成后, 只读帐号readftp登陆后, 对于上传的目录下的文件看不到了!! 这是问什么呢??
这是由于readftp只读帐号登陆后的/data/sftp/readftp/upload/下上传的目录权限不够致使的! 应该赋予755权限.
[root@localhost ~]# ll /data/sftp/readftp/upload/
total 72
drwxr--r-- 2 rbn sftp 4096 Feb 28 13:23 20190225
drwxr--r-- 2 rbn sftp 4096 Feb 27 12:05 20190226
-rwxr--r-- 1 rbn sftp 54 Feb 26 16:52 dir.qdp.mvfc_appo_acct_dtl.20190224.000.00.i
-rwxr--r-- 1 rbn sftp 54 Feb 26 13:51 dir.qdp.mvfc_appo_acct_dtl.20190225.000.00.igit

经过/data/script/readftp_monit.sh脚本可知, /data/sftp/readftp/upload下的文件目录权限都是同步/data/sftp/mysftp/upload的.
因此正确作法: 保证/data/sftp/mysftp/upload下的目录一直是755权限github

[root@sftp-test01 script]# vim readftp_monit.sh
#!/bin/bash
while [ "1" = "1" ]
do
     /usr/bin/rsync -e "ssh -p22" -avpgolr --delete-before /data/sftp/mysftp/upload/ /data/sftp/readftp/upload/
     /bin/chmod -R 755 /data/sftp/mysftp
donevim

调整后, 只读帐号readftp登陆后,上传的目录权限应该是755就能够了
[root@localhost ~]# ll /data/sftp/readftp/upload/
total 72
drwxr-xr-x 2 rbn sftp 4096 Feb 28 13:23 20190225
drwxr-xr-x 2 rbn sftp 4096 Feb 27 12:05 20190226
-rwxr-xr-x 1 rbn sftp 54 Feb 26 16:52 dir.qdp.mvfc_appo_acct_dtl.20190224.000.00.i
-rwxr-xr-x 1 rbn sftp 54 Feb 26 13:51 dir.qdp.mvfc_appo_acct_dtl.20190225.000.00.i安全

================sftp平常运维维护命令===============bash

cd 路径                        更改到远程目录的路径
lcd 路径                       更改到本地目录的路径
chgrp group path               将文件path的组更改成group
chmod mode path                将文件path的权限更改成mode
chown owner path               将文件path的属主更改成owner
exit                           退出 sftp
help                           显示这个帮助文本
get 远程路径                    下载文件
ln existingpath linkpath       符号连接远程文件
ls [选项] [路径]                显示远程目录列表
lls [选项] [路径]               显示本地目录列表
mkdir 路径                     建立远程目录
lmkdir 路径                    建立本地目录
mv oldpath newpath            移动远程文件
open [用户@]主机[:端口]         链接到远程主机
put 本地路径                   上传文件
pwd                           显示远程工做目录
lpwd                          打印本地工做目录
quit                          退出 sftp
rmdir 路径                    移除远程目录
lrmdir 路径                   移除本地目录
rm 路径                       删除远程文件
lrm 路径                      删除本地文件
symlink existingpath linkpath    符号连接远程文件
version                          显示协议版本

===============================================================================
sftp mysftp@192.168.10.191                           #ssh是默认22端口的链接方法
sftp -o port=6666 mysftp@192.168.10.191              #ssh是6666非默认端口的链接方法
相关文章
相关标签/搜索