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非默認端口的鏈接方法
相關文章
相關標籤/搜索