Linux 限制SFTP用户只能访问某个目录

需求:其他机器需要向我方服务器传数据,要求只能看我方指定目录
目录最好放在/var/opt/sftp/,如果存储不够可以软链接过去

  1. 新建用户并设置密码

groupadd boss_user

useradd -d /data/boss_user -g boss_user boss_user

passwd boss_user

  1. 设置sshd配置文件

cd /etc/ssh/

cp sshd_config sshd_config.back // 备份

vi sshd_config

#下面这行需要注释、否则会报错
# Subsystem     sftp    /usr/libexec/openssh/sftp-server 

#新增以下字段
Subsystem sftp internal-sftp 
Match User boss_user
ChrootDirectory /data/ftp/
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

boss_user是我们要配置的用户
/data/ftp/是我们要制定的目录

  1. 重启sshd服务

service sshd restart

其实我到这一步,已经成功实现了Linux 限制SFTP用户只能访问某个目录​,我的需求是只允许boss_user用户访问/data/ftp/这个目录

  1. 创建目录并设置权限

mkdir /data/ftp

chown -R root:boss_user /data/ftp/

chmod -R 750 /data/ftp/

至关重要的是:

ChrootDirectory设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;

ChrootDirectory设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755。

注意:由于权限是755,导致非root用户都无法在目录中写入文件,所以需要在ChrootDirectory指定的目录下建立子目录,重新设置属主和权限。

如:

[root@hadoop100 ssh]# cd /data/ftp/
[root@hadoop100 ftp]# ll
total 0
[root@hadoop100 ftp]# mkdir testdir
[root@hadoop100 ftp]# chmod -R 755 testdir/
[root@hadoop100 ftp]# chown boss_user:boss_user /data/ftp/testdir/
  1. 测试一下
    sftp测试只有一个“/”目录,根目录下只有“testdir“
[dop@hadoop101 ~]$ sftp boss_user@192.168.10.100
boss_user@192.168.10.100's password:
Connected to 192.168.10.100.
sftp> ls
testdir
sftp> pwd
Remote working directory: /

ssh是拒绝的

[dop@hadoop101 ~]$ ssh boss_user@192.168.10.100
boss_user@192.168.10.100's password:
This service allows sftp connections only.
Connection to 192.168.10.100 closed.

常见报错:

  1. 登陆时报错:Write failed: Broken pipe, Couldn’t read packet: Connection reset by peer

原因:权限的问题,必须设置目录为属root用户,属sftp用户组。权限为750

  1. 重启sshd时报错:Starting sshd: /etc/ssh/sshd_config line 141: Subsystem ‘sftp’ already defined.

原因:忘记把Subsystem注释,导致/etc/ssh/sshd_config同时存在有两个Subsystem节点

  1. /etc/ssh/sshd_config line 148: Directive ‘UseDNS’ is not allowed within a Match block

把添加的写在文件最后就好了

<think>好的,用户的问题是关于使用FileZilla Client通过SFTP连接时只能访问目标服务器的C盘,而其他盘符不可见的原因。我需要先理解SFTP的工作原理以及不同操作系统的文件系统结构。 首先,SFTP是基于SSH协议的文件传输协议,主要用于Linux/Unix系统。Linux的文件系统结构与Windows不同,Linux采用单一的根目录结构,所有存储设备都挂载在根目录下的子目录中,比如/mnt或/media。而Windows使用多个盘符(如C:、D:)来区分不同的驱动器。因此,当通过SFTP连接到Linux服务器时,用户看到的是整个文件系统的树状结构,而不是分立的盘符。 接下来,用户提到的只能访问C盘,这可能存在误解。实际上,Linux服务器没有C盘的概念,C盘是Windows的盘符。可能的情况是用户连接的服务器是Windows系统,并且SFTP服务配置有问题,只允许访问系统盘。或者,用户将某个目录映射为类似C盘的名称,导致误解。 另一个可能性是权限问题。SFTP用户可能没有权限访问其他挂载的磁盘或目录,导致只能看到特定目录。需要检查服务器上的用户权限设置,确保用户对所需目录有读取权限。 此外,服务器配置可能限制SFTP用户的根目录。例如,chroot设置会将用户限制在其主目录下,无法访问上级目录或其他挂载点。这种情况下,即使用户的服务器有其他磁盘挂载到/mnt,用户也无法看到这些目录。 最后,需要确认用户是否真的连接到Linux服务器。如果服务器是Windows,并且运行了SFTP服务(如OpenSSH for Windows),默认可能只暴露系统盘。需要检查服务器类型和配置,确保其他磁盘已正确共享。 总结起来,可能的原因包括操作系统的文件结构差异、权限限制、服务器配置的chroot以及误连接Windows服务器。需要逐一排查这些因素,帮助用户解决问题。</think>### 原因分析 使用FileZilla Client通过SFTP连接时只能看到类似“C盘”的路径,而其他盘符不可见,主要与以下原因相关: 1. **Linux文件系统结构与Windows的差异** - **Linux采用单一根目录结构**:所有存储设备(如硬盘、U盘)均挂载在根目录$/$下的子目录(例如$/$mnt、$/$media),而非独立盘符[^2]。 - **Windows盘符映射不适用**:SFTP协议基于Linux/Unix文件系统逻辑,若目标服务器是Linux系统,用户看到的路径从根目录开始,而非类似`C:\`的盘符。若服务器是Windows但通过SFTP暴露文件系统,可能因服务配置限制仅显示系统盘。 2. **权限限制** - SFTP连接的账户可能仅被授权访问特定目录(如用户目录或系统默认路径),导致其他挂载的存储设备不可见。需检查服务器端用户权限设置,例如`sshd_config`中的`ChrootDirectory`或`AllowUsers`配置[^3]。 3. **服务器端配置问题** - **Chroot环境限制**:若用户限制在`chroot`环境中,其可见的文件系统范围会被锁定到指定目录,无法访问外部挂载点。 - **符号链接或挂载点未正确配置**:其他磁盘可能挂载在非标准路径(如`/data`或`/mnt/disk2`),需确认挂载操作已完成且路径对SFTP用户可见。 4. **Windows服务器特殊情况** - 若目标服务器是Windows且运行OpenSSH服务,默认情况下SFTP可能仅暴露系统盘(`C:\`)。需在服务配置中明确添加其他盘符的访问路径,例如通过修改`sftp-server`的配置文件或权限策略。 --- ### 解决方案 1. **检查服务器操作系统类型** - 确认目标服务器是Linux还是Windows: - Linux服务器:通过SSH登录后执行`lsblk`或`df -h`查看所有挂载点。 - Windows服务器:检查OpenSSH服务配置,确认共享路径是否包含其他盘符。 2. **验证用户权限** - 在Linux服务器上,执行以下命令查看用户权限: ```bash grep <username> /etc/ssh/sshd_config ``` 若存在`ChrootDirectory /path/to/dir`,则用户限制在该目录内。 3. **调整挂载点可见性** - 将其他磁盘挂载到SFTP用户有权访问的路径,例如: ```bash sudo mount /dev/sdb1 /home/user/external_disk ``` 并确保用户对该路径有读取权限。 4. **修改SSH/SFTP配置** - 编辑`/etc/ssh/sshd_config`,注释或删除`ChrootDirectory`相关限制,重启SSH服务: ```bash sudo systemctl restart sshd ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值