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。

  1. 下面说下SFTP+Keepalived双机高可用方案部署记录:
  2. sftp-test01 172.16.51.191
  3. sftp-test02 172.16.51.192
  4. VIP 172.16.51.193
  5.  
  6. 一、sftp-test01服务器操作:
  7. 1)查看openssh的版本
  8. 使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级。
  9. [root@sftp-test01 ~]# ssh -V
  10. OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
  11.  
  12. 2)创建sftp
  13. [root@sftp-test01 ~]# groupadd sftp
  14.  
  15. 3)创建一个sftp用户,用户名为mysftp,密码为mysftp
  16. 修改用户密码和修改Linux用户密码是一样的。
  17. [root@sftp-test01 ~]# useradd -g sftp -s /bin/false mysftp
  18. [root@sftp-test01 ~]# passwd mysftp
  19.  
  20. 4sftp组的用户的home目录统一指定到/data/sftp下,按用户名区分,这里先新建一个mysftp目录,然后指定mysftphome为/data/sftp/mysftp
  21. [root@sftp-test01 ~]# mkdir -p /data/sftp/mysftp
  22. [root@sftp-test01 ~]# usermod -d /data/sftp/mysftp mysftp
  23.  
  24. 5)配置sshd_config,这个配置里的sftp要严格按照下面的配置来操作,否则重启sshd服务后,会造成sftp登录成功,但ssh远程登录失败的现象!
  25. 修改或添加下面配置。 可以直接下载sshd_config配置进行使用。下载地址:https://pan.baidu.com/s/1o3ILTiC7nClF9NxCmS8YHw    提取密码:de3x
  26. [root@sftp-test01 ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak2
  27. [root@sftp-test01 ~]# vim /etc/ssh/sshd_config
  28. ......
  29. #Subsystem sftp /usr/libexec/openssh/sftp-server
  30. Subsystem sftp internal-sftp
  31. Match Group sftp
  32. ChrootDirectory /data/sftp/%u
  33. ForceCommand internal-sftp
  34. AllowTcpForwarding no
  35. X11Forwarding no
  36.  
  37. 设定Chroot目录权限
  38. [root@sftp-test01 ~]# chown root:sftp /data/sftp/mysftp
  39. [root@sftp-test01 ~]# chmod 755 /data/sftp/mysftp
  40.  
  41. 6)建立SFTP用户登入后可写入的目录
  42. 按照上面设置后,在重启sshd服务后,用户mysftp已经可以登录。但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供mysftp上传文件。
  43. 这个目录所有者为mysftp,所有组为sftp,所有者有写入权限,而所有组无写入权限。
  44. [root@sftp-test01 ~]# mkdir /data/sftp/mysftp/upload
  45. [root@sftp-test01 ~]# chown mysftp:sftp /data/sftp/mysftp/upload
  46. [root@sftp-test01 ~]# chmod 755 /data/sftp/mysftp/upload
  47.  
  48. 7)关闭防火墙
  49. [root@sftp-test01 ~]# /etc/init.d/iptables stop
  50. [root@sftp-test01 ~]# setenforce 0
  51. setenforce: SELinux is disabled
  52. [root@sftp-test01 ~]# cat /etc/sysconfig/selinux
  53. .......
  54. SELINUX=disabled
  55.  
  56. 8)重启sshd服务
  57. [root@sftp-test01 ~]# service sshd restart
  58. Stopping sshd: [ OK ]
  59. Starting sshd: [ OK ]
  60.  
  61. 9)验证sftp环境(如对sftp做白名单限制,则就是对sshd做白名单限制。可以在iptables里限制sshd的端口,也可以在/etc/hosts.allow里对sshd服务做限制)
  62. 如下显示,这说明SFTP已经搭建成功(如果ssh是非22端口,比如是6666端口,则连接命令:sftp -o port=6666 mysftp@172.16.51.191
  63. [root@sftp-test01 ~]# sftp mysftp@172.16.51.191
  64. Connecting to 172.16.51.191...
  65. The authenticity of host '172.16.51.191 (172.16.51.191)' can't be established.
  66. RSA key fingerprint is c0:f5:1d:03:3b:00:4a:11:54:8c:a7:a3:6f:77:47:c7.
  67. Are you sure you want to continue connecting (yes/no)? yes
  68. Warning: Permanently added '172.16.51.191' (RSA) to the list of known hosts.
  69. mysftp@172.16.51.191's password:
  70. sftp> ls
  71. upload
  72. sftp> cd upload
  73. sftp> ls
  74.  
  75. 10)使用FileZilla FTP Client连接SFTP服务器
  76. 输入主机IP地址172.16.51.191、用户名mysftp、密码mysftp、端口(默认为22端口)连接SFTP服务器。
  77. 连接后,默认的路径是/data/sftp/mysftp
  78.  
  79. 二、sftp-test02服务器需要和上面sftp-test01一样的操作!
  80.  
  81. 三、sftp-test01sftp-test02两台机器的/data/sftp目录做实时同步(rsync+inotify
  82. 考虑到数据完整性和安全性,实施单向实时同步,即从sftp-test01机器的/data/sftp实时同步到sftp-test02data/sftp
  83. 操作如下:
  84. 1)在目标服务器sftp-test02上的部署过程
  85. 安装配置rsync服务端
  86. [root@sftp-test02 ~]# yum install rsync xinetd
  87. [root@sftp-test02 ~]# vim /etc/xinetd.d/rsync
  88. ......
  89. disable = no
  90. ......
  91.  
  92. 启动xineted服务
  93. [root@sftp-test02 ~]# /etc/init.d/xinetd start
  94. Starting xinetd: [ OK ]
  95.  
  96. 创建/etc/rsyncd.conf文件
  97. [root@sftp-test02 ~]# vim /etc/rsyncd.conf
  98. [root@sftp-test02 ~]# cat /etc/rsyncd.conf
  99. log file = /var/log/rsyncd.log
  100. pidfile = /var/run/rsyncd.pid
  101. lock file = /var/run/rsync.lock
  102. secrets file = /etc/rsync.pass
  103. motd file = /etc/rsyncd.Motd
  104.  
  105. [sftp_upload]
  106. path = /data/sftp
  107. comment = sftp_upload
  108. uid = root
  109. gid = sftp
  110. port=873
  111. use chroot = no
  112. read only = no
  113. list = no
  114. max connections = 200
  115. timeout = 600
  116. auth users = RSYNC_USER
  117. hosts allow = 172.16.51.191
  118.  
  119. 注意:权限不要搞错了!
  120. 上面填写的uidrootgidsftp,是因为/data/sftp/
  121. [root@sftp-test02 ~]# ll -d /data/sftp
  122. drwxr-xr-x 3 root root 4096 Nov 21 05:21 /data/sftp
  123. [root@sftp-test02 ~]# ll /data/sftp/
  124. total 4
  125. drwxr-xr-x 3 root sftp 4096 Nov 21 07:28 mysftp
  126.  
  127. 创建用户认证文件
  128. [root@sftp-test02 ~]# vim /etc/rsync.pass
  129. RSYNC_USER:123456@rsync
  130.  
  131. 设置文件权限,即rsyncd.confrsync.pass认证文件都是600权限!
  132. [root@sftp-test02 ~]# chmod 600 /etc/rsyncd.conf
  133. [root@sftp-test02 ~]# chmod 600 /etc/rsync.pass
  134.  
  135. 重启rsync服务
  136. [root@sftp-test02 ~]# /etc/init.d/xinetd restart
  137. Stopping xinetd: [ OK ]
  138. Starting xinetd: [ OK ]
  139. [root@sftp-test02 ~]# lsof -i:873
  140. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  141. xinetd 3797 root 5u IPv6 16264 0t0 TCP *:rsync (LISTEN)
  142.  
  143. 2)在源服务器172.16.51.191上的部署过程
  144. [root@sftp-test01 ~]# yum install rsync xinetd
  145. [root@sftp-test01 ~]# vim /etc/xinetd.d/rsync
  146. ......
  147. disable = no
  148. ......
  149. [root@sftp-test01 ~]# /etc/init.d/xinetd start
  150. Starting xinetd: [ OK ]
  151. [root@sftp-test01 ~]# lsof -i:873
  152. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  153. xinetd 3444 root 5u IPv6 15917 0t0 TCP *:rsync (LISTEN)
  154.  
  155. 创建同步的密码文件,这个文件名可以跟服务端的认证文件不一样,但是里面的密码必须一致!用于rsync同步命令中。
  156. 不过,最好两边的文件设置成一样,便于管理
  157. [root@sftp-test01 ~]# cat /etc/rsync.pass
  158. 123456@rsync
  159.  
  160. 设置rsync.pass密码文件为600权限
  161. [root@sftp-test01 ~]# chmod 600 /etc/rsync.pass
  162.  
  163. 查看服务器内核是否支持inotify,出现下面的内容,说明服务器内核支持inotify
  164. [root@sftp-test01 ~]# ll /proc/sys/fs/inotify
  165. total 0
  166. -rw-r--r-- 1 root root 0 Nov 21 08:12 max_queued_events
  167. -rw-r--r-- 1 root root 0 Nov 21 08:12 max_user_instances
  168. -rw-r--r-- 1 root root 0 Nov 21 08:12 max_user_watches
  169.  
  170. 注意:Linux下支持inotify的内核最小为2.6.13,可以输入命令:uname -a查看内核
  171. CentOS 5.X 内核为2.6.18,默认已经支持inotify
  172. [root@sftp-test01 ~]# uname -a
  173. 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
  174.  
  175. 下面开始安装inotify-tools
  176. [root@sftp-test01 ~]# yum install make gcc gcc-c++
  177. [root@sftp-test01 ~]# cd /usr/local/src/
  178. [root@sftp-test01 src]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
  179. [root@sftp-test01 src]# tar zxvf inotify-tools-3.14.tar.gz
  180. [root@sftp-test01 src]# cd inotify-tools-3.14
  181. [root@sftp-test01 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
  182. [root@sftp-test01 inotify-tools-3.14]# make && make install
  183.  
  184. 发现已经成功安装inotify-tools
  185. [root@sftp-test01 inotify-tools-3.14]# ll -d /usr/local/inotify/
  186. drwxr-xr-x 6 root root 4096 Nov 21 08:14 /usr/local/inotify/
  187.  
  188. 设置系统环境变量
  189. [root@sftp-test01 inotify-tools-3.14]# vim /etc/profile
  190. .......
  191. export PATH=$PATH:/usr/local/inotify/bin
  192. [root@sftp-test01 inotify-tools-3.14]# source /etc/profile
  193.  
  194. 添加库文件
  195. [root@sftp-test01 inotify-tools-3.14]# vim /etc/ld.so.conf
  196. ......
  197. /usr/local/inotify/lib
  198. [root@sftp-test01 inotify-tools-3.14]# ldconfig
  199.  
  200. 修改inotify默认参数(inotify默认内核参数值太小)
  201. 查看系统默认参数值
  202. [root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_queued_events
  203. fs.inotify.max_queued_events = 16384
  204. [root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_watches
  205. fs.inotify.max_user_watches = 8192
  206. fs.epoll.max_user_watches = 796344
  207. [root@sftp-test01 inotify-tools-3.14]# sysctl -a | grep max_user_instances
  208. fs.inotify.max_user_instances = 128
  209.  
  210. [root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_queued_events="99999999"
  211. fs.inotify.max_queued_events = 99999999
  212. [root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_watches="99999999"
  213. fs.inotify.max_user_watches = 99999999
  214. [root@sftp-test01 inotify-tools-3.14]# sysctl -w fs.inotify.max_user_instances="65535"
  215. fs.inotify.max_user_instances = 65535
  216.  
  217. 参数说明:
  218. max_queued_events
  219. inotify队列最大长度,如果值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确
  220. max_user_watches
  221. 要同步的文件包含多少目录,可以用:find /Data/xqsj_upload -type d | wc -l 统计这些源目录下的目录数,必须保证max_user_watches值大于统计结果(这里/Data/xqsj_upload为同步的源文件目录)
  222. max_user_instances
  223. 每个用户创建inotify实例最大值
  224.  
  225. 接着执行同步操作:
  226. 在源服务器上执行rsync首次全量同步的操作(加--delete参数,保持目标目录和源目录下文件绝对一致)
  227. [root@sftp-test01 ~]# rsync -avH --port=873 --progress --delete /data/sftp/ RSYNC_USER@172.16.51.192::sftp_upload --password-file=/etc/rsync.pass
  228.  
  229. 待第一次rsync全量同步完成后,就进行rsync+inotify实时同步脚本操作。
  230. 实时同步脚本里添加的是--delete-before参数,而不是--delete参数(第一次全量同步时rsync用的参数),二者区别:
  231. --delete参数:表示rsync同步前,暴力删除目标目录中的所有文件,然后再执行同步操作。
  232. --delete-before参数:表示rsync同步前,会先对目标目录进行一次扫描检索,删除目标目录中对比源目录的多余文件,然后再执行同步操作。显然比--delete参数安全些。
  233.  
  234. [root@sftp-test01 data]# cd /data/script/
  235. [root@sftp-test01 script]# vim sftp_data_rsync.sh
  236. #!/bin/bash
  237. SRCDIR=/data/sftp/
  238. USER=RSYNC_USER
  239. IP=172.16.51.192
  240. DESTDIR=sftp_upload
  241. /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
  242. do
  243. /usr/bin/rsync -avH --port=873 --progress --delete-before $SRCDIR $USER@$IP::$DESTDIR --password-file=/etc/rsync.pass
  244. echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
  245. done
  246.  
  247. [root@sftp-test01 script]# chmod 755 sftp_data_rsync.sh
  248. [root@sftp-test01 script]# nohup sh sftp_data_rsync.sh & //按ctrl+c结束
  249. [1] 8807
  250. [root@sftp-test01 script]# ps -ef|grep inotify
  251. 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/
  252. root 8811 8451 0 22:55 pts/0 00:00:00 grep inotify
  253.  
  254. 这样,sftp-test01机器的/data/sftp目录下的文件就会自动实时同步到sftp-test02机器的/data/sftp目录下
  255. 注意:这是单向实时同步!如果要想做双向实时同步!那就需要在sftp-test02机器上再做个inotify监控脚本(同时,sftp-test01也要做个rsyncd.conf文件)
  256.  
  257. 四、SFTP结合Keepalived做双机高可用
  258. 1)下载安装Keepalived(两台机器同样操作)
  259. [root@sftp-test01 ~]# cd /usr/local/src/
  260. [root@sftp-test01 src]# wget http://www.keepalived.org/software/keepalived-1.3.2.tar.gz
  261. [root@sftp-test01 src]# tar -zvxf keepalived-1.3.2.tar.gz
  262. [root@sftp-test01 src]# cd keepalived-1.3.2
  263. [root@sftp-test01 keepalived-1.3.2]# ./configure && make && make install
  264. [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/
  265. [root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
  266. [root@sftp-test01 keepalived-1.3.2]# mkdir /etc/keepalived
  267. [root@sftp-test01 keepalived-1.3.2]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
  268. [root@sftp-test01 keepalived-1.3.2]# cp /usr/local/sbin/keepalived /usr/sbin/
  269. [root@sftp-test01 keepalived-1.3.2]# echo "/etc/init.d/keepalived start" >> /etc/rc.local
  270.  
  271. 2)配置Keepalived.conf文件
  272. [root@sftp-test01 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  273. [root@sftp-test01 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
  274. ! Configuration File for keepalived
  275.  
  276. global_defs {
  277. notification_email {
  278. wangshibo@wangshibo.com
  279. }
  280.  
  281. notification_email_from notice@wangshibo.com
  282. smtp_server smtp.wangshibo.com
  283. smtp_connect_timeout 30
  284. router_id master-node
  285. }
  286.  
  287. vrrp_script chk_sftp_port {
  288. script "/data/chk_sftp.sh"
  289. interval 2
  290. weight -5
  291. fall 2
  292. rise 1
  293. }
  294.  
  295. vrrp_instance VI_1 {
  296. state MASTER
  297. interface eth0
  298. mcast_src_ip 172.16.51.191
  299. virtual_router_id 51
  300. priority 101
  301. advert_int 1
  302. authentication {
  303. auth_type PASS
  304. auth_pass 1111
  305. }
  306. virtual_ipaddress {
  307. 172.16.51.193
  308. }
  309.  
  310. track_script {
  311. chk_sftp_port
  312. }
  313. }
  314.  
  315. sftp-test02服务器作为backup端的Keepalived.conf配置如下:
  316. [root@sftp-test02 keepalived-1.3.2]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  317. [root@sftp-test02 keepalived-1.3.2]# vim /etc/keepalived/keepalived.conf
  318. ! Configuration File for keepalived
  319.  
  320. global_defs {
  321. notification_email {
  322. wangshibo@wangshibo.com
  323. }
  324.  
  325. notification_email_from notice@wangshibo.com
  326. smtp_server smtp.wangshibo.com
  327. smtp_connect_timeout 30
  328. router_id slave-node
  329. }
  330.  
  331. vrrp_script chk_sftp_port {
  332. script "/data/chk_sftp.sh"
  333. interval 2
  334. weight -5
  335. fall 2
  336. rise 1
  337. }
  338.  
  339. vrrp_instance VI_1 {
  340. state BACKUP
  341. interface eth0
  342. mcast_src_ip 172.16.51.192
  343. virtual_router_id 51
  344. priority 99
  345. advert_int 1
  346. authentication {
  347. auth_type PASS
  348. auth_pass 1111
  349. }
  350. virtual_ipaddress {
  351. 172.16.51.193
  352. }
  353.  
  354. track_script {
  355. chk_sftp_port
  356. }
  357. }
  358.  
  359. 编写sftp监控脚本(两台机器都要写)
  360. [root@sftp-test01 keepalived-1.3.2]# vim /data/chk_sftp.sh
  361. #!/bin/bash
  362. counter=$(/etc/init.d/sshd status|grep running|wc -l)
  363. if [ "${counter}" = "0" ]; then
  364. /etc/init.d/sshd start
  365. sleep 2
  366. counter=$(/etc/init.d/sshd status|grep running|wc -l)
  367. if [ "${counter}" = "0" ]; then
  368. /etc/init.d/keepalived stop
  369. fi
  370. fi
  371. [root@sftp-test01 keepalived-1.3.2]# chmod 755 /data/chk_sftp.sh
  372.  
  373. 3)两台机器都要启动Keepalived
  374. [root@sftp-test01 ~]# /etc/init.d/keepalived start
  375. [root@sftp-test02 ~]# /etc/init.d/keepalived start
  376.  
  377. 启动后发现sftp-test01已经有了vip资源
  378. [root@sftp-test01 ~]# ip addr
  379. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
  380. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  381. inet 127.0.0.1/8 scope host lo
  382. inet6 ::1/128 scope host
  383. valid_lft forever preferred_lft forever
  384. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
  385. link/ether 02:f6:cb:83:ad:03 brd ff:ff:ff:ff:ff:ff
  386. inet 172.16.51.191/24 brd 172.16.51.255 scope global eth0
  387. inet 172.16.51.193/32 scope global eth0
  388. inet6 fe80::f6:cbff:fe83:ad03/64 scope link
  389. valid_lft forever preferred_lft forever
  390.  
  391. 4)高可用测试:
  392. -> 先关闭sftp-test01机器的Keepalived服务,发现vip资源就会自动漂到sftp-test02机器上继续提供服务。
  393. sftp-test01机器的Keepalived服务恢复后,vip资源就会自动抢占回来。
  394. -> 关闭sftp-test01机器的ssh服务,通过脚本会自动启动ssh服务,当启动失败后,会强制关闭Keepalived服务,从而实现vip资源的漂移!
  395.  
  396. 注意:
  397. FileZilla客户端里使用172.16.51.193vip进行连接。可以在FileZilla客户端的"文件"里建立"新站点",协议”SFTP
  398. 登陆类型:正常

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

  1. 调整后的新方案:
  2. 编写一个监控vip资源的脚本,当vip在哪台机器上时,就做这台机器到另一台的rsync单向同步操作,并且后台一直运行这个脚本(通过循环语句保证脚本一直运行)
  3. 放弃原来的rsync+inotify双向实时同步脚本!
  4.  
  5. 脚本内容如下:
  6. 停止之前的rsync+inotify实时监控脚本,然后做两台机器的相互信任关系。
  7.  
  8. 1)第一台机器sftp-test01的操作
  9. [root@sign-test01 ~]# cat /data/script/sftp_vip_monit.sh
  10. #!/bin/bash
  11. while [ "1" = "1" ]
  12. do
  13. NUM=`ip addr|grep 172.16.51.193|wc -l`
  14. if [ $NUM -eq 0 ];then
  15. echo "vip is not at this server" >/dev/null 2>&1
  16. fi
  17.  
  18. if [ $NUM -eq 1 ];then
  19. /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.192:/data/sftp/mysftp/
  20. fi
  21.  
  22. done
  23.  
  24. [root@sign-test01 ~]# chmod 755 /data/script/sftp_vip_monit.sh
  25. [root@sign-test01 ~]# nohup sh /data/script/sftp_vip_monit.sh & //按ctrl+c结束
  26. [root@sign-test01 ~]# ps -ef|grep monit
  27. root 10581 22167 0 19:42 pts/0 00:00:00 grep monit
  28. root 15113 1 8 17:15 ? 00:13:00 sh sftp_vip_monit.sh
  29.  
  30. 2)第二台机器sftp-test02
  31. [root@sign-test02 ~]# cat /data/script/sftp_vip_monit.sh
  32. #!/bin/bash
  33. while [ "1" = "1" ]
  34. do
  35. NUM=`ip addr|grep 172.16.51.193|wc -l`
  36. if [ $NUM -eq 0 ];then
  37. echo "vip is not at this server" >/dev/null 2>&1
  38. fi
  39.  
  40. if [ $NUM -eq 1 ];then
  41. /usr/bin/rsync -e "ssh -p22" -avpgolr --progress --delete-before /data/sftp/mysftp/ root@172.16.51.191:/data/sftp/mysftp/
  42. fi
  43.  
  44. done
  45.  
  46. [root@sign-test02 ~]# chmod 755 /data/script/sftp_vip_monit.sh
  47. [root@sign-test02 ~]# nohup sh /data/script/sftp_vip_monit.sh & //按ctrl+c结束
  48. [root@sign-test02 ~]# ps -ef|grep monit
  49. root 10581 22167 0 19:42 pts/0 00:00:00 grep monit
  50. root 15113 1 8 17:15 ? 00:13:00 sh sftp_vip_monit.sh

=================创建sftp只读账号================

  1. 原则上来说,sftp账号登录后只能限定到其用户家目录下,即不能遍历除其家目录下之外的任何其他目录!
  2. sftp添加只读账号,这里我采用的方法如下(有些复杂,但经测试可用):
  3.  
  4. sftp-test01sftp-test02两个节点机操作一样
  5. [root@sftp-test01 ~]# useradd -g sftp -s /bin/false readftp
  6. [root@sftp-test01 ~]# passwd readftp
  7.  
  8. [root@sftp-test01 ~]# mkdir /data/sftp/readftp
  9. [root@sftp-test01 ~]# usermod -d /data/sftp/readftp readftp
  10.  
  11. [root@sftp-test01 ~]# chown root:sftp /data/sftp/readftp
  12. [root@sftp-test01 ~]# chmod 755 /data/sftp/readftp
  13.  
  14. # 注意将readftp下的upload目录权限设置成写账号mysftp权限,这样readftp账号登录后就只有读权限。
  15. [root@sftp-test01 ~]# mkdir /data/sftp/readftp/upload
  16. [root@sftp-test01 ~]# chown mysftp:sftp /data/sftp/readftp/upload
  17.  
  18. 由于上面已经编写了两个节点机关于/data/sftp/mysftp/目录的实时同步脚本sftp_vip_monit.sh
  19. 下面再在两台机器上编写:本机/data/sftp/mysftp/upload/到/data/sftp/readftp/upload/目录的实时同步脚本readftp_monit.sh
  20.  
  21. 1sftp-test01节点上
  22. [root@sftp-test01 ~]# cd /data/script/
  23. [root@sftp-test01 script]# vim readftp_monit.sh
  24. #!/bin/bash
  25. while [ "1" = "1" ]
  26. do
  27. /usr/bin/rsync -e "ssh -p22" -avpgolr --delete-before /data/sftp/mysftp/upload/ /data/sftp/readftp/upload/
  28. done
  29. [root@sftp-test01 script]# nohup sh readftp_monit.sh & #按ctrl+c结束
  30.  
  31. [root@sftp-test01 script]# ps -ef|grep monit
  32. root 5285 17061 0 11:37 pts/0 00:00:07 sh readftp_monit.sh
  33. root 22713 17061 0 10:42 pts/0 00:00:29 sh sftp_vip_monit.sh
  34. root 28893 17061 0 12:00 pts/0 00:00:00 grep monit
  35.  
  36. 2sftp-test02节点上
  37. [root@sftp-test02 ~]# cd /data/script/
  38. [root@sftp-test02 script]# vim readftp_monit.sh
  39. #!/bin/bash
  40. while [ "1" = "1" ]
  41. do
  42. /usr/bin/rsync -e "ssh -p22" -avpgolr --delete-before /data/sftp/mysftp/upload/ /data/sftp/readftp/upload/
  43. done
  44. [root@sftp-test02 script]# nohup sh readftp_monit.sh & #按ctrl+c结束
  45.  
  46. [root@sftp-test02 script]# ps -ef|grep monit
  47. root 5285 17061 0 11:37 pts/0 00:00:07 sh readftp_monit.sh
  48. root 22713 17061 0 10:42 pts/0 00:00:29 sh sftp_vip_monit.sh
  49. root 28893 17061 0 12:00 pts/0 00:00:00 grep monit
  50.  
  51. 以上操作做,就能保证mysftp为写账号,readftp为只读账号,思路:
  52. a)通过mysftp账号登录sftp服务后,可以进行上传、创建,删除和下载的读写操作,操作的文件存在在/data/sftp/mysftp/upload目录下,然后实时同步到
  53. /data/sftp/readftp/upload目录下。
  54. b)通过readftp账号登录sfto服务器,只能进行下载的只读操作。由于/data/sftp/mysftp/uploadmysftp权限,没有写权限。而且就算可以进行写操作,写
  55. 之后的文件放在/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日常运维维护命令===============

  1. cd 路径                        更改到远程目录的路径
  2. lcd 路径                       更改到本地目录的路径
  3. chgrp group path               将文件path的组更改为group
  4. chmod mode path                将文件path的权限更改为mode
  5. chown owner path               将文件path的属主更改为owner
  6. exit                           退出 sftp
  7. help                           显示这个帮助文本
  8. get 远程路径                    下载文件
  9. ln existingpath linkpath       符号链接远程文件
  10. ls [选项] [路径]                显示远程目录列表
  11. lls [选项] [路径]              显示本地目录列表
  12. mkdir 路径                     创建远程目录
  13. lmkdir 路径                    创建本地目录
  14. mv oldpath newpath            移动远程文件
  15. open [用户@]主机[:端口]        连接到远程主机
  16. put 本地路径                   上传文件
  17. pwd                           显示远程工作目录
  18. lpwd                          打印本地工作目录
  19. quit                          退出 sftp
  20. rmdir 路径                    移除远程目录
  21. lrmdir 路径                   移除本地目录
  22. rm 路径                       删除远程文件
  23. lrm 路径                      删除本地文件
  24. symlink existingpath linkpath  符号链接远程文件
  25. version                        显示协议版本
  26.  
  27. ===============================================================================
  28. sftp mysftp@192.168.10.191 #ssh是默认22端口的连接方法
  29. sftp -o port=6666 mysftp@192.168.10.191 #ssh是6666非默认端口的连接方法

Centos下SFTP双机高可用环境部署记录的更多相关文章

  1. LVS+Keepalived 高可用环境部署记录(主主和主从模式)

    之前的文章介绍了LVS负载均衡-基础知识梳理, 下面记录下LVS+Keepalived高可用环境部署梳理(主主和主从模式)的操作流程: 一.LVS+Keepalived主从热备的高可用环境部署 1)环 ...

  2. Jumpserver双机高可用环境部署笔记

    之前在IDC部署了Jumpserver堡垒机环境,作为登陆线上服务器的统一入口.后面运行一段时间后,发现Jumpserver服务器的CPU负载使用率高达80%以上,主要是python程序对CPU的消耗 ...

  3. Redis+Keepalived高可用环境部署记录

    Keepalived 实现VRRP(虚拟路由冗余)协议,从路由级别实现VIP切换,可以完全避免类似heartbeat脑裂问题,可以很好的实现主从.主备.互备方案,尤其是无状态业务,有状态业务就需要额外 ...

  4. Centos下内网DNS主从环境部署记录

    一.DNS是什么?DNS(Domain Name System),即域名系统.它使用层次结构的命名系统,将域名和IP地址相互映射,形成一个分布式数据库系统. DNS采用C-S架构,服务器端工作在UDP ...

  5. Linux下rsyslog日志收集服务环境部署记录【转】

    rsyslog 可以理解为多线程增强版的syslog. 在syslog的基础上扩展了很多其他功能,如数据库支持(MySQL.PostgreSQL.Oracle等).日志内容筛选.定义日志格式模板等.目 ...

  6. Centos下DNS+NamedManager高可用部署方案完整记录

    之前说到了NamedManager单机版的配置,下面说下DNS+NamedManager双机高可用的配置方案: 1)机器环境 主机名 ip地址 dns01.kevin.cn 192.168.10.20 ...

  7. Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

    Nginx.LVS.HAProxy 是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,通常会结合Keepalive做健康检查,实现故障转移的高可用功能. 1)在四层(tcp)实现负载均衡的 ...

  8. CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录

    下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...

  9. openstack 高可用环境部署(8节点)(一)

