Capturando a saída remota localmente no Mac Terminal

5

Eu quero acesso programático local à saída ssh no Mac Terminal.

Primeiro, tentei redirecionar a saída de cada comando para um arquivo. O arquivo era perfeito, mas é claro que estava no servidor remoto, e um sftp para cada saída de comando parecia um pouco ... pesado.

Em seguida, tentei o Applescript Terminal, mas ele só dá acesso ao texto atualmente visível em uma guia (ou seja, se metade da saída já foi rolada para fora da vista, ela não será retornada - inútil).

Por fim, tentei canalizar o ssh para o tee (por exemplo, ssh user @ host | tee output.txt). Isso quase funcionou. Eu tenho a saída em um arquivo local, mas há muitos caracteres indesejados misturados. Por exemplo, toda vez que eu clico em backspace, há um ^ H no arquivo. Há também textos como "[0m [K", que é mais difícil de eliminar.

Como faço para obter essa saída ssh de forma limpa localmente?

    
por Sean DeNigris 02.06.2011 / 20:06

2 respostas

3

Use script para fazer um texto datilografado da sessão de terminal.

Em seguida, use sed para sanitizá-lo.

Por exemplo:

% script mysession

% ssh user@host

[some stuff]

% exit
Script done, output file is mysession

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

Agora você deve conseguir ler mysession.txt sem os códigos de escape ANSI e outros caracteres não imprimíveis.

Isso poderia ser melhorado para excluir o caractere antes de um ^ H , e cetera , mas você especificou que não queria isso.

    
por 02.06.2011 / 22:53
1

Uma solução muito básica para limpar a saída seria a seguinte:

sed 's/[
[~] # 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@
0-7]^M/ /g' output.txt

Eu não sei como recuperar isso em um arquivo. Por exemplo, dado o arquivo

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

isso resulta na seguinte saída:

script output.txt

Você também pode registrar uma sessão com script . Então, sempre que você entrar na sessão SSH, primeiro digite

sed 's/[
[~] # 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@
0-7]^M/ /g' output.txt

que então abrirá um novo shell e registrará todas as suas ações sem precisar redirecionar a saída ou qualquer coisa. Quando terminar, apenas exit do shell. Se o servidor SSH remover não tiver script , você poderá executá-lo a partir do OS X, mas a saída SSH será distorcida novamente.

    
por 02.06.2011 / 21:26