安全文件传输协议之SFTP的使用
一、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的使用的更多相关文章
- FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择
第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能.虽然FTP是非常受欢迎的, ...
- 文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- 文件传输协议(FTP,SFTP,SCP)(修改中)
FTP(File Transfer Protocol):是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层.FTP ...
- 【传输文件】文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- 文件传输协议:FTP、TFTP、SFTP有什么区别?
一个执着于技术的公众号 FTP 提供一种在服务器和客户机之间上传和下载文件的有效方式:是基于TCP的传输,FTP采用双TCP连接方式:支持授权与认证机制,提供目录列表功能. ---控制连接使用TCP端 ...
- FTP(文件传输协议)工作原理
目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...
- ftp (文件传输协议)
ftp (文件传输协议) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议” ...
- 【RL-TCPnet网络教程】第35章 FTP文件传输协议基础知识
第35章 FTP文件传输协议基础知识 本章节为大家讲解FTP(File Transfer Protocol,文件传输协议)的基础知识,方便后面章节的实战操作. (本章的知识点主要整理自网络) ...
- 文件传输协议(FTP)
文件传输协议(FTP)用于用户在两台主机之间进行远距离的文件传输,并保证传输的可靠性. FTP采用客户机/服务器的方式,由FTP服务器和FTP客户机两部分组成. FTP服务器中以目录结构保存着各种文件 ...
随机推荐
- Java数组动态增加容量
Java数组初始化需要指定数组容量,但是在许多情况下需要动态扩充容量.有两种方法可以实现:1.采用ArrayList类数组,它可以在需要时自动扩容:2.采用System.arraycopy方法实现,其 ...
- C语言-基本数据类型
一.C语言数据类型深度剖析 1.什么是数据类型? -可以理解为固定内存大小的别名 -数据类型是创建变量的模子 -数据类型是对内存的格式化操作 上面三句话如何理解? 在以前的汇编语言时代,我们要存储一些 ...
- [USACO12DEC]First!
Description Luogu3065 Solution 首先,一个串要是最小的,别的串不能是它的前缀,且和它有相同前缀的串字典序都比他小. Trie树是显然要用的,难点在于如何判断能否最小.其实 ...
- RN开发-JSX基础语法
1.环境 react.js react-dom.js browser.min.js(解码器) 2.载入方式 内联.外联 ...
- 重载(Overload)和重写(Override)的区别是什么?
首先java程序的运行分为编译和运行两部分. 所以重载和重写在这一点就有很明显的区别,因为重写方法的方法名和参数个数类型都一样,所以在java虚拟机的编译阶段是识别不出重写的方法的不同,在运行期间才可 ...
- Linux忘记 root密码的解决办法
很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如下: 重启linux系统 重启 ...
- AcWing 12. 背包问题求具体方案
//f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+w[i]) #include <iostream> using namespace std; ; int n, ...
- webscarab
1.功能 WebScarab是一个用来分析使用HTTP和HTTPS协议的应用程序框架.其原理很简单,WebScarab可以记录它检测到的会话内容(请求和应答),并允许使用者可以通过多种形式来查看记录. ...
- 【PAT甲级】1117 Eddington Number (25分)
题意: 输入一个正整数N(<=100000),接着输入N个非负整数.输出最大的整数E使得有至少E个整数大于E. AAAAAccepted code: #define HAVE_STRUCT_TI ...
- [SDOI2016] 生成魔咒 - 后缀数组,平衡树,STL,时间倒流
[SDOI2016] 生成魔咒 Description 初态串为空,每次在末尾追加一个字符,动态维护本质不同的子串数. Solution 考虑时间倒流,并将串反转,则变为每次从开头删掉一个字符,即每次 ...