随机推荐

  1. tkinter学习系列之(五)Checkbutton控件

    目录 目录 前言 (一)基本属性 (二)案例 1.简单的复选框 2.组合复选框 目录 前言 复选框:可以同时多选的一组框,其只有两种状态,选中与未选中. (一)基本属性 (1)说明: tkinter里 ...

  2. apply 和call 的区别,apply实用小技巧

    Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  3. jQuery插件slider实现图片轮播

    1:引入相应的js文件  jquery.SuperSilder.js 2:HTML: 结构 注:此地加载图片的代码也可以从后台库中读取图片的集合列表,然后通过循环的方式显示出来 3:CSS 样式定义左 ...

  4. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

  5. 解决HTTP status code is not handled or not allowed

    /Books/>: HTTP status code is not handled or not allowed 2017-11-04 17:21:38 [scrapy.spidermiddle ...

  6. 捕获海康威视IPCamera图像,转成OpenCV能够处理的图像(二)

    海康威视IPCamera图像捕获 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图像(一) 捕获海康威视IPCamera图像.转成OpenCV能够处理的IplImage图 ...

  7. 20145236《网络攻防》Exp5 MSF基础应用

    20145236<网络攻防>Exp5 MSF基础应用 一.基础问题回答 解释exploit,payload,encode是什么: exploit就是负责负载有用代码的交通工具,先通过exp ...

  8. metamask中的import account的代码实现

    metamask-extension/app/scripts/account-import-strategies/index.js 这部分就是用户如果往metamask中import一个已有的账户调用 ...

  9. solidity return data和revert/require的reason string的获得

    前言: 在使用solidity写智能合约的时候,会使用到revert和require来进行断言,比如: require(tokenOwner[tokenId] == 0x0,'this is not ...

  10. 在 Linux 上安装 Oracle 数据库 11g

    http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/229016_zhs.htm