CentOS 配置 sftp 服务

检查 openssh 版本

如果需要使用 ChrootDirectory 参数配置用户访问的默认路径,openssh 的版本不能低于 4.8

ssh -V

OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017

创建 sftp 用户

Linux 系统内已存在的用户,都是可以直接使用 sftp 服务,创建用户是为了一些特殊的场景使用,做一些区分

for-sftp 用户的登录 shell 指定为 /sbin/nologin ,不让 for-sftp 用户可以通过 ssh 命令登录到服务器

useradd for-sftp -s /sbin/nologin

for-sftp 用户设置密码

echo for-sftp | passwd --stdin for-sftp

配置 sftp

多备份,少跑路

cp /etc/ssh/sshd_config{,.bak}

可以直接过滤 sftp 关键字

# 注释掉下面的这行内容,因为配置的 for-sftp 用户没有登录 shell 的权限
## 不注释的话,登录的时候会返回报错:Received message too long 1416128883
# Subsystem sftp /usr/libexec/openssh/sftp-server
# 修改成下面的方式来打开 sftp 服务
Subsystem sftp internal-sftp
# Match User 后面的配置内容,只对 Match User 指定的用户生效,多个用户以逗号分隔
## 也可以配置成 Match Group,对指定的组生效,同样,多个组以逗号分隔
Match User for-sftp
# 指定 sftp 登录的默认路径
## 目录必须存在,否则 sftp 连接会报错
ChrootDirectory /data/sftp
# 指定 sftp 命令
ForceCommand internal-sftp
  • 配置了 ChrootDirectory 时,sftp 对于 ChrootDirectory 目录的权限要求比较死
    • 不允许 ChrootDirectory属组有写入权限,也就是最高只支持 750755 两种权限
    • ChrootDirectory属主必须是 root 用户
      • 不满足以上两种条件时,用 for-sftp 用户登录 sftp 会报错:
        • packet_write_wait: Connection to <ip地址> port 22: Broken pipe
        • Couldn't read packet: Connection reset by peer

重启 sshd 服务

重启 sshd 服务才能使 sftp 配置生效

systemctl restart sshd

如果出现了以下报错

Directive 'Protocol' is not allowed within a Match block

那说明 /etc/ssh/sshd_config 配置文件内开了 Protocol 这个配置,需要把 sftp 相关的配置,移到 Protocol 后面几行就行,可以直接放到配置文件最后的地方,然后重启 sshd 服务就可以解决

创建 ChrootDirectory

  • -m 750 - 指定目录创建时的权限
    • -m 只会指定创建时的最后一级目录,不影响前面的父级目录
  • -p - 父级目录不存在时,创建父级目录
  • 要给 ChrootDirectory 配置一个 for-sftp 组的权限,否则 for-sftp 用户也没权限进入到自己有权限的路径下搞事情
mkdir /data/sftp -m 750 -p
chown root.for-sftp /data/sftp

sftp 配置了 ChrootDirectory 后,就只能查看文件,没办法上传文件,所以要在 ChrootDirectory 目录下在创建一个 for-sftp 用户有权限的路径,就可以上传文件了

mkdir /data/sftp/for-sftp
chown for-sftp.for-sftp /data/sftp/for-sftp

登录 sftp 搞事情

图省事,我就直接使用 localhost 了

sftp for-sftp@localhost
for-sftp@localhost's password:
Connected to localhost.
sftp> ls
for-sftp
sftp> cd for-sftp/
sftp> ls
sftp> put anaconda-ks.cfg
Uploading anaconda-ks.cfg to /for-sftp/anaconda-ks.cfg
anaconda-ks.cfg                                                      100% 1526     2.8MB/s   00:00
sftp> ls
anaconda-ks.cfg

然后我们就把本地的 anaconda-ks.cfg 文件上传到 sftp 服务器上了,当我们查看 ChrootDirectory 目录的 for-sftp 目录下就会有 anaconda-ks.cfg 这个文件了

sftp 常用命令

登录到 sftp 服务器之后,输入 help 就可以查看所有的命令了

Available commands:
# 退出 sftp
bye                                Quit sftp
# 进入到 sftp 内指定的路径
cd path                            Change remote directory to 'path'
# 修改 sftp 内指定路径的属租
chgrp grp path                     Change group of file 'path' to 'grp'
# 修改 sftp 内指定路径的权限 [ ugo 权限]
chmod mode path                    Change permissions of file 'path' to 'mode'
# 修改 sftp 内指定路径的所有者
chown own path                     Change owner of file 'path' to 'own'
# 查看 sftp 内指定路径的统计信息
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
# 退出 sftp
exit                               Quit sftp
# 从 sftp 下载文件到本地
get [-afPpRr] remote [local]       Download file
# 恢复下载
reget [-fPpRr] remote [local]      Resume download file
# 恢复上传
reput [-fPpRr] [local] remote      Resume upload file
# 查看帮助
help                               Display this help text
# 修改本地所在路径
lcd path                           Change local directory to 'path'
# 查看本地路径下的文件详情
lls [ls-options [path]]            Display local directory listing
# 本地创建路径
lmkdir path                        Create local directory
# 生成连接文件
ln [-s] oldpath newpath            Link remote file (-s for symlink)
# 显示本地所在路径
lpwd                               Print local working directory
# 同 linux 查看指定路径下有哪些文件
ls [-1afhlnrSt] [path]             Display remote directory listing
# 设置本地 umask
lumask umask                       Set local umask to 'umask'
# sftp 内创建目录
mkdir path                         Create remote directory
# 切换进度表的显示
progress                           Toggle display of progress meter
# 本地文件上传到 sftp 内
put [-afPpRr] local [remote]       Upload file
# 显示 sftp 内当前所在路径
pwd                                Display remote working directory
# 退出 sftp
quit                               Quit sftp
# sftp 内文件重命名
rename oldpath newpath             Rename remote file
# sftp 内删除文件
rm path                            Delete remote file
# sftp 内删除目录
rmdir path                         Remove remote directory
# 生成连接文件
symlink oldpath newpath            Symlink remote file
# 查看 sftp 版本
version                            Show SFTP version
# 在本地执行命令
!command                           Execute 'command' in local shell
# 逃到本地 [ 其实就是退出 sftp ]
!                                  Escape to local shell
# 显示帮助
?                                  Synonym for help
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值