sftp 登录到指定目录

修改 sshd 配置: /etc/ssh/sshd_config

#Subsystem      sftp    /usr/lib/openssh/sftp-server
Subsystem       sftp    internal-sftp  #修改为internal-sftp

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server

Match User test
       ChrootDirectory /sftpdata/test
       X11Forwarding no
       AllowTcpForwarding no
       PermitTTY no
       ForceCommand internal-sftp  #指定sftp命令,ssh不可以登录

Match Group sftpgroup
       ChrootDirectory /sftpdata/%u
       X11Forwarding no
       AllowTcpForwarding no
       PermitTTY no
       ForceCommand internal-sftp

Match Group sftpgroup #匹配 sftpgroup 组

ChrootDirectory /data/sftp/%u #设定属于用户组 sftpgroup 的用户访问的根文件夹。%h 代表用户 home 目录,%u 代表用户名。

ForceCommand internal-sftp # 该行强制执行内部 sftp

AllowTcpForwarding no # 是否允许 TCP 转发

X11Forwarding no # 是否允许进行 X11 转发。

ChrootDirectory 目录权限

ChrootDirectory 设置的目录权限及其所有的上级目录权限,属主和属组必须是 root,权限最大为 755

创建 sftp 用户

指定 sftp 的根目录,并不能登录

# 创建 sftpgroup 组
groupadd sftpgroup

# 创建 user1 用户
useradd user1 -g sftpgroup -d /sftpdata/user1 -s /sbin/nologin
passwd user1

# 创建 其他用户等
useradd otheruser -g sftpgroup -d /sftpdata/otheruser -s /sbin/nologin
passwd otheruser

用户不能登录,但有自己的 shell家目录,并能 su 切换

# 正常创建一个用户
adduser tt

usermod tt -g sftpgroup

因为ForceCommand internal-sftp 限制了只能 sftp,不能登录,但用户是可以 su 切换。

创建 sftp 的根目录,并设置对应权限

ChrootDirectory 的所有者是 root 且权限设置为 755 时,非特权用户(如 SFTP 用户)在该目录中无法创建新目录或文件。这是因为权限 755 意味着只有目录的所有者(即 root)可以写入。

如果你希望 SFTP 用户能够创建目录或上传文件,你需要在 ChrootDirectory 的某个子目录中给予该用户写权限。

以 user1 用户为例,以下是具体的步骤:

  1. 创建用户可写的子目录

    • 使用 root 权限在 /sftpdata/user1 内创建一个子目录,比如 uploads

    • 更改子目录的所有者,使其属于特定的 SFTP 用户(如

    mkdir /sftpdata/user1/uploads
    
    chown user1:user1 /sftpdata/user1/uploads
    
    chmod 777 /sftpdata/oasis/uploads  # 或者根据需要设成 777
  2. 用户操作

    • 当用户连接到 SFTP 并进入到 uploads 目录时,他们应该可以创建目录和文件,因为他们在这个子目录下有写权限。

使用SFTP进行文件传输

Last modified: March 31, 2025

Author

Comments

Write a Reply or Comment

Your email address will not be published.