SFTP一般指SSH文件传输协议,在计算机领域,SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secret File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP或字母缩写:SFTP)是一数据流连接,提供文件访问、传输和管理功能的网络传输协议

SFTP相关命令

# 查看服务进程
ps -e | grep sftp

# 外部连接SFTP服务(说明)
sftp <账号>@<服务地址>
# 外部连接SFTP服务(实例)
sftp ftp-test@123.123.123

# 查看本地文件
ls
# 查看当前工作目录
pwd

# 将远程服务文件下载到本地
get /html/index.nginx-debian.html /Users/zhengshangjin

# 本地文件上传到远程服务器
put /Users/zhengshangjin/name.txt /html/

创建账号

新建用户
# 仅创建用户
sudo useradd ftp-test

# 增加用户test,并制定test用户的主目录为/home/test(可选操作)
sudo useradd -d /home/ftp-test -m ftp-test

# 为ftp-test设置密码
sudo passwd ftp-test
删除用户
sudo userdel ftp-test
账号查看
cat /etc/passwd

权限设置

默认新建一个账号的情况下,该账号会具备SSH登录的能力,但很多时候,我们新建SFTP专属账号的目的就是为了方便他人上传文件且只能访问指定目录及其以下而已,并不想让它能操作服务器其他功能,那这个时候就需要去除账号的SSH登录能力,并且限制指定目录。

限制登录后效果
image-20210915113918224
修改配置文件
sudo vim /etc/ssh/sshd_config
配置文件内容
# 注释掉这行
# Subsystem sftp /usr/libexec/openssh/sftp-server

# 在最方 添加以下内容

# 指定使用sftp服务使用系统自带的internal-sftp
internal-sftp

# 匹配用户,如果要匹配多个组,多个组之间用逗号分割
Match User xxx
# 指定xxx用户只能sftp到本目录
ChrootDirectory /var/www/

# 设置第N个账号
Match User yyy
ChrootDirectory /var/www/

# 如果不希望该用户能使用端口转发的话就加上,否则删掉或注释
X11Forwarding no   
AllowTcpForwarding no

# 指定sftp命令
ForceCommand internal-sftp
# 配置结果例子
....
UsePAM yes
Ciphers aes128-cbc,aes192-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr,3des-cbc,arcfour128,arcfour256,arcfour,blowfish-cbc,cast128-cbc
MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-sha1-96,hmac-md5-96
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org

PasswordAuthentication yes

# SFTP配置内容
Subsystem sftp internal-sftp

Match user ftp-test
ChrootDirectory /var/www/

ForceCommand internal-sftp
重启服务
# 重启
sudo service ssh restart

# 查看状态
sudo service ssh status

# 检查配置
sshd -t

# 注意:部分可能是sshd或ssh
需要注意
  • SFTP用户访问目录需要设置所有者和所属组的权限均为root,并设置目录的权限为755,
  • 但此目录下的文件及目录的权限我们可根据自己的需求任意设置。
  • 由 ChrootDirectory 指定的目录及上级开始一直往上到系统根目录为止的目录拥有者都只能是 root
  • 由 ChrootDirectory 指定的目录及上级开始一直往上到系统根目录为止都不可以具有群组写入权限(最大权限 755)
# 用法:
chown 【选项】【用户:用户组】 file/dr
   
# 将test.java文件所属的用户设置成root
sudo chown root test.java
     
# 将test.java文件的所属用户设置成root,所属用户组设置成root
sudo chown root:root test.java
 
# 将test及其内部文件所属用户设置成root,所属用户组设置成root
sudo chown -R root:root  test/
  • 那么假如需要操作的目录为**/var/www/html/,就可以设置限定目录为/var/www/**
  • 然后对**html/**单独授予最高操作权限即可使用

如果违反了上面的要求,那么就会出现新用户访问不了SFTP

异常问题

有时候可能由于配置修改的时候不注意,出现特殊符号,单词错误等,导致ssh无法重启。这里有一个例子

因为配置中特殊空格的问题,导致报错

通过命令sshd -t打印出错误内容,在129行,这里去配置文件中就看到问题了。

修改后保存,重启完成!

Q.E.D.