linux建立sftp伺服器
#建立sftp組:
groupadd sftp
#建立一個使用者sftpuser:
useradd -g sftp -s /bin/false sftpuser
#設定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 [email protected]
#關閉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