在慢速连接上使用 ssh 时,停止减慢快速和详细的操作

在慢速连接上使用 ssh 时,停止减慢快速和详细的操作

当我通过 VPN 和 SSH 通过 DSL 连接时,我经常在通过 1GBit 以太网连接的 2 台服务器之间复制许多文件。问题是,需要通过慢速连接将详细输出(每个复制文件 1 行)发送到我的 ssh 客户端,这会减慢复制操作的速度(我感觉是这样)

我使用通过创建的测试文件对此进行了测试

dd if=/dev/urandom | base64 | dd of=testfile count=10M bs=1

测试运行 A(无输出)

# time sh -c 'cat testfile > /dev/null'
sh -c 'cat testfile > /dev/null'  0.00s user 0.02s system 97% cpu 0.025 total

测试运行 B(所有输出均通过 ssh/vpn)

# time sh -c 'cat testfile'
sh -c 'cat testfile'  0.00s user 0.45s system 0% cpu 4:31.10 total

(我知道,这不是一个好的测试,但它表明了问题)

有没有办法不减慢操作速度并异步获取输出。我设想过删除除每秒指定计数以外的所有行或类似的东西。

此刻我启动屏幕并在操作运行时分离。

我在 Windows 上使用 putty,在 Linux 上使用 openssh-client

有任何想法吗?

答案1

你没有说你用什么来复制,但我想这并不重要。

您可以尝试使用pv

your-copy-command 2>&1 | tee progress.out | pv -trlb >/dev/null

这为您提供了一个低开销的进度指示器:

502 0:00:20 [25.1/s ]

显示行数文件名(不是文件内容),否则您将会看到这些内容。该tee命令会将此输出保存在远程系统上,以防您需要查看它。然后输出将被丢弃。

这是一种无需pv

your-copy-command 2>&1 | tee progress.out | progress >/dev/null

哪里progress有这样的脚本:

#!/bin/bash
SECONDS=0    # auto update variable
while read -r line
do
    if ((count++ % 10 == 9))
    then
        printf "%s sec, %s lines\r" $SECONDS $count >&2
    fi
    echo "$line"
done

答案2

如果将输出导入 less 会发生什么情况?如 cp ab | less

答案3

如果我理解正确的话,这听起来就像是你因为终端缓冲而变慢了!

您是否需要查看传输的输出?如果不需要,请使用-q或适当的选项来抑制每个文件的传输输出。如果您需要该数据,请将输出重定向到文件以供以后查看。然后您就可以查看tail -f该文件了。

相关内容