Centos下SFTP雙機高可用環境部署記錄

散盡浮華發表於2017-11-20

 

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。

下面說下SFTP+Keepalived雙機高可用方案部署記錄:
sftp-test01  172.16.51.191
sftp-test02  172.16.51.192
VIP          172.16.51.193

一、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.191、使用者名稱mysftp、密碼mysftp、埠(預設為22埠)連線SFTP伺服器。
連線後,預設的路徑是/data/sftp/mysftp

二、sftp-test02伺服器需要和上面sftp-test01一樣的操作!

三、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檔案)


四、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雙向實時同步造成的。

調整後的新方案:
編寫一個監控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只讀賬號================

原則上來說,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.i

通過/data/script/readftp_monit.sh指令碼可知, /data/sftp/readftp/upload下的檔案目錄許可權都是同步/data/sftp/mysftp/upload的.
所以正確做法: 保證/data/sftp/mysftp/upload下的目錄一直是755許可權

[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
done

調整後, 只讀賬號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日常運維維護命令===============

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非預設埠的連線方法

相關文章