## 一、SFTP简述
sftp(Secure File Transfer Protocol)是一种安全的文件传送协议,是ssh内含协议,也就是说只要sshd服务器启动了,sftp就可使用,不需要额外安装,它的默认端口和SSH一样为22。sftp通过使用加密/解密技术来保障传输文件的安全性,因此sftp的传输效率比普通的FTP要低,但sftp的安全性要比ftp高,因此sftp通常用于报表、对账单等对安全性要求较高的场景。
SFTP可以从远程服务器上下载/上传文件,使用的是SSH的22端口,通常情况下开启了ssh服务后,sftp服务也默认也开启。
## 二、SFTP服务配置(CentOS)
在CentOS 7系统中按照如下步骤配置sftp服务。
1、使用root用户查看openssh的版本:版本需要大于4.8p1
```bash
ssh -V
#如果版本过低,可以使用 yun update 进行更新
```
2、使用root用户创建用户组,组名为sftpgroup;创建sftp用户,用户名为sftpuser,并设置密码。
```bash
groupadd sftpgroup #创建用户组
useradd -g sftpgroup -M -s /sbin/nologin sftpuser #-M 表示创建用户时不生成对应home目录,-s /sbin/nologin 表示sftp用户不能登录系统
passwd sftpuser #修改sftpuser用户密码
```
3、修改配置文件sshd_config
```bash
vim /etc/ssh/sshd_config
==========================================================
将下面这行注释掉
#Subsystem sftp /usr/libexec/openssh/sftp-server
## 在文件末尾添加如下几行
Subsystem sftp internal-sftp
Match Group sftpgroup
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory %h
ForceCommand internal-sftp
===========================================================
```
4、使用root用户新建目录/home/sftpfile,将其设置为sftpuser的home目录,并指定目录权限
```bash
mkdir -p /sftp/sftpuser //-p 表示parents,即递归创建目录
usermod -d /sftp/sftpuser sftpuser // -d 表示修改用户home目录
// 设置Chroot目录权限
chown root:sftpgroup /sftp/sftpuser
chmod 755 /sftp/sftpuser
// 设置sftp用户可以操作的目录
mkdir /sftp/sftpuser/upload
chown sftpuser:sftpgroup /sftp/sftpuser/upload
chmod 755 /sftp/sftpuser/upload
```
5、重启SSH
```bash
systemctl restart sshd.service
```
6、验证:切换到sftpuser用户进行验证
```bash
sftp sftpuser@127.0.0.1
```
## 三、SFTP常用命令
sftp的常用命令和ftp基本相同,使用help可查询。
```bash
#连接服务器
sftp 172.16.33.106
sftp>ls
...
#上传文件用put
sftp>put /home/jilan/xxxx.txt
#下载文件用get
sftp>get /home/jilan/text.c
```
对于远程服务器主机常用的SFTP使用的命令
| sftp命令 | 说明 |
| ----------------------------------------------------- | ------------------------------------------------------------ |
| cd | 切换目录 |
| mkdir | 创建目录 |
| ls、dir | 列出目录 |
| rmdir | 删除目录 |
| pwd | 显示当前目录 |
| chgrp | 更改文件或目录的用户组 |
| chown | 更改文件或目录的所有者 |
| chmod | 更改文件或目录的权限 |
| ln | 建立连接文件 |
| exit、bye、quit | 离开远程主机 |
| put [本机目录或文件] [远程]
put [本机目录或文件] | 将本机文件上传至服务器,如果是后一种格式,则文件会存储到当前远程主机的目录。 |
| get [远程目录或文件] [本机]
get [远程目录或文件] | 将文件由远程主机下载回来,如果是后一种格式,则文件会存储到当前主机的目录中。 |