如果需要使用
ChrootDirectory
参数配置用户访问的默认路径,openssh 的版本不能低于 4.8
ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
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
多备份,少跑路
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
的属组有写入权限
,也就是最高只支持750
和755
两种权限ChrootDirectory
的属主必须是 root 用户
- 不满足以上两种条件时,用
for-sftp
用户登录 sftp 会报错:
packet_write_wait: Connection to
port 22: Broken pipe Couldn't read packet: Connection reset by peer
重启 sshd 服务才能使 sftp 配置生效
systemctl restart sshd
Directive 'Protocol' is not allowed within a Match block
那说明
/etc/ssh/sshd_config
配置文件内开了Protocol
这个配置,需要把 sftp 相关的配置,移到Protocol
后面几行就行,可以直接放到配置文件最后的地方,然后重启 sshd 服务就可以解决
-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
图省事,我就直接使用 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 服务器之后,输入 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