我想要通过本地程序访问 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 并记录您的所有操作,而无需重定向输出或任何内容。完成后,只需exit
shell。如果删除的 SSH 服务器没有script
,您可以从 OS X 运行它,但 SSH 输出将再次乱码。