Linux(CentOS)上配置 SFTP(附解决Write failed: Broken pipe Couldn't read packet: Connection reset by peer)

#建立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。

  • 目录开始一直往上到系统根目录为止都不能够具备群组写入权限 

  • 上面2点必定注意,仔细检查。我就是由于这个问题,致使一直有这个问题。仔细检查配置后,解决问题。

 

参考资料:

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

相关文章
相关标签/搜索