Captura de saída remota localmente no Mac Terminal

6

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 estava perfeito, mas é claro que estava no servidor remoto, e um sftp para cada saída de comando parecia um pouco ... pesado.

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

Por último, 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 pressiono backspace, há um ^ H no arquivo. Há também um texto como "[0m [K", do qual é mais difícil se livrar.

Como obtenho essa saída ssh de maneira limpa localmente?

Sean DeNigris
fonte

Respostas:

3

Use scriptpara criar um texto datilografado da sessão do terminal.

Em seguida, use sedpara higienizar.

Por exemplo;

% 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

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

Isso poderia ser aprimorado para excluir o caractere antes de a ^H, etc. , mas você especificou que não queria isso.

Johnsyweb
fonte
Modifiquei o seu regex ANSI Escape para começar com um não imprimível, porque ele também estava removendo outras coisas. Acho que se você aplicar a alteração, temos uma solução: s / [^ [: print:]] [[[: digit:]] * (; [[: digit:]] *) * [[: alpha:]] // g;
Sean DeNigris
Eu acho que a expressão regular provavelmente é um pouco solta, mas se funciona para você, funciona para você!
precisa saber é o seguinte
Sim, eu estava pensando a mesma coisa, mas eu vou usá-lo até dói :)
Sean DeNigris
11
Além disso, não sei mais o que fazer, porque ele não funciona sem ele, e o mac's sed não parece permitir que você especifique ASCII específico no regex. Eu realmente preciso especificar 027 (ESC), mas não parece possível
Sean DeNigris
11
@ Sean DeNigris: Hmmm ... BSD sedparece lutar com isso. Eu atualizei meu comando para você.
Johnsyweb
1

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

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

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

[~] # 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@

isso resulta na seguinte saída:

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

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

script output.txt

que abrirá um novo shell e registrará todas as suas ações sem a necessidade de redirecionar a saída ou algo assim. Quando terminar, apenas exita concha. Se o servidor SSH de remoção não tiver script, você pode executá-lo no OS X, mas a saída do SSH será distorcida novamente.

slhck
fonte
Eu acho que isso só parece estar ajudando porque é visualizado no terminal, que os exibe corretamente. Se eu redirecionar sua solução para um arquivo, ela conterá a mesma bagunça.
Sean DeNigris
Eu sei, é por isso que eu disse que não estava funcionando perfeitamente :)
slhck