Linux 新建 SSH/SFTP 隔离用户

适用环境:CentOS Stream 9 / RHEL 9,x86_64,OpenSSH,SELinux Enforcing。

本文从系统软件、用户组和目录开始,建立一个独立的 SSH/SFTP 隔离账号。示例用户名为 test,公网地址为 xxx.com:22,内网地址为 192.168.1.1:22。账号、地址和路径按实际环境修改;所有命令均由 root 手工逐条执行,不使用变量、循环或条件分支。

1. 路径和访问方式

项目示例配置
公网 SFTP 地址xxx.com:22
内网 SSH/SFTP 地址192.168.1.1:22
用户名test
Linux 主目录字段/data/sftp/test/upload
ChrootDirectory/data/sftp/test
客户看到的上传目录/upload
宿主机真实上传目录/data/sftp/test/upload
附加组sftpusers
SSH 公钥文件/etc/ssh/authorized_keys/test,初始为空
设备挂载服务test-jail-devices.service

客户上传 /upload/example.csv,服务器上对应的文件就是 /data/sftp/test/upload/example.csv。两者是同一份文件,不需要额外绑定到 /data 的其他目录。

登录后 / 对应宿主机的 /data/sftp/test。环境内包含运行 SSH/SFTP 所需的 usr、etc、dev 等目录,用户只能写入自己的 upload。本方案是保留 shell 的 chroot 配置;chroot 主要限制文件系统视图,并不等同于完整的容器或网络隔离。

2. 准备系统软件与检查环境

首次安装所需软件。以下命令会安装软件及依赖,应在维护授权范围内执行。

dnf install -y openssh-server openssh-clients bash coreutils glibc ncurses-libs policycoreutils-python-utils audit
ssh-keygen -A
rpm -q openssh-server bash coreutils glibc
uname -m
getenforce
semanage login -l
getsebool ssh_chroot_rw_homedirs
ls -ldZ /data /data/sftp
df -h /data
ls -l /usr/bin/bash /usr/libexec/openssh/sftp-server

本例采用系统默认的 unconfined_u 登录映射。使用受限 SELinux 登录映射的环境,需要另外核对相应角色和 chroot 策略。记录 SELinux 开关和现有文件标签,便于回滚。

新用户、同名组、用户目录、公钥文件及设备服务应不存在;下面的查询无记录或提示路径不存在,是首次创建前的预期结果。已有对象不能直接覆盖。

getent passwd test
getent group test
getent group sftpusers
ls -ld /data/sftp/test
ls -l /etc/systemd/system/test-jail-devices.service
ls -l /etc/ssh/authorized_keys/test
grep -nE '^(Include|Match|Subsystem)' /etc/ssh/sshd_config
/usr/sbin/sshd -t

/data 和 /data/sftp 的目录标签会在第 5 节设置;应使用为本服务准备的路径。已有共享数据目录应先评估标签调整对其他服务的影响。

3. 备份 SSH 配置并创建账号

cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.before-test-20261104-153002
groupadd sftpusers
useradd -M -U -G sftpusers -d /data/sftp/test/upload -s /bin/bash test
chage -m 0 -M 99999 -W 7 -I -1 -E -1 test
id test

groupadd sftpusers 用于首次创建用户组;第 2 节已经查到该组时,手工跳过这一条命令。-M 表示不自动创建主目录,-U 表示创建独立主组。sftpusers 仅作为附加组,不加入 wheel,不授予 sudo 权限。

4. 从系统文件建立隔离运行环境

chroot 根目录及其上级路径必须由 root 拥有,且不能允许组或其他用户写入。上传目录单独建在根目录下,并交给客户账号管理。OpenSSH 官方说明

4.1 创建目录

下面的 /data 和 /data/sftp 用于首次准备服务目录。已存在且承载其他服务的路径,先确认其属主和权限,不要盲目调整。

install -d -o root -g root -m 0755 /data
install -d -o root -g root -m 0755 /data/sftp
install -d -o root -g root -m 0755 /data/sftp/test
install -d -o test -g sftpusers -m 0750 /data/sftp/test/upload
install -d -o root -g root -m 0755 /data/sftp/test/usr
install -d -o root -g root -m 0755 /data/sftp/test/usr/bin
install -d -o root -g root -m 0755 /data/sftp/test/usr/lib
install -d -o root -g root -m 0755 /data/sftp/test/usr/lib64
install -d -o root -g root -m 0755 /data/sftp/test/usr/libexec/openssh
install -d -o root -g root -m 0755 /data/sftp/test/etc
install -d -o root -g root -m 0755 /data/sftp/test/dev
ln -s usr/bin /data/sftp/test/bin
ln -s usr/lib /data/sftp/test/lib
ln -s usr/lib64 /data/sftp/test/lib64

