You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在cloud-init执行过程中查看scp命令的传输进度?

问题原因

scp的进度提示默认仅在**运行环境分配了交互式TTY(终端)**时才会输出,且进度内容默认写入当前进程的控制终端/dev/tty,而非标准输出(stdout)或标准错误(stderr)。当输出目标为文件、管道等非TTY设备时,scp会自动禁用进度输出,避免破坏非交互式场景的输出格式。

cloud-init的执行环境属于非交互式后台任务,默认不会分配TTY,因此无论用管道还是进程替换写法,scp都会默认关闭进度提示,自然不会出现在日志中。手动测试时重定向到文件看不到进度也是同理。

解决方法

方法1:使用script模拟TTY环境(兼容所有scp版本)

用script命令伪造终端运行环境,强制scp输出进度,不会影响文件数据流的管道传输:

script -q -c 'scp myuser@123.45.6.789:path/to/file.tar.gz /dev/stdout' /dev/null | tar -zx

参数说明:

  • -q:开启静默模式,不输出script自身的启动/退出信息
  • -c:指定要执行的scp命令
  • 末尾的/dev/null:丢弃script默认生成的会话记录文件,所有输出会正常通过stdout/stderr传递给cloud-init的日志收集进程

方法2:使用scp强制显示进度参数(仅支持OpenSSH 8.0及以上版本)

新版本scp提供了--progress参数,可以跳过TTY检测强制输出进度:

scp --progress myuser@123.45.6.789:path/to/file.tar.gz /dev/stdout | tar -zx

两种方案执行后,scp的进度信息都会被写入cloud-init的输出日志,通过tail -f /var/log/cloud-init-output.log即可正常查看。

内容的提问来源于stack exchange,提问作者drmrbrewer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 18:06:04