SFTP 与文件传输
XOps 提供交互式 SFTP 终端(xops sftp)和命令行文件分发工具(xops scp)。
快速上手
1. 使用 SCP 上传、下载与批量分发
bash
# 上传文件或目录到远端用户家目录
xops scp ./test.tar 'web-01:~/tmp/'
# 从远端下载到本地
xops scp 'web-01:~/tmp/test.tar' ../
# 在两台远端主机之间直接中转文件(经由本机转发)
xops scp 'web-01:~/config.conf' 'web-02:~/config.conf'
# 用 --host 上传到单台或多台主机
xops scp --host web-01 ./config.conf ./
xops scp --host web-01,web-02 ./config.conf /etc/app/
# 按标签批量分发到多台服务器(含 ~ 的远端路径请加引号,避免被本地 Shell 展开)
xops scp --tag web ./config.conf '~/tmp/'基本格式为 xops scp [选项] <源路径> <目标路径>,源路径和目标路径都必须提供:
- 单机与跨机传输:不带
--host、--tag、-I/--ifile时,源和目标都支持[[user@]host:]file写法(冒号前可填节点名、别名或主机地址)。本地到远端为上传,远端到本地为下载,两端都是远端时经由本机中转(不支持两端都是本地路径)。 - 指定端口与特殊路径:
- 与系统
scp一致,用-P 122(或--port 122)指定 SSH 端口,不再使用小写-p。 - 地址冒号后面的内容全部作为文件路径,不支持
host:端口:文件写法——例如user@host:22:file表示远端文件名为22:file。IPv6 地址请加方括号,如user@[::1]:file。 - 不传
-P时自动使用匹配节点的配置端口;如果同一主机匹配到多个端口会提示歧义,请用-P或唯一别名区分。若两端远端主机端口不同,可分别为它们设置别名。 - Windows 远端路径支持
vm:C:/Users/example/file.txt;如果本地文件名本身包含冒号,请加上./前缀(如./22:file)。
- 与系统
- 批量或指定主机上传(
--host/--tag/-I):传入--host、--tag或-I/--ifile时,固定从本地上传到选中主机(三个选项互斥,可配合--exclude排除部分主机)。此时两个路径都按纯路径处理,路径里的:、@、[等均视为普通文件名字符,不再解析为远程地址。 --src与--dest兼容写法:可以用--src <源> --dest <目标>代替两个位置参数,但两者必须成对出现,且不能与位置路径混用。- 提权传输(
--sudo):- 传入
--sudo启用提权传输,在上传、下载以及跨主机中转中均生效(经由本机中转时两端均使用提权会话)。 - 底层机制:通过提权通道在远端启动
sftp-server二进制,建立 root 权限的 SFTPv3 流;若远端登录用户本身为 root 则直接请求标准 SFTP subsystem。 - 示例:
xops scp --sudo ./app.service web-01:/etc/systemd/system/、xops scp --sudo 'web-01:/etc/shadow' ./、xops scp --sudo web-01:/root/data.tar web-02:/root/data.tar。
- 传入
bash
# 连接 122 端口,上传为远端文件 22:file
xops scp -P 122 ./config.conf user@host:22:file
# 使用 --host 时,路径中的 @ 和 : 均作为普通文件名字符处理
xops scp --host web-01 ./config.conf 'user@name:backup'
# 使用 --src 和 --dest 兼容选项
xops scp --src ./config.conf --dest web-01:~/config.conf
xops scp --tag web --src ./config.conf --dest /etc/app/- 进度条与连接诊断:
- 在终端运行时默认显示传输进度条(输出到
stderr),管道或重定向时自动隐藏。 -q/--quiet:隐藏进度条、SSH 告警与诊断输出(失败报错和安全确认提示仍会保留)。-v/--verbose:输出 SSH/SFTP 连接与传输诊断(与项目级--debug日志独立):-v:查看连接、认证和传输过程。-vv:查看更多文件操作详情。-vvv:输出最详细的故障排查日志。
-q与-v组合时按出现顺序生效(同 OpenSSH):-qv隐藏进度条但输出 SSH/SFTP 诊断;-vq隐藏进度条和 SSH 诊断,仅保留 SCP 传输状态与 SFTP 初始化诊断。- 若当前输出环境不支持进度或诊断,会省略这些辅助信息,文件传输仍会继续。需要保存诊断时,可在命令末尾加上
2>scp.log。
- 在终端运行时默认显示传输进度条(输出到
bash
# 静默传输(不显示进度条)
xops scp -q ./file web-01:~/file
# 隐藏进度条,查看 SSH/SFTP 诊断信息
xops scp -qv ./file web-01:~/file
# 查看更详细的故障排查日志
xops scp -qvv ./file web-01:~/file- 远端
~路径:远端路径支持~和~/...,相对于远端 SFTP 登录目录(通常是用户家目录)解析;不支持~其他用户,跨目录请使用绝对路径。 - 同名文件覆盖:遇到同名文件时,交互式回答
y或传入-f/--force会直接覆盖(即使文件大小和修改时间相同);传入-n/--no-clobber则自动跳过。 - 本地下载保护:覆盖下载失败时会尝试恢复原文件;若提示需要手动恢复,请按错误信息中给出的备份路径处理。同名目录不会被普通文件覆盖。
2. 使用交互式 SFTP Shell
bash
xops sftp web-01进入 SFTP 提示符后可输入 help 查看全部命令。常用操作:
text
pwd
ls
cd /var/tmp
put ./report.txt
get report.txt
exec date
exitexec <命令>:在当前远端目录执行命令(交互模式下分配 PTY 以支持终端程序),结束后返回 SFTP 提示符。若连接时使用了--sudo,则命令默认继承提权执行。shell/lshell:进入远端或本地交互式 Shell(若连接时使用了--sudo,远端 Shell 同样继承提权);lexec:执行本地命令。退出子程序后恢复 SFTP 提示符。- 提权会话(
--sudo):- 连接时传入
--sudo启动提权 SFTP 会话:xops sftp --sudo web-01。 - 通过提权通道启动远端
sftp-server(root 登录直接请求 subsystem),使 SFTP 文件读写、查看等操作拥有 root 权限。 - 交互式
shell与内置exec命令默认同样继承--sudo提权执行。
- 连接时传入
- 连接中断或命令输出失败时,会话会结束并返回非零状态。需要继续操作时,请重新连接。
- 连接诊断:
-v/--verbose将 SSH/SFTP 诊断信息写入stderr(独立于--debug),采用与xops ssh -v相同的debug1/2/3:格式:-v:显示连接、主机密钥验证、认证、协商算法及 SFTP 初始化信息。-vv:增加 SFTP 扩展、路径请求及get/put文件操作。-vvv:再增加 SFTP 数据包类型、请求 ID、长度及状态码。不会输出文件内容和凭据。- 与
xops scp不同,xops sftp没有-q。Tab 补全或命令执行期间产生的诊断可能与正在编辑的输入行交错;需要保持提示符整洁时,可保存到文件,例如xops sftp -vv web-01 2>sftp.log。
交互输入与快捷键
SFTP 提示符支持行编辑、命令历史(默认保存在 ~/.xops_sftp_history)以及本地/远端路径补全:
| 按键 | 行为 |
|---|---|
Tab / Shift+Tab | 请求路径补全,并在多个候选中正向/反向循环切换(跨页自动翻页) |
PageUp / PageDown | 在补全候选面板中整页翻动(首尾页不循环) |
Enter / Esc(补全中) | Enter 确认候选并返回编辑(不直接执行命令);Esc 关闭候选面板 |
↑ / ↓、Ctrl+P / N | 浏览历史记录;回到最新位置时恢复当前输入草稿 |
Ctrl+R | 反向搜索历史;再次按下查找更早的匹配 |
Enter / Esc / Ctrl+G(搜索中) | Enter/Esc 接受匹配并返回编辑;Ctrl+G 取消搜索并恢复草稿 |
Home / End、Ctrl+A / E | 移动到行首 / 行尾 |
Ctrl+U / K / W | 删除光标前内容 / 光标后内容 / 前一个单词 |
Delete / Ctrl+D | Delete 删除光标后字符;Ctrl+D 在空行退出,非空行删除光标后字符 |
Ctrl+C | 取消当前输入;在覆盖/删除确认提示中停止本条命令的剩余文件处理(回答 n 仅跳过当前文件) |
编辑器与历史细节:
- 补全面板:唯一候选直接上屏;补全目录后可继续按
Tab补全子项。多候选面板按终端宽度分列,最多显示 6 行并附带页码与总数,选中项带>标记。后台补全最长等待 2 秒,继续打字或退出提示符会自动取消过期查询。 - 长行与粘贴:长命令水平滚动,提交后完整回显到终端滚动区;支持中文、组合字符、emoji 和跨提示符的括号粘贴(粘贴中的换行与制表符转为空格,不会自动执行命令)。即使
stdout被管道传给tee,只要stdin是终端,提示符和尺寸自适应依然正常工作。 - 历史记录:最多保留最近 500 条非空且非连续重复的交互命令,确认回答与批处理命令不记录。历史文件不可用时会提示,并暂时只保留本次会话历史;保存失败不会清空旧记录,恢复后会自动保存。
批处理模式
当标准输入来自管道或文件重定向(如 xops sftp web-01 < batch.txt)时,自动进入批处理模式:
- 任一命令失败立即停止并返回非零退出码,不再执行后续命令,也不写交互历史。
- 批处理中的
lls/lll和远端ls/ll遇到路径不存在或目录读取失败会立即失败;通配符匹配中任一路径列出失败也会停止剩余匹配和后续命令。 - 批处理
exec不申请 PTY,exec和lexec的标准输入直接为EOF(不会吞掉后续 SFTP 命令)。 shell/lshell需要交互终端,不能在批处理中使用;涉及覆盖或删除确认的操作必须显式配合 force/no-clobber 选项,否则直接报错。单行命令长度上限为 1 MiB。
exec 工作目录继承与自动探测
exec 在当前远端目录执行命令。先用 cd 切换目录,再运行 exec;若无法进入该目录,命令不会执行。
Windows 主机可使用 /C:/... 路径,例如:
text
cd /C:/Windows
exec dir使用 cd /C: 可进入 C 盘根目录。
未配置解释器时,XOps 会尝试自动识别远端环境。若提示不支持当前执行环境,请检查节点的 execution 设置,选择主机已安装的解释器,见主机与身份。已配置的 server 模式只有在启动方言为 cmd 时支持 SFTP 的当前目录;其他环境需指定解释器。识别失败时命令不会执行。