4.2 复制 Bash、基本命令和 SFTP 服务程序

直接从本机系统目录复制程序。cp -L 将源符号链接解析为实际文件,并保留权限和时间属性,避免符号链接失效或管理员的 umask 导致客户无法执行程序。

cp -L --preserve=mode,timestamps /usr/bin/bash /data/sftp/test/usr/bin/bash
cp -L --preserve=mode,timestamps /usr/bin/ls /usr/bin/cp /usr/bin/mv /usr/bin/rm /usr/bin/mkdir /usr/bin/rmdir /usr/bin/cat /usr/bin/touch /usr/bin/id /usr/bin/pwd /usr/bin/whoami /usr/bin/chmod /usr/bin/head /usr/bin/tail /usr/bin/wc /usr/bin/stat /usr/bin/date /data/sftp/test/usr/bin/
ln -s bash /data/sftp/test/usr/bin/sh
cp -L --preserve=mode,timestamps /usr/libexec/openssh/sftp-server /data/sftp/test/usr/libexec/openssh/sftp-server

4.3 核对并复制动态链接器及依赖库

依赖随发行版、软件版本和架构变化。先查看本机结果,再执行下面的显式复制命令。linux-vdso.so.1 由内核提供,不需要复制;发现 not found 时先修复宿主机依赖。

ldd /usr/bin/bash
ldd /usr/bin/ls /usr/bin/cp /usr/bin/mv /usr/bin/rm /usr/bin/mkdir /usr/bin/rmdir /usr/bin/cat /usr/bin/touch /usr/bin/id /usr/bin/pwd /usr/bin/whoami /usr/bin/chmod /usr/bin/head /usr/bin/tail /usr/bin/wc /usr/bin/stat /usr/bin/date
ldd /usr/libexec/openssh/sftp-server

以下为 CentOS Stream 9 x86_64 对应程序的依赖示例。需要覆盖本机 ldd 输出中的每一条实际库路径;路径或库名不同的项目,应手工替换或补充,不要忽略复制报错。

cp -L --preserve=mode,timestamps /lib64/ld-linux-x86-64.so.2 /data/sftp/test/usr/lib64/ld-linux-x86-64.so.2
cp -L --preserve=mode,timestamps /lib64/libc.so.6 /data/sftp/test/usr/lib64/libc.so.6
cp -L --preserve=mode,timestamps /lib64/libtinfo.so.6 /data/sftp/test/usr/lib64/libtinfo.so.6
cp -L --preserve=mode,timestamps /lib64/libselinux.so.1 /data/sftp/test/usr/lib64/libselinux.so.1
cp -L --preserve=mode,timestamps /lib64/libpcre2-8.so.0 /data/sftp/test/usr/lib64/libpcre2-8.so.0
cp -L --preserve=mode,timestamps /lib64/libcap.so.2 /data/sftp/test/usr/lib64/libcap.so.2
cp -L --preserve=mode,timestamps /lib64/libacl.so.1 /data/sftp/test/usr/lib64/libacl.so.1
cp -L --preserve=mode,timestamps /lib64/libattr.so.1 /data/sftp/test/usr/lib64/libattr.so.1
cp -L --preserve=mode,timestamps /lib64/libcrypto.so.3 /data/sftp/test/usr/lib64/libcrypto.so.3
cp -L --preserve=mode,timestamps /lib64/libz.so.1 /data/sftp/test/usr/lib64/libz.so.1
cp -L --preserve=mode,timestamps /usr/lib64/libnss_files.so.2 /data/sftp/test/usr/lib64/libnss_files.so.2
cp -L --preserve=mode,timestamps /usr/lib64/libnss_dns.so.2 /data/sftp/test/usr/lib64/libnss_dns.so.2
cp -L --preserve=mode,timestamps /usr/lib64/libresolv.so.2 /data/sftp/test/usr/lib64/libresolv.so.2

新增可执行程序后,需要重新检查其依赖。宿主机软件更新后,隔离环境中复制的程序和库也需要同步维护。

