很多时候,我们需要配置某些用户使用Linux服务器,只能使用sftp服务,不能登录shell,本文介绍如何在SSH中配置这样的用户。
创建要给新用户sftpuser
$ sudo useradd -s /bin/false -m sftpuser
-s参数指定了这个用户没有shell可用(还没有配置sftp,这样做只是为了更安全)
-m参数表示给这个用户创建home目录(后面可以看到,这个参数多余了)
给sftpuser设置密码
$ sudo passwd sftpuser
修改sshd_config配置文件
Subsystem sftp internal-sftp
Match User sftpuser
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
ForceCommand internal-sftp
ChrootDirectory /home/sftpuser
从上到下依次解释:
匹配用户名sftpuser
关闭X11Forwarding和AllowTcpForwarding,这两个forwarding都跟sftp业务无关,
不允许登录TTY,
只能使用sftp相关命令,
只能在/home/sftpuser目录下活动。
然后重启ssh服务器,我们先试着用sftpuser登录ssh,发现了如下错误:
C:\Users\xinli>ssh sftpuser@192.168.78.134
sftpuser@192.168.78.134's password:
PTY allocation request failed on channel 0
This service allows sftp connections only. Connection to 192.168.78.134 closed.
就应该这样。
修改目录权限
目录权限设置要遵循2点:
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,权限最大设置只能是755。
$ pwd /home $ sudo chown -R root:root sftpuser $ su root $ cd sftpuser $ mkdir upload $ chown -R sftpuser:sftpuser upload
将sftpuser的home全部给root,并且在这个目录中设置一个upload目录,upload给sftpuser。
这样,sftpuser这个用户登录sftp之后,只能打开upload目录,并且只有在upload目录下才有写的权限。
/home/sftpuser目录下的其它文件其实是没有存在的意义的,最开始useradd使用了-m参数,多余了。
然后用sftp软件连接测试:

通过SSH配置纯sftp用户及权限
测试成功,sftpuser用户就成为要给纯sftp用户,只能使用sftp业务,有自己独立的读写目录。
通过ssh的配置,来支持sftp用户,不用另外安装其它sftp服务器软件。不过,貌似不能很方便地限制文件夹的最大尺寸!