#建立sftp组:html
groupadd sftp
#建立一个用户sftpuser:linux
useradd -g sftp -s /bin/false sftpuser
#提示:segmentfault
/etc/group 文件包含全部组
/etc/shadow /etc/passwd 系统存在的全部用户名
#设置sftpuser用户的密码,会要求你输入两次密码确认:服务器
passwd sftpuser
#建立一个sftp的上传目录:app
mkdir /datas/www
#修改用户sftpuser所在的目录:ssh
usermod -d /datas/www sftpuser
#配置sshd_config:性能
vi /etc/ssh/sshd_config
#找到以下这行,并注释掉
#Subsystem sftp /usr/libexec/openssh/sftp-server
#添加以下几行(若是添加以后出现问题,则添加到最后)
Subsystem sftp internal-sftp #这行指定使用sftp服务使用系统自带的internal-sftp Match User sftpuser #这行用来匹配用户 ChrootDirectory /datas/www #用chroot将用户的根目录指定到/datas/www ,这样用户就只能在/datas/www下活动 AllowTcpForwarding no ForceCommand internal-sftp #指定sftp命令
为何用 internal-sftp 而不用默认的 sftp-server,这是由于: 这是一个进程内的 sftp 服务,当用户 ChrootDirectory 的时候,将不请求任何文件; 更好的性能,不用为 sftp 再开一个进程。
#保存退出测试
#设定Chroot目录权限:ui
chown -R root:root /datas/www chmod 755 /datas/www
#创建SFTP用户登入后可写入的目录:spa
mkdir /datas/www/sftpuser chown -R sftpuser:sftp /datas/www/sftpuser/ chmod 755 /datas/www/sftpuser/
#重启sshd服务:
service sshd restart
#测试是否能正常登录:
sftp -P 22122 ftpuser@127.0.0.1
#关闭SElinux:
vi /etc/sysconfig/selinux #找到以下这行 SELINUX=enforcing #修改成 SELINUX=disabled
#保存退出
#这里讨论了为何要关闭这功能:https://www.zhihu.com/question/20559538
一、修改sshd_config文件后重启 sshd,报错:Directive 'UseDNS' is not allowed within a Match block
语法错误,缘由未知,只须要把两段配置的位置互调就不报错了。
修改前:
Subsystem sftp internal-sftp UsePAM yes Match user sftpuser1 ForceCommand internal-sftp ChrootDirectory /data/wwwroot/user1/ UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPRIV PasswordAuthentication yes
修改后(就是换个顺序):
UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPRIV PasswordAuthentication yes Subsystem sftp internal-sftp UsePAM yes Match user sftpuser1 ForceCommand internal-sftp ChrootDirectory /data/wwwroot/user1/
参考资料:http://www.cnblogs.com/xjnotxj/p/6912471.html
二、若是你连接服务器的时候出现下面的提示:
> Write failed: Broken pipe
> Couldn't read packet: Connection reset by peer
这个问题的缘由是ChrootDirectory的权限问题,你设定的目录必须是root用户全部,不然就会出现问题。因此请确保sftp用户根目录的全部人是root, 权限是 750 或者 755。注意如下两点原则:
目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组能够不是 root。
目录开始一直往上到系统根目录为止都不能够具备群组写入权限
参考资料:
http://www.javashuo.com/article/p-bjwpaxgq-co.html
http://www.cnblogs.com/kgdxpr/p/3623369.html
http://blog.csdn.net/xinxin19881112/article/details/46831311