4.4 创建账号解析和登录配置

读取新账号的实际 UID/GID,写入隔离环境内的身份文件,并把内部主目录字段改为 /upload。不复制宿主机密码数据库。

getent passwd root test > /data/sftp/test/etc/passwd
sed -i 's|:/data/sftp/test/upload:|:/upload:|' /data/sftp/test/etc/passwd
getent group root test sftpusers > /data/sftp/test/etc/group
cp -L --preserve=mode,timestamps /etc/localtime /data/sftp/test/etc/localtime
cp -L --preserve=mode,timestamps /etc/hosts /data/sftp/test/etc/hosts

cat 命令中,开始标记和结束的 EOF 之间是要写入的配置正文,需要整段复制执行。

cat > /data/sftp/test/etc/nsswitch.conf <<'EOF'
passwd: files
group: files
shadow: files
hosts: files
EOF
cat > /data/sftp/test/etc/profile <<'EOF'
umask 077
cd /upload
EOF
chown root:root /data/sftp/test/etc/passwd /data/sftp/test/etc/group /data/sftp/test/etc/nsswitch.conf /data/sftp/test/etc/profile
chmod 0644 /data/sftp/test/etc/passwd /data/sftp/test/etc/group /data/sftp/test/etc/nsswitch.conf /data/sftp/test/etc/profile
install -d -o root -g root -m 0755 /data/sftp/test/data/sftp/test
ln -s /upload /data/sftp/test/data/sftp/test/upload

Linux 账号的主目录字段为 /data/sftp/test/upload。在隔离环境内补齐同名路径,并通过符号链接指向 /upload,使 SSH 和 SFTP 能进入上传目录。

4.5 创建设备挂载点

这里创建的是空文件,第 6 节的设备服务会绑定挂载实际设备。

install -o root -g root -m 0644 /dev/null /data/sftp/test/dev/null
install -o root -g root -m 0644 /dev/null /data/sftp/test/dev/zero
install -o root -g root -m 0644 /dev/null /data/sftp/test/dev/tty
install -o root -g root -m 0644 /dev/null /data/sftp/test/dev/random
install -o root -g root -m 0644 /dev/null /data/sftp/test/dev/urandom

不绑定挂载宿主机业务目录,也不把整个 /dev、/proc 或 /sys 暴露给客户。

5. 配置持久化 SELinux 标签

使用本机 SELinux 策略的标准文件类型。通过 semanage fcontext 保存路径规则,使用 restorecon 应用标签。系统程序、配置和设备子目录分别按宿主机 /usr、/etc 和 /dev 的默认策略标记;上传目录标记为用户家目录内容。

先查看本地自定义规则,确认示例路径尚未配置。下面的新增命令用于首次配置;规则已经存在时应核查其来源和内容,不要重复添加。

semanage fcontext -l -C
semanage fcontext -a -t var_t '/data'
semanage fcontext -a -t home_root_t '/data/sftp'
semanage fcontext -a -t user_home_dir_t '/data/sftp/test'
semanage fcontext -a -t user_home_t '/data/sftp/test/upload(/.*)?'
semanage fcontext -a -t var_t '/data/sftp/test/data(/.*)?'
semanage fcontext -a -t usr_t '/data/sftp/test/(bin|lib|lib64)'
semanage fcontext -a -e /usr /data/sftp/test/usr
semanage fcontext -a -e /etc /data/sftp/test/etc
semanage fcontext -a -e /dev /data/sftp/test/dev
restorecon -v /data /data/sftp
restorecon -RFv /data/sftp/test
ls -Zd /data /data/sftp /data/sftp/test /data/sftp/test/upload
ls -lZ /data/sftp/test/usr/bin/bash /data/sftp/test/usr/bin/ls /data/sftp/test/usr/lib64/ld-linux-x86-64.so.2

这些命令只针对准备给本服务使用的目录;不要把已有共享 /data 目录及其全部内容递归重标记。

允许 SSH chroot 会话读写标记为家目录内容的上传目录:

setsebool -P ssh_chroot_rw_homedirs on
getsebool ssh_chroot_rw_homedirs

此布尔开关是主机级策略,适用于相应的 SSH chroot 域;UNIX 属主和权限仍需同时满足。实施前记录原值,回滚时考虑其他账号是否使用该策略。不要关闭 SELinux,也不要直接将拒绝日志全部转为放行规则。

