Macターミナルのssh出力にローカルプログラムでアクセスしたい。
まず、各コマンドの出力をファイルにリダイレクトしてみました。ファイルは完璧でしたが、もちろんリモートサーバー上にあり、各コマンド出力のsftpは少し...重いように見えました。
次に、Applescript Terminalを試しましたが、タブに現在表示されているテキストにしかアクセスできません(つまり、出力の半分がすでにスクロールして見えなくなっている場合、返されません-役に立たない)。
最後に、sshをteeにパイプしてみました(例:ssh user @ Host | tee output.txt)。これはほとんど機能しました。ローカルファイルに出力がありますが、不要な文字がたくさん混ざっています。たとえば、バックスペースを押すたびに、ファイルに^ Hがあります。 「[0m [K」のように取り除くのが難しいテキストもあります。
このssh出力をローカルできれいに取得するにはどうすればよいですか?
script
を使用して、ターミナルセッションのTypeScriptを作成します。
次に、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
これで、 ANSIエスケープコード およびその他の印刷できない文字なしでmysession.txt
を読み取ることができるはずです。
これは、前の文字を削除するように拡張できます。 ^H、et cetera、しかしあなたはそれを望まないと指定しました。
出力をクリーンアップするための非常に基本的な解決策は次のとおりです。
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
これにより、新しいシェルが開き、出力などをリダイレクトすることなく、すべてのアクションがログに記録されます。終了したら、シェルをexit
するだけです。削除SSHサーバーにscript
がない場合は、OS Xから実行できますが、SSH出力が再び文字化けします。