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


#創建sftp組:

groupadd sftp

#創建一個用戶sftpuser:

useradd -g sftp -s /bin/false sftpuser

#提示:

/etc/group      文件包含所有組
/etc/shadow    /etc/passwd    系統存在的所有用戶名

 

#設置sftpuser用戶的密碼,會要求你輸入兩次密碼確認:

passwd sftpuser

#創建一個sftp的上傳目錄:

mkdir /datas/www

#修改用戶sftpuser所在的目錄:

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目錄權限:

chown -R root:root /datas/www
chmod 755 /datas/www

#建立SFTP用戶登入后可寫入的目錄:

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

 

常見問題:

1、修改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

 

 

2、如果你鏈接服務器的時候出現下面的提示:

> Write failed: Broken pipe     
> Couldn't read packet: Connection reset by peer

這個問題的原因是ChrootDirectory的權限問題,你設定的目錄必須是root用戶所有,否則就會出現問題。所以請確保sftp用戶根目錄的所有人是root, 權限是 750 或者 755。注意以下兩點原則:

  • 目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root,用戶組可以不是 root。

  • 目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限 

  • 上面2點一定注意,仔細檢查。我就是因為這個問題,導致一直有這個問題。仔細檢查配置后,解決問題。

 

參考資料:

https://segmentfault.com/a/1190000008578734

http://www.cnblogs.com/kgdxpr/p/3623369.html

http://blog.csdn.net/xinxin19881112/article/details/46831311


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM