• CentOS 配置 sftp 服务


    检查 openssh 版本

    如果需要使用 ChrootDirectory 参数配置用户访问的默认路径,openssh 的版本不能低于 4.8

    ssh -V
    
    • 1

    OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017

    创建 sftp 用户

    Linux 系统内已存在的用户,都是可以直接使用 sftp 服务,创建用户是为了一些特殊的场景使用,做一些区分

    for-sftp 用户的登录 shell 指定为 /sbin/nologin ,不让 for-sftp 用户可以通过 ssh 命令登录到服务器

    useradd for-sftp -s /sbin/nologin
    
    • 1

    for-sftp 用户设置密码

    echo for-sftp | passwd --stdin for-sftp
    
    • 1

    配置 sftp

    多备份,少跑路

    cp /etc/ssh/sshd_config{,.bak}
    
    • 1

    可以直接过滤 sftp 关键字

    # 注释掉下面的这行内容,因为配置的 for-sftp 用户没有登录 shell 的权限
    ## 不注释的话,登录的时候会返回报错:Received message too long 1416128883
    # Subsystem sftp /usr/libexec/openssh/sftp-server
    # 修改成下面的方式来打开 sftp 服务
    Subsystem sftp internal-sftp
    # Match User 后面的配置内容,只对 Match User 指定的用户生效,多个用户以逗号分隔
    ## 也可以配置成 Match Group,对指定的组生效,同样,多个组以逗号分隔
    Match User for-sftp
    # 指定 sftp 登录的默认路径
    ## 目录必须存在,否则 sftp 连接会报错
    ChrootDirectory /data/sftp
    # 指定 sftp 命令
    ForceCommand internal-sftp
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 配置了 ChrootDirectory 时,sftp 对于 ChrootDirectory 目录的权限要求比较死
      • 不允许 ChrootDirectory属组有写入权限,也就是最高只支持 750755 两种权限
      • ChrootDirectory属主必须是 root 用户
        • 不满足以上两种条件时,用 for-sftp 用户登录 sftp 会报错:
          • packet_write_wait: Connection to port 22: Broken pipe
          • Couldn't read packet: Connection reset by peer

    重启 sshd 服务

    重启 sshd 服务才能使 sftp 配置生效

    systemctl restart sshd
    
    • 1

    如果出现了以下报错

    Directive 'Protocol' is not allowed within a Match block

    那说明 /etc/ssh/sshd_config 配置文件内开了 Protocol 这个配置,需要把 sftp 相关的配置,移到 Protocol 后面几行就行,可以直接放到配置文件最后的地方,然后重启 sshd 服务就可以解决

    创建 ChrootDirectory

    • -m 750 - 指定目录创建时的权限
      • -m 只会指定创建时的最后一级目录,不影响前面的父级目录
    • -p - 父级目录不存在时,创建父级目录
    • 要给 ChrootDirectory 配置一个 for-sftp 组的权限,否则 for-sftp 用户也没权限进入到自己有权限的路径下搞事情
    mkdir /data/sftp -m 750 -p
    chown root.for-sftp /data/sftp
    
    • 1
    • 2

    sftp 配置了 ChrootDirectory 后,就只能查看文件,没办法上传文件,所以要在 ChrootDirectory 目录下在创建一个 for-sftp 用户有权限的路径,就可以上传文件了

    mkdir /data/sftp/for-sftp
    chown for-sftp.for-sftp /data/sftp/for-sftp
    
    • 1
    • 2

    登录 sftp 搞事情

    图省事,我就直接使用 localhost 了

    sftp for-sftp@localhost
    
    • 1
    for-sftp@localhost's password:
    Connected to localhost.
    sftp> ls
    for-sftp
    sftp> cd for-sftp/
    sftp> ls
    sftp> put anaconda-ks.cfg
    Uploading anaconda-ks.cfg to /for-sftp/anaconda-ks.cfg
    anaconda-ks.cfg                                                      100% 1526     2.8MB/s   00:00
    sftp> ls
    anaconda-ks.cfg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后我们就把本地的 anaconda-ks.cfg 文件上传到 sftp 服务器上了,当我们查看 ChrootDirectory 目录的 for-sftp 目录下就会有 anaconda-ks.cfg 这个文件了

    sftp 常用命令

    登录到 sftp 服务器之后,输入 help 就可以查看所有的命令了

    Available commands:
    # 退出 sftp
    bye                                Quit sftp
    # 进入到 sftp 内指定的路径
    cd path                            Change remote directory to 'path'
    # 修改 sftp 内指定路径的属租
    chgrp grp path                     Change group of file 'path' to 'grp'
    # 修改 sftp 内指定路径的权限 [ ugo 权限]
    chmod mode path                    Change permissions of file 'path' to 'mode'
    # 修改 sftp 内指定路径的所有者
    chown own path                     Change owner of file 'path' to 'own'
    # 查看 sftp 内指定路径的统计信息
    df [-hi] [path]                    Display statistics for current directory or
                                       filesystem containing 'path'
    # 退出 sftp
    exit                               Quit sftp
    # 从 sftp 下载文件到本地
    get [-afPpRr] remote [local]       Download file
    # 恢复下载
    reget [-fPpRr] remote [local]      Resume download file
    # 恢复上传
    reput [-fPpRr] [local] remote      Resume upload file
    # 查看帮助
    help                               Display this help text
    # 修改本地所在路径
    lcd path                           Change local directory to 'path'
    # 查看本地路径下的文件详情
    lls [ls-options [path]]            Display local directory listing
    # 本地创建路径
    lmkdir path                        Create local directory
    # 生成连接文件
    ln [-s] oldpath newpath            Link remote file (-s for symlink)
    # 显示本地所在路径
    lpwd                               Print local working directory
    # 同 linux 查看指定路径下有哪些文件
    ls [-1afhlnrSt] [path]             Display remote directory listing
    # 设置本地 umask
    lumask umask                       Set local umask to 'umask'
    # sftp 内创建目录
    mkdir path                         Create remote directory
    # 切换进度表的显示
    progress                           Toggle display of progress meter
    # 本地文件上传到 sftp 内
    put [-afPpRr] local [remote]       Upload file
    # 显示 sftp 内当前所在路径
    pwd                                Display remote working directory
    # 退出 sftp
    quit                               Quit sftp
    # sftp 内文件重命名
    rename oldpath newpath             Rename remote file
    # sftp 内删除文件
    rm path                            Delete remote file
    # sftp 内删除目录
    rmdir path                         Remove remote directory
    # 生成连接文件
    symlink oldpath newpath            Symlink remote file
    # 查看 sftp 版本
    version                            Show SFTP version
    # 在本地执行命令
    !command                           Execute 'command' in local shell
    # 逃到本地 [ 其实就是退出 sftp ]
    !                                  Escape to local shell
    # 显示帮助
    ?                                  Synonym for help
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
  • 相关阅读:
    抽象工厂模式
    SAP UI5 里的 Busy Dialog 控件使用概述
    LeetCode 69.x的平方
    ROS -话题通信示例
    Ubuntu磁盘满了,导致黑屏
    Java 类加载机制
    go module 导入本地包
    Python自动抢购脚本,学废了双十一双十二帮女票抢购心爱的礼物,隔壁女孩都馋哭了。
    什么样的跨网数据摆渡系统,能够减少数据泄密的风险?
    10、文本处理工具
  • 原文地址:https://blog.csdn.net/u010383467/article/details/126364401