一、SFTP是什么?
SFTP(SSH File Transfer Protocol)是安全文件传送协议,可以为传输文件提供一种安全的网络的加密方法。sftp 与ftp 有着几乎一样的语法和功能。
在计算机领域,SSH 文件传输协议(英语:SSH File Transfer Protocol,也称 Secret File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP 或字母缩写:SFTP)是一数据流连线,提供文件访问、传输和管理功能的网络传输协议。由互联网工程任务组(IETF)设计,透过 SSH 2.0 的扩展提供安全文件传输能力,但也能够被其他协议使用。
即使 IETF 在网络草案数据阶段时,这个协议是在 SSH-2 文件中描述,它能够使用在许多不同的应用程序,例如安全文件传输在传输层安全(TLS)和传输信息管理于虚拟专用网应用程序。这个协议是假设运行在安全信道,例如 SSH,服务器已经认证客户端,并且客户端用户可利用协议。
与早期的 SCP 协议只允许文件传输相比,SFTP 允许对远程文件进行更广泛的操作——这更像一个远程文件系统协议。一个 SFTP 客户端与 SCP 的能力比较包括额外的恢复中断传输,目录列表和远程文件移动。
二、部署步骤
1、创建sftp组
groupadd sftp
2、创建测试用户,并设置解释器为/bin/false
/bin/false是最严格的禁止login选项,一切服务都不能用
/sbin/nologin只是不允许login系统
useradd -g sftp -s /bin/false sftptest
3、给测试用户设置密码
passwd sftptest
4、创建数据目录
mkdir -p /sftp/sftptest
5、设置测试账户访问目录的权限
usermod -d /sftp/sftptest sftptest
6、设置ssh配置文件
vi /etc/ssh/sshd_config
......
Subsystem sftp /usr/libexec/openssh/sftp-server ##注释掉该行
......
在末尾添加以下内容
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
......
7修改测试目录的所有者和所属组
chown root:sftp /sftp/sftptest
8、给测试目录设置权限
chmod 755 /sftp/sftptest
9、创建测试目录
mkdir /sftp/sftptest/test
10、修改测试目录的所有者和所属组
chown sftptest:sftp /sftp/sftptest/test
11、测试目录设置权限
chmod 755 /sftp/sftptest/test
12、关闭防火墙
systemctl stop firewalld
13、关闭防火墙开机启动
systemctl disable firewalld
14、关闭selinux
vi /etc/selinux/config
......
SELINUX=disabled
......
15、重启ssh服务
service sshd restart
16、测试登录
sftp -P22 sftptest@sftp服务器地址
三、常用命令
1、使用命令?
或者help
可以查看命令帮助信息,如下:
sftp> ?
Available commands:
bye 退出 sftp
cd path 更改远程目录到 'path'
chgrp [-h] grp path 将文件 'path' 的组更改为 'grp'
chmod [-h] mode path 将文件 'path' 的权限更改为 'mode'
chown [-h] own path 将文件 'path' 的属主更改为 'own'
df [-hi] [path] 显示当前目录的统计信息或包含 'path' 的文件系统
exit 退出 sftp
get [-afpR] remote [local] 下载文件
help 显示这个帮助文本
lcd path 更改本地目录到 'path'
lls [ls-options [path]] 显示本地目录列表
lmkdir path 创建本地目录
ln [-s] oldpath newpath 符号链接远程文件
lpwd 显示本地工作目录
ls [-1afhlnrSt] [path] 显示远程目录列表
lumask umask 将本地umask设置为 'umask'
mkdir path 创建远程目录
progress 切换是否显示文件传输进度
put [-afpR] local [remote] 上传文件
pwd 显示远程工作目录
quit 退出 sftp
reget [-fpR] remote [local] 恢复下载文件
rename oldpath newpath 重命名远程文件
reput [-fpR] local [remote] 恢复上传文件
rm path 删除远程文件
rmdir path 删除远程目录
symlink oldpath newpath 符号链接远程文件
version 显示 SFTP 版本信息
!command 在本地shell中执行 'command'
! 启动本地shell
? 帮助信息
sftp>
2、退出
退出命令有3个,直接输入一个回车即断开sftp连接
bye quit exit
3、pwd和lpwdpwd
是看远端服务器的目录, 即sftp服务器默认的当前目录lpwd
是看linux本地目录
4、ls和llsls
是看sftp服务器下当前目录下的列表lls
是看linux当前目录下的列表
5、put
这个是把linux当前目录下的文件上传到sftp服务器的当前目录下。
```bash
sftp> put /home/ryuu/test.txt
Uploading /home/ryuu/test.txt to /home/ryuu/test.txt
/home/ryuu/test.txt 100% 0 0.0KB/s 00:00
sftp> ls
Desktop Documents Downloads IOSAPP Pictures
Templates config.json derby.log fontconfig hello
nohup.out share test.txt
sftp>
6、get
这个是把sftp服务器的文件下载到linux当前目录下
sftp> get /home/ryuu/hello
Fetching /home/ryuu/hello to hello
/home/ryuu/hello 100% 174 45.4KB/s 00:00
sftp>
7、!command
这个是指在linux上执行command
这个命令, 比如!ls是列举linux当前目录下的东东, !rm 是删除linux当前目录下的文件。
这个命令非常非常有用, 因为在sftp> 后输入命令, 默认值针对sftp服务器的, 所以执行rm 删除的是sftp服务器上的文件, 而非本地的linux上的文件。
sftp> ! w
10:27:39 up 2:07, 1 user, load average: 1.04, 1.38, 1.96
USER TTY 来自 LOGIN@ IDLE JCPU PCPU WHAT
kei :0 :0 08:20 ?xdm? 38:27 0.01s /usr/lib/gdm3/g
sftp>