Centos 7 搭建 sftp
# ssh -V 來查看openssh的版本,如果低於4.8p1,需要自行升級安裝,不在這裡具體介紹了。
1、建立sftp組# groupadd sftp 2、建立一個sftp使用者,名為aguisftp# useradd -g sftp -s /bin/false aguisftp# passwd aguisftp3、sftp組的使用者的home目錄統一指定到/agui/sftp下,按使用者名稱區分,這裡先建立一個mysftp目錄,然後指定mysftp的home為/agui/sftp/mysftp# mkdir -p /agui/sftp/mysftp# usermod -d /agui/sftp/mysftp aguisftp
4、配置sshd_config編輯 /etc/ssh/sshd_config# vim +132 /etc/ssh/sshd_config **找到如下這行,並注釋掉**Subsystem sftp /usr/libexec/openssh/sftp-server 添加如下幾行Subsystem sftp internal-sftp Match Group sftp ChrootDirectory /data/sftp ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no **解釋一下添加的幾行的意思**Subsystem sftp internal-sftp 這行指定使用sftp服務使用系統內建的internal-sftpMatch Group sftp 這行用來匹配sftp組的使用者,如果要匹配多個組,多個組之間用逗號分割當然,也可以匹配使用者Match User mysftp這樣就可以匹配使用者了,多個使用者名稱之間也是用逗號分割,但我們這裡按組匹配更靈活和方便ChrootDirectory /data/sftp/%u 用chroot將使用者的根目錄指定到/data/sftp/%u,%u代表使用者名稱,這樣使用者就只能在/data/sftp/%u下活動,chroot的含義,可以參考這裡:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ForceCommand internal-sftp 指定sftp命令AllowTcpForwarding no X11Forwarding no 這兩行,如果不希望該使用者能使用連接埠轉寄的話就加上,否則刪掉
5、設定Chroot目錄許可權# chown root:sftp /agui/sftp# chmod 755 /agui/sftp錯誤的目錄許可權設定會導致在log中出現”fatal: bad ownership or modes for chroot directory XXXXXX”的內容目錄的許可權設定有兩個要點:1、由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是root2、由ChrootDirectory指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入許可權所以遵循以上兩個原則1)我們將/data/sftp/aguisftp的所有者設定為了root,所有組設定為sftp2)我們將/data/sftp/aguisftp的使用權限設定為755,所有者root有寫入許可權,而所有組sftp無寫入許可權
6、建立SFTP使用者登入後可寫入的目錄照上面設定後,在重啟sshd服務後,使用者mysftp已經可以登入,但使用chroot指定根目錄後,根應該是無法寫入的,所以要建立一個目錄供mysftp上傳檔案。這個目錄所有者為aguisftp,所有組為sftp,所有者有寫入許可權,而所有組無寫入許可權# mkdir /data/sftp/mysftp/upload # chown aguisftp:sftp /data/sftp/mysftp # chmod 755 /data/sftp/mysftp7、重啟sshd服務# service sshd restart 到這裡,mysftp已經可以通過sftp用戶端登入並可以上傳檔案到upload目錄。如果還是不能在此目錄下上傳檔案,提示沒有許可權,檢查SElinux是否關閉,可以使用如下指令關閉SElinux修改/etc/selinux/config檔案中的SELINUX="" 為 disabled ,然後重啟。或者# setenforce 0
測試:sftp mysftp@127.0.0.1 顯示 sftp> 則sftp搭建成功
如上配置會出現沒有寫入許可權的錯誤,如下
我們可以使用 root 去串連ssh服務實現 檔案的上傳和下載。
sftp root@127.0.0.1
解決我們aguisftp 使用者無法讀寫問題:
[root@VM_12_177_centos upload]# sftp aguisftp@127.0.0.1 aguisftp@127.0.0.1's password: Write failed: Broken pipeCouldn't read packet: Connection reset by peer
這個問題的原因是ChrootDirectory的許可權問題,你設定的目錄必須是root使用者所有,否則就會出現問題。所以請確保sftp使用者根目錄的所有人是root, 許可權是 750 或者 755。注意以下兩點原則:
(1)目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root,使用者組可以不是 root。
(2)目錄開始一直往上到系統根目錄為止都不可以具有群組寫入許可權
上面2點一定注意,仔細檢查。我就是因為這個問題,導致一直有這個問題。仔細檢查配置後,解決問題。
輸入如下命令 :[root@VM_12_177_centos upload]# chown -R root:root /agui/sftp[root@VM_12_177_centos upload]# chmod 755 /agui/sftp[root@VM_12_177_centos upload]# chown aguisftp:sftp /agui/sftp/mysftp[root@VM_12_177_centos upload]# chmod 777 /agui/sftp/mysftp[root@VM_12_177_centos upload]# service sshd restartRedirecting to /bin/systemctl restart sshd.service[root@VM_12_177_centos upload]# sftp aguisftp@127.0.0.1 aguisftp@127.0.0.1's password: Connected to 127.0.0.1.sftp>
問題已解決 , java 代碼測試如下 :