一、SFTP概述

在前几篇文章,我们讲到了文件传输协议FTP(File Transfer Protocol),那也是使用比较广泛的文件服务器,但是我们需要知道,Linux系统并不自带FTP程序

如果要上传或者下载数据,就需要我们去额外部署FTP程序,而只要是应用程序,那多多少少会占用一些系统资源,基于这个问题,我们可以使用Linux自带的SFTP来进行数据的上传与下载

那什么是SFTP呢?SFTP全称为(Secure File Transfer Protocol)即安全文件传输协议,从前面S这个字母以及单词我们就可以看出来,SFTP可以为用户传输数据时提供一种安全的加密方法

我们需要知道的就是,它不需要额外去部署,同时没有独立的守护进程,默认已经集成于SSH,所以它需要使用sshd的守护进程来完成相应的连接操作与数据上传和下载操作

另一方面就是它与FTP的语法也差不多,所以使用起来非常方便,同时Windows下常见的FTP客户端也都支持SFTP,如果大家对安全方面要求比较高的时候,那么SFTP将会是一个不错的选择

那SFTP与FTP的区别?

节约资源:因为已经集成于SSH,同时也不需要额外部署程序,所以这对系统来说资源占用就比较少
使用方便:没有独立的守护进程,无需额外配置,因为它已经集成于SSH,所以安装了SSH就等同于开启了SFTP
传输效率:因为对数据进行了加密,所以相对来说比较安全,但是这种安全也是以牺牲传输效率为代价的,也就是说SFTP的传输效率要比FTP慢,但差别也不是很大

二、SFTP使用

1)固定IP地址

[root@sftp-server ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.2.3.11  netmask 255.255.255.0  broadcast 10.2.3.255
        inet6 fe80::20c:29ff:fec1:6505  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:c1:65:05  txqueuelen 1000  (Ethernet)
        RX packets 504  bytes 41228 (40.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 367  bytes 37601 (36.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2)查看SSH版本

提示:低于4.8p1版本的SSH需要升级

[root@sftp-server ~]# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

3)创建SFTP组

提示:创建SFTP组的初衷是,如果后期有多个用户,则使用组比较好控制读写权限

[root@sftp-server ~]# groupadd sftp

3)创建两个SFTP测试用户并设置密码

[root@sftp-server ~]# useradd -g sftp -s /sbin/nologin test1
[root@sftp-server ~]# useradd -g sftp -s /sbin/nologin test2

[root@sftp-server ~]# echo "abc-123" | passwd --stdin test1
更改用户 test1 的密码 。
passwd:所有的身份验证令牌已经成功更新。

[root@sftp-server ~]# echo "abc-123" | passwd --stdin test2
更改用户 test2 的密码 。
passwd:所有的身份验证令牌已经成功更新。

4)创建数据存储目录

提示:这里将sftp组下所有用户的家目录统一指定到数据存储目录,并按用户名进行区分,因为那个用户登录就会直接进入到自己的家目录

[root@sftp-server ~]# mkdir -p /sftp/data
[root@sftp-server ~]# mkdir -p /sftp/data/test1
[root@sftp-server ~]# mkdir -p /sftp/data/test2

[root@sftp-server ~]# usermod -d /sftp/data/test1 test1
[root@sftp-server ~]# usermod -d /sftp/data/test2 test2

5)定义sshd配置文件

提示:修改sshd配置文件的时候,一定要先备份,并且要细心,否则重启ssh服务以后,会造成ssh远程失败,sftp登录成功的现象

[root@sftp-server ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

[root@sftp-server ~]# vim /etc/ssh/sshd_config
#Subsystem      sftp    /usr/libexec/openssh/sftp-server  #注释默认已有的
Subsystem       sftp    internal-sftp
Match Group     sftp
ChrootDirectory /sftp/data/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

[root@sftp-server ~]# systemctl restart sshd
[root@sftp-server ~]# netstat -anput | grep sshd
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1136/sshd
tcp        0     36 10.2.3.11:22            10.2.3.1:4308           ESTABLISHED 994/sshd: root@pts/

6)定义目录权限