参考:SELinux SSH 策略源码、Red Hat 文件上下文管理说明。实际可用类型和开关以本机已安装的策略为准。

6. 配置设备挂载并设置开机生效

保留 SSH shell 时需要 /dev/null 等最小设备。使用独立服务维护这些绑定挂载,不需要把宿主机整个 /dev 暴露给用户。

cat > /etc/systemd/system/test-jail-devices.service <<'EOF'
[Unit]
Description=Minimal safe devices for the test SSH and SFTP jail
RequiresMountsFor=/data/sftp/test/dev
After=local-fs.target
Before=sshd.service
ConditionPathIsDirectory=/data/sftp/test/dev

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/mount -o bind,nosuid,noexec /dev/null /data/sftp/test/dev/null
ExecStart=/usr/bin/mount -o bind,nosuid,noexec /dev/zero /data/sftp/test/dev/zero
ExecStart=/usr/bin/mount -o bind,nosuid,noexec /dev/tty /data/sftp/test/dev/tty
ExecStart=/usr/bin/mount -o bind,nosuid,noexec /dev/random /data/sftp/test/dev/random
ExecStart=/usr/bin/mount -o bind,nosuid,noexec /dev/urandom /data/sftp/test/dev/urandom
ExecStop=-/usr/bin/umount /data/sftp/test/dev/urandom
ExecStop=-/usr/bin/umount /data/sftp/test/dev/random
ExecStop=-/usr/bin/umount /data/sftp/test/dev/tty
ExecStop=-/usr/bin/umount /data/sftp/test/dev/zero
ExecStop=-/usr/bin/umount /data/sftp/test/dev/null

[Install]
WantedBy=multi-user.target
EOF

restorecon /etc/systemd/system/test-jail-devices.service
systemctl daemon-reload
systemctl enable --now test-jail-devices.service
systemctl is-active test-jail-devices.service
systemctl is-enabled test-jail-devices.service
findmnt -rn -o TARGET,SOURCE,OPTIONS | grep -F /data/sftp/test/dev/

Type=oneshot 配合 RemainAfterExit=yes,使挂载命令结束后服务仍保持 active,停止服务时执行卸载。systemd 官方说明

7. 配置 SSH 用户隔离规则

使用下面的命令编辑主配置文件,确认全局区域有且仅有一条启用的 SFTP 子系统声明,放在所有 Match 块之前。发行版默认已经存在的声明可以直接保留,无需重复追加。

vi /etc/ssh/sshd_config

全局区域采用以下内容;这里是文件配置行,不是终端命令:

Subsystem sftp /usr/libexec/openssh/sftp-server

该程序及其依赖已经在第 4 节复制到隔离环境中。

下列 Match User 块追加到主配置文件末尾。不要把全局 Subsystem 等指令追加到已有 Match 块内部。

install -d -o root -g root -m 0755 /etc/ssh/authorized_keys
install -o root -g root -m 0600 /dev/null /etc/ssh/authorized_keys/test
restorecon /etc/ssh/authorized_keys/test

cat >> /etc/ssh/sshd_config <<'EOF'

# Isolate test in its own SSH and SFTP directory.
Match User test
ChrootDirectory /data/sftp/test
ForceCommand none
DisableForwarding yes
PermitTTY yes
PermitUserRC no
AuthorizedKeysFile /etc/ssh/authorized_keys/test
PubkeyAuthentication yes
PasswordAuthentication yes
KbdInteractiveAuthentication no
AuthenticationMethods any
EOF

/usr/sbin/sshd -t
/usr/sbin/sshd -T -C "user=test,host=localhost,addr=127.0.0.1" | grep -E '^(chrootdirectory|forcecommand|disableforwarding|permittty|permituserrc|authorizedkeysfile|passwordauthentication|pubkeyauthentication|authenticationmethods) '

关键配置含义:

配置作用
ChrootDirectory把该用户的文件系统根目录限制在独立目录内
ForceCommand none保留正常 shell 和 SFTP,shell 依赖 jail 内程序和库
DisableForwarding yes禁止 OpenSSH 提供的转发功能
PermitTTY yes允许交互终端
PermitUserRC no禁止执行用户自定义的 SSH rc 文件
独立 AuthorizedKeysFile公钥由 root 管理,初始为空,不沿用其他用户的登录密钥
AuthenticationMethods any允许已启用的任一种认证方式,不要求公钥与密码同时通过

