适用环境: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 directory | chroot 根及其上级路径必须由 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 命令说明