提示:为了便于管理,所以我将各个用户的属组设置为了sftp,因为test1与test2均属于sftp组,如果后期还有用户,直接把它们加进sftp组即可,这样权限控制方便

[root@sftp-server ~]# chown root:sftp /sftp/data/test1
[root@sftp-server ~]# chown root:sftp /sftp/data/test2

[root@sftp-server ~]# ls -lh /sftp/data
总用量 0
drwxr-xr-x 2 root sftp 6 2月  20 21:21 test1
drwxr-xr-x 2 root sftp 6 2月  20 21:21 test2

7)创建上传目录并定义权限

提示:其实到这里用户已经可以正常登录了,但是它们没有办法往根写入数据,所以我们要在它们自己的家目录新建一个目录并定义权限,以供用户上传数据使用,这点其实和FTP一样

结果:各自上传目录的所属主为test1与test2,各自上传目录的所属组为sftp,所属主的权限为可读写,所属组的权限为只读 

[root@sftp-server ~]# mkdir /sftp/data/test1/upload
[root@sftp-server ~]# mkdir /sftp/data/test2/upload

[root@sftp-server ~]# chown test1:sftp /sftp/data/test1/upload
[root@sftp-server ~]# chown test2:sftp /sftp/data/test2/upload

[root@sftp-server ~]# ls -lh /sftp/data/test1
总用量 0
drwxr-xr-x 2 test1 sftp 6 2月  20 21:39 upload

[root@sftp-server ~]# ls -lh /sftp/data/test2
总用量 0
drwxr-xr-x 2 test2 sftp 6 2月  20 21:39 upload

8)在Windows平台验证

(1)test1用户

测试登录

测试上传数据

确认数据已经上传

(2)test2用户

测试登录

测试上传数据

确认数据已经上传

9)在Linux平台验证

(1)test1用户

[root@sftp-server ~]# sftp test1@10.2.3.11
The authenticity of host '10.2.3.11 (10.2.3.11)' can't be established.
ECDSA key fingerprint is SHA256:6k01Y/Yol5AK3CfnByxZNpmHRxqouOQEkKfnxN6a3p4.
ECDSA key fingerprint is MD5:9c:d1:3a:11:31:ae:e9:be:e5:5f:a9:ec:55:e3:b5:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.3.11' (ECDSA) to the list of known hosts.
test1@10.2.3.11's password:
Connected to 10.2.3.11.
sftp>
sftp> ls  #查看有那些目录
upload
sftp>
sftp> cd upload  #进入上传数据的目录
sftp>
sftp> ls  #查看刚刚在Windows平台上传的文件
hadoop-3.2.1.tar.gz   nextcloud-17.0.2.zip
sftp>
sftp> put /root/mongodb-linux-x86_64-rhel7-3.6.14.tgz  #上传数据
Uploading /root/mongodb-linux-x86_64-rhel7-3.6.14.tgz to /upload/mongodb-linux-x86_64-rhel7-3.6.14.tgz
/root/mongodb-linux-x86_64-rhel7-3.6.14.tgz                                                                                100%  116MB  99.4MB/s   00:01
sftp>
sftp> put /root/nginx-1.16.1.tar.gz  #上传数据
Uploading /root/nginx-1.16.1.tar.gz to /upload/nginx-1.16.1.tar.gz
/root/nginx-1.16.1.tar.gz                                                                                                  100% 1008KB 102.8MB/s   00:00
sftp>
sftp> ls  #再来查看、可以发现上传成功
hadoop-3.2.1.tar.gz                    mongodb-linux-x86_64-rhel7-3.6.14.tgz  nextcloud-17.0.2.zip                   nginx-1.16.1.tar.gz 

[root@sftp-server ~]# ls -lh /sftp/data/test1/upload
总用量 541M
-rw-r--r-- 1 test1 sftp 343M 2月 20 21:51 hadoop-3.2.1.tar.gz
-rw-r--r-- 1 test1 sftp 117M 2月 20 22:04 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 test1 sftp 81M 2月 20 21:51 nextcloud-17.0.2.zip
-rw-r--r-- 1 test1 sftp 1009K 2月 20 22:04 nginx-1.16.1.tar.gz