DisableForwarding 不会单独构成 shell 进程的网络隔离。如需限制用户进程的网络访问,需要另外设计并授权相应策略。OpenSSH 官方说明

8. 设置独立密码并重载

在密码管理器中生成独立的 16 位随机密码,包含大小写字母、数字和符号,通过交互提示输入。不要把密码直接放进命令行参数、聊天、日志或本手册。

passwd test
passwd -S test

# 语法验证成功后才重载,不重启 sshd 或服务器。
/usr/sbin/sshd -t
systemctl enable --now sshd
systemctl reload sshd
systemctl is-active sshd

passwd 不自动限定密码恰好为 16 位;长度由生成密码时控制。passwd -S 只查看状态,不显示完整密码。

9. 从公网验证上传、下载和隔离

在另一台客户端执行,密码在交互提示中输入。首次连接时,用管理员通过可信内网取得的主机指纹核对公网入口,确认后再接受主机密钥。

# 客户端命令,示例用户名仍为 test。
sftp -P 22 test@xxx.com

进入 SFTP 后,先查看目录,再用自己准备的、文件名唯一的小文件测试:

pwd
ls /
cd /upload
put test-sftp-check-20261104.txt
get test-sftp-check-20261104.txt test-sftp-check-20261104.download.txt
ls /root
ls /etc/shadow
rm test-sftp-check-20261104.txt
bye

预期结果:当前目录为 /upload,上传和下载成功;下载文件与原文件内容或 SHA-256 一致;受限路径均不存在。只删除自己刚上传的测试文件,不删除客户文件。

如需测试 SSH shell:

ssh -p 22 test@xxx.com

登录后执行:

id
pwd
ls -ld /root
ls -l /etc/shadow

后两条命令均应提示路径不存在;根据输出人工确认隔离结果。

在宿主机管理员会话复核:

id test
namei -l /data/sftp/test/upload
stat -c '%A %U:%G %n' /data/sftp/test /data/sftp/test/upload
systemctl is-active sshd test-jail-devices.service
systemctl is-enabled test-jail-devices.service
/usr/sbin/sshd -t

根目录预期为 root:root 0755,上传目录为 test:sftpusers 0750。相同 sftpusers 组的其他本机进程具备该目录的组读取/进入权限;不同客户间的远程会话由各自的 chroot 隔离。若要求本机非特权账号之间也严格隔离,应另行评估使用独立组或 0700,本例采用的是共享附加组模式。

10. 运维程序如何取文件

运行位置读取方式
SFTP 宿主机读取 /data/sftp/test/upload,程序账号需有对应权限
其他服务器经 SFTP 读取 xxx.com:22 的 /upload
Docker 容器按需将宿主机目录绑定挂载到容器,读取用途可设置只读

容器挂载示例片段:

volumes:
- /data/sftp/test/upload:/incoming/test:ro

该挂载需要在实际采集服务的配置中单独设置。容器进程的 UID/GID 权限和 SELinux 策略也必须匹配;不要为了容器读取而直接把客户目录改为 777,或随意重标记整个目录。

采集程序应与客户约定上传完成的标志,例如先传临时文件,完成后改为正式文件名,避免读到尚未上传完的内容。是否移动、删除或归档文件应由采集流程另行约定。

11. 常见问题排查

journalctl -u sshd --since '-15 min' --no-pager
journalctl -u test-jail-devices.service --since '-15 min' --no-pager
namei -l /data/sftp/test/upload
ls -lZ /data/sftp/test /data/sftp/test/upload /data/sftp/test/usr/bin/bash
findmnt -rn -o TARGET,SOURCE,OPTIONS | grep -F /data/sftp/test/dev/

# 安装了 audit 工具时,查看近期 SELinux 拒绝记录。
ausearch -m AVC,USER_AVC -ts recent -i
现象检查方向
bad ownership or modes for chroot directorychroot 根及其上级路径必须由 root 拥有,不能允许组/其他用户写入
密码通过后立即断开或提示 shell 不存在jail 内 bash、动态链接器、依赖库、目录权限和 SELinux 拒绝记录
SFTP subsystem 启动失败全局 Subsystem 配置,以及 jail 内 sftp-server 和依赖库
无法进入主目录jail 内 /data/sftp/test/upload -> /upload 是否正确,宿主机 upload 是否存在
可以登录但上传失败upload 的 UID/GID、0750 权限、磁盘容量和 SELinux 标签
重启后异常设备服务是否 enabled,设备是否挂载
公网连接失败示例端口为 22,实际使用发布的公网映射端口;检查 DNS、防火墙和 NAT 映射

