一、问题现象
sftp连接服务器报"client_loop: send disconnect: Broken pipe"错误,连接被服务器关闭,相关信息如下:
# sftp sftp_ppp@1192,168,1.106sftp_ptn@10.193.217.106's password: client_loop: send disconnect: Broken pipeConnection closed. Connection closed
二、问题排查
检查后台日志,显示如下错误:
bad ownership or modes for chroot directory "/data/sftp_ppp"
三、报错分析
这个错误日志出现配置SFTP服务时,服务器侧chroot目录的所有权或权限设置的不正确。chroot目录是指SFTP会将用户限制在某个目录内,该目录被称为“根目录”(root directory)。所谓chroot,即change root directory(更改根目录),意味着SFTP会将用户的根目录更改为你指定的这个chroot目录。
问题出现的原因可能有:
-
目录的所有者不是root。
-
目录权限不合适,通常chroot目录的权限需要严格设置,只有root用户可以读写执行,其他用户不可访问通常是755或700)。
四、解决方法
以下步骤操作在服务器端进行操作:
1、检查权限:
使用ls -ld
查看相关目录的所有权
# ll -ld /data drwxr-xr-x. 28 root root 4.0K 4月 17 16:09 /data# ll -ld /data/sftp_pppdrwx------. 2 sftp_ppp sftp_ppp 109 5月 16 11:26 /data/sftp_ppp
2、结果分析:
本例/data/sftp_ppp目录为提供给sftp_ppp用户数据目录,如上检查发现/data为root用户所有,权限755,满足要求,sftp_ppp目录属主为sftp_ppp用户,权限为775,作为chroot目录不满足要求。因此需新增chroot目录,把用户数据目录移到其下,并调整权限:
# mkdir -p /data/home# chown root:root /data/home && chmod 755 /data/home# mv /data/sftp_ppp /data/home# chmod 755 /data/home/sftp_ppp # 或 chmod 700 /data/home/sftp_ppp# chown sftp_ppp:sftp_ppp /data/home/sftp_ppp -R
3、配置SFTP服务器:
在SFTP服务器etc/ssh/sshd_config
中如下进行配置:
Match User sftp_ppp
ChrootDirectory /home/data
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
用户登录以后,在/sftp_ppp目录中进行数据存取。
4、重启SFTP服务器:
更改配置后需要重启服务器SSHD服务以使更改生效。