(2)test2用户

[root@sftp-server ~]# sftp test2@10.2.3.11
test2@10.2.3.11's password:
Connected to 10.2.3.11.
sftp>
sftp> ls
upload
sftp>
sftp> cd  upload
sftp>
sftp> ls
httpd-2.4.41.tar.gz   mysql-5.7.27.tar.gz
sftp>
sftp> put /root/redis-3.2.13.tar.gz
Uploading /root/redis-3.2.13.tar.gz to /upload/redis-3.2.13.tar.gz
/root/redis-3.2.13.tar.gz                                                                                                  100% 1516KB 117.1MB/s   00:00
sftp>
sftp> put /root/zabbix-3.2.11.tar.gz
Uploading /root/zabbix-3.2.11.tar.gz to /upload/zabbix-3.2.11.tar.gz
/root/zabbix-3.2.11.tar.gz
sftp> ls
httpd-2.4.41.tar.gz   mysql-5.7.27.tar.gz   redis-3.2.13.tar.gz   zabbix-3.2.11.tar.gz                                                      

[root@sftp-server ~]# ls -lh /sftp/data/test2/upload
总用量 78M
-rw-r--r-- 1 test2 sftp 8.9M 2月  20 21:57 httpd-2.4.41.tar.gz
-rw-r--r-- 1 test2 sftp  52M 2月  20 21:57 mysql-5.7.27.tar.gz
-rw-r--r-- 1 test2 sftp 1.5M 2月  20 22:08 redis-3.2.13.tar.gz
-rw-r--r-- 1 test2 sftp  16M 2月  20 22:08 zabbix-3.2.11.tar.gz

10)扩展知识-远程复制命令scp

通过scp命令可以利用SSH安全连接与远程主机相互复制数据

使用scp命令时,需要指定:复制源、目标、目标主机地址、登录用户,最后根据提示输入对应的密码即可

实例1:将本机的redis软件包复制到目标主机的/root目录

[root@sftp-server ~]# scp /root/redis-3.2.13.tar.gz root@10.2.3.12:/root/	#复制文件到目标主机
The authenticity of host '10.2.3.12 (10.2.3.12)' can't be established.
ECDSA key fingerprint is SHA256:6k01Y/Yol5AK3CfnByxZNpmHRxqouOQEkKfnxN6a3p4.
ECDSA key fingerprint is MD5:9c:d1:3a:11:31:ae:e9:be:e5:5f:a9:ec:55:e3:b5:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.3.12' (ECDSA) to the list of known hosts.
root@10.2.3.12's password:
redis-3.2.13.tar.gz                                                                                                        100% 1516KB  76.4MB/s   00:00    

[root@sftp-server ~]# ssh 10.2.3.12 ls -lh /root/	#查看复制过去的文件
root@10.2.3.12's password:
总用量 1.5M
-rw-r--r-- 1 root root 1.5M 2月  20 22:17 redis-3.2.13.tar.gz

实例2:将目标主机/etc/passwd文件复制到本机的/root目录下

[root@sftp-server ~]# scp root@10.2.3.12:/etc/passwd /root/
root@10.2.3.12's password:
passwd                                                                                                                     100%  915   540.8KB/s   00:00   

[root@sftp-server ~]# ls -lh
总用量 134M
-rw-r--r-- 1 root root  117M 2月  20 22:03 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 root root 1009K 2月  20 22:03 nginx-1.16.1.tar.gz
-rw-r--r-- 1 root root   915 2月  20 22:21 passwd
-rw-r--r-- 1 root root  1.5M 2月  20 22:03 redis-3.2.13.tar.gz
-rw-r--r-- 1 root root   16M 2月  20 22:03 zabbix-3.2.11.tar.gz

[root@sftp-server ~]# head -10 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

实例3:使用非22端口,将本机的/sftp/data/test1/upload目录复制到目标主机的/opt目录

提示:因为是复制目录,所以要使用-r选项来进行复制,然后使用-P选项来指定目标主机的SSH端口

