在 Mac 终端本地捕获远程输出

在 Mac 终端本地捕获远程输出

我想要通过本地程序访问 Mac 终端中的 ssh 输出。

首先,我尝试将每个命令的输出重定向到一个文件。文件是完美的,但它当然在远程服务器上,每个命令输出的 sftp 似乎有点……繁重。

接下来,我尝试使用 Applescript Terminal,但它只允许访问选项卡中当前可见的文本(即,如果一半的输出已经滚动出视线,则不会返回 - 毫无用处)。

最后,我尝试将 ssh 传输到 tee(例如 ssh user@host | tee output.txt)。这几乎成功了。我将输出保存在本地文件中,但其中混入了很多不需要的字符。例如,每次我按退格键时,文件中都会出现 ^H。还有像“[0m[K]”这样的文本,很难删除。

我如何在本地干净地获取此 ssh 输出?

答案1

使用script制作终端会话的打字稿。

然后用sed它来消毒。

例如;

% script mysession

% ssh user@host

[some stuff]

% exit
Script done, output file is mysession

% sed -e '
s/'`echo "\033"`'\[[[:digit:]]*\(;[[:digit:]]*\)*[[:alpha:]]//g; # ANSI Escape sequences (perhaps over-generalised)
s/[^[:print:]]//g; # Non-printable
' mysession > mysession.txt

你现在应该可以mysession.txt不用ANSI 转义代码以及其他不可打印字符。

可以增强此功能以删除之前的字符^H等等,但您指定您不想要那样。

答案2

清理输出的一个非常基本的解决方案如下:

sed 's/[\000-\037]^M/ /g' output.txt

但是我不知道如何将其恢复到文件中。例如,给定文件

[~] # ls /
[1;34mbin[0m/         [1;36mhome[0m@        [1;34mlost+found[0m/  [1;36mphp.ini[0m@     [1;34msbin[0m/        [1;34msys[0m/         [1;34mvar[0m/
[1;34mdev[0m/         [1;34mlib[0m/         [1;34mmnt[0m/         [1;34mproc[0m/        [1;34mshare[0m/       [1;34mtmp[0m/
[1;34metc[0m/         [1;36mlinuxrc[0m@     [1;34mopt[0m/         [1;34mroot[0m/        [0;0mstunnel.pid[0m  [1;36musr[0m@

输出结果如下:

[~] # ls /
bin/         home@        lost+found/  php.ini@     sbin/        sys/         var/
dev/         lib/         mnt/         proc/        share/       tmp/
etc/         linuxrc@     opt/         root/        stunnel.pid  usr@

您还可以使用 记录会话script。因此,每当您进入 SSH 会话时,首先输入

script output.txt

然后它将打开一个新的 shell 并记录您的所有操作,而无需重定向输出或任何内容。完成后,只需exitshell。如果删除的 SSH 服务器没有script,您可以从 OS X 运行它,但 SSH 输出将再次乱码。

相关内容