1. 程式人生 > >linux建立sftp伺服器

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