[root@sftp-server ~]# scp -P 3214 -r /sftp/data/test1/upload root@10.2.3.12:/opt
root@10.2.3.12's password:
nextcloud-17.0.2.zip                                                                                                      100%   80MB 119.0MB/s   00:00
hadoop-3.2.1.tar.gz                                                                                                       100%  343MB 125.4MB/s   00:02
mongodb-linux-x86_64-rhel7-3.6.14.tgz                                                                      100%  116MB 133.4MB/s   00:00
nginx-1.16.1.tar.gz                                                                                                        100% 1008KB  93.6MB/s   00:00    

[root@sftp-server ~]# ssh -p 3214 root@10.2.3.12 ls -lh /opt/
root@10.2.3.12's password:
总用量 0
drwxr-xr-x 2 root root 133 2月  20 22:27 upload

[root@sftp-server ~]# ssh -p 3214 root@10.2.3.12 ls -lh /opt/upload
root@10.2.3.12's password:
总用量 541M
-rw-r--r-- 1 root root  343M 2月  20 22:26 hadoop-3.2.1.tar.gz
-rw-r--r-- 1 root root  117M 2月  20 22:27 mongodb-linux-x86_64-rhel7-3.6.14.tgz
-rw-r--r-- 1 root root   81M 2月  20 22:26 nextcloud-17.0.2.zip
-rw-r--r-- 1 root root 1009K 2月  20 22:27 nginx-1.16.1.tar.gz

【只是为了打发时间】

安全文件传输协议之SFTP的使用的更多相关文章

  1. FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

    第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能.虽然FTP是非常受欢迎的, ...

  2. 文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  3. 文件传输协议(FTP,SFTP,SCP)(修改中)

    FTP(File Transfer Protocol):是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层.FTP ...

  4. 【传输文件】文件传输协议FTP、SFTP和SCP

    网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...

  5. 文件传输协议:FTP、TFTP、SFTP有什么区别?

    一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...

  6. FTP(文件传输协议)工作原理

    目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...

  7. ftp (文件传输协议)

    ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...

  8. 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识

    第35章      FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...

  9. 文件传输协议(FTP)

    文件传输协议(FTP)用于用户在两台主机之间进行远距离的文件传输,并保证传输的可靠性. FTP采用客户机/服务器的方式,由FTP服务器和FTP客户机两部分组成. FTP服务器中以目录结构保存着各种文件 ...

随机推荐

  1. phpcms v9 标签调用,函数,sql

    1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 2011-05-06 11:22:33 {date('Y-m-d H:i:s',$r[inp ...

  2. 0级搭建类001-RedHat Enterprise Linux 8 安装(RHEL 8) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  3. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20

    本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...

  4. linux-redis cluster集群(redis5.x)

    1.查看redis安装目录: [root@iZwz97y9qoykzzotubitq3Z redis-5.0.5]# lltotal 472-rw-rw-r-- 1 root root 106874 ...

  5. 链表问题----删除链表的中间节点和a/b处的节点

    删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1-& ...

  6. win下删除EFI分区

    管理员身份,在cmd终端下,用"diskpart"命令. diskpart ##命令进入Microsoft DiskPart 模式 list disk ##展示磁盘分区列表 sel ...

  7. Eclipse设置代码模板

    个人博客 地址:http://www.wenhaofan.com/article/20180904173808 根据下列路径打开配置窗口 Window->Preferences->Java ...

  8. jQuery里ready方法用原生js实现原理

    function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoad ...

  9. 零基础自学Python是看书还是看视频?

    很多人都碍于Python培训班的高昂费用和有限的空余时间都选择自学Python,但是没有老师帮助,显得有些迷茫,不知应该从何处学起,也不知识看书学习还是应该看视频学习.本就来谈谈这个话题.   我们先 ...

  10. hzq84621巨佬的语录

    摘自诸中培训讲图论时: 1.光图论考不出什么东西,一般作为DP的附庸出现. 2.如果不是骗骗不承认SPFA的外国人,一般能用dij就用dij. 3.那个东西(指bellman-ford)除了判负环没什 ...