Centos 7 搭建 sftp

来源:互联网 发布:陶瓷设计软件有哪些 编辑:程序博客网 时间:2024/06/06 00:15
# 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/%uchroot将用户的根目录指定到/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 代码测试如下 :

这里写图片描述

原创粉丝点击