12. 失败回滚

下面的操作会删除账号和新增环境,只有确认回滚已获授权、客户尚未开始使用且目录内没有需要保留的数据时才执行。先结束该用户会话,备份客户数据。软件包和共享组可能被其他服务使用,不随本例自动卸载或删除。不要把完整 SSH 备份直接覆盖到发生过其他维护变更的配置上。

先查看备份与当前配置的差异。只有差异完全属于本次新增账号配置时,才继续恢复整份文件;有其他维护变更时,手工仅移除本用户的 Match 块。

ls -l /etc/ssh/sshd_config.before-test-20261104-153002
diff -u /etc/ssh/sshd_config.before-test-20261104-153002 /etc/ssh/sshd_config

确认可以恢复后,逐条执行;sshd -t 无报错后才执行重载。

cp -a /etc/ssh/sshd_config.before-test-20261104-153002 /etc/ssh/sshd_config
/usr/sbin/sshd -t
systemctl reload sshd
systemctl disable --now test-jail-devices.service
findmnt -R /data/sftp/test
findmnt -rn -o TARGET

检查挂载列表,确认 /data/sftp/test 及其全部子路径已经没有挂载。存在残留挂载时停止删除,先查清并卸载。确认无挂载后,再删除新增服务、公钥文件和账号。

rm /etc/systemd/system/test-jail-devices.service
systemctl daemon-reload
rm /etc/ssh/authorized_keys/test
userdel test
getent group test

userdel 可能已经自动删除同名主组。上面的查询仍返回 test 组时,才手工执行下面一条命令;查询无记录时跳过此命令。

groupdel test

最后人工核对绝对路径、目录内容及是否存在符号链接,确认要删除的确实是本次新建的 /data/sftp/test,并且需要保留的客户文件已经另行备份。先保留目录完成标签规则核对,再删除目录。

realpath -e /data/sftp/test
ls -ld /data/sftp/test
ls -la /data/sftp/test/upload

删除该用户专用的 SELinux 路径规则。只删除本手册新增且仍由该用户独占的规则;/data、/data/sftp 及主机级布尔开关属于共享设置,按实施前记录单独评估恢复,不直接套用本段删除。

semanage fcontext -d -e /usr /data/sftp/test/usr
semanage fcontext -d -e /etc /data/sftp/test/etc
semanage fcontext -d -e /dev /data/sftp/test/dev
semanage fcontext -d '/data/sftp/test/(bin|lib|lib64)'
semanage fcontext -d '/data/sftp/test/data(/.*)?'
semanage fcontext -d '/data/sftp/test/upload(/.*)?'
semanage fcontext -d '/data/sftp/test'

核对无误后,才执行删除;不使用 userdel -r 自动处理主目录。

rm -rf --one-file-system /data/sftp/test

如果 SSH 配置已经有其他后续修改,应手工只移除该用户对应的完整 Match 块,再验证、重载;不要恢复旧文件覆盖他人的修改。

13. SFTP命令测试

连接命令(-P 大写):

sftp -P 22 test@xxx.com

登录后,在 sftp> 提示符下执行:

用途命令示例
查看远程当前目录pwd
查看远程文件ls -lh
查看远程隐藏文件ls -la
切换远程目录cd /upload
查看本地当前目录lpwd
切换本地目录lcd D:/download
上传一个文件put report.csv
上传并改名put report.csv /upload/report-new.csv
上传多个 CSV 文件put *.csv
上传整个目录put -R reports
下载一个文件get report.csv
下载并指定本地文件名get report.csv report-local.csv
下载多个 CSV 文件get *.csv
下载整个目录get -R reports
断点续传上传reput report.csv
断点续传下载reget report.csv
新建远程目录mkdir reports
重命名或移动远程文件rename report.csv reports/report.csv
删除远程文件rm report.csv
删除远程空目录rmdir reports
查看帮助help
退出bye

put 从本地上传,get 下载到本地;未指定路径时,分别使用当前本地和远程目录。路径有空格时加双引号,续传时要确保源文件没有变化。OpenSSH 命令说明

滚动至顶部