Forçando comando em authorized_keys do ssh mescla STDOUT e STDERR

3

Eu tenho trabalhado para ter um script em um servidor centralizado para fazer algumas coisas e gerar um arquivo .tar.gz (consulte redireciona temporariamente STDOUT para outro descritor de arquivo, mas ainda para a tela ). Eu também troquei chaves ssh, então agora de uma máquina cliente eu posso executar o script no meu servidor principal e enviar o resultado para um arquivo .tar.gz no cliente enquanto visualizo todas as outras saídas (STDERR) do script:

me@client:~$ ssh auto@remoteserver /usr/local/bin/myscript.sh > content.tar.gz
// shows the output of the STDERR here...

me@client:~$ tar ztf content.tar.gz
content/file.txt
content/foobar.txt
...

Mas se eu forçar a execução desse comando, coloque a opção de comando em ~/.ssh/authorized_keys :

#/home/auto/.ssh/authorized_keys file
command="/usr/local/bin/myscript.sh",from="client" ssh-rsa 0UYmshd5FSDFf2fd...

e execute o seguinte, não funciona:

me@client:~$ ssh auto@remoteserver > content.tar.gz
// shows **NOTHING**

me@client:~$ tar ztf content.tar.gz
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

se eu examinar o arquivo, ele contém o STDERR e o STDOUT . Alguma idéia de por que está se misturando? E mais importante, alguma ideia de como evitar isso?

ps : devo mencionar que myscript.sh é um wrapper para o script principal, que basicamente chama o script principal com um conjunto de parâmetros fixos:

#!/bin/sh
# myscript.sh: wrapper for mainscript.sh to use by the user auto with ssh-keys
/usr/local/bin/mainscript.sh foo bar
    
por Carlos Campderrós 16.04.2012 / 17:14

1 resposta

2

A primeira maneira de invocar o comando não cria um arquivo, enquanto o segundo pode ou não. Tente dizer ao sshd para não criar um arquivo. Em seu arquivo authorized_keys:
command="/usr/local/bin/myscript.sh",from="client",no-pty ssh-rsa...

Se você quiser ssh na linha de comando quando a opção no-pty estiver definida em seus arquivos authorized_keys , você deverá redirecionar o STDIN para ler /dev/null ou receber um erro informando PTY allocation request failed on channel 0 :

$ ssh auto@remoteserver < /dev/null > content.tar.gz

Se, em vez disso, você executar o comando ssh sem um terminal de controle, não há STDIN disponível e você pode omitir a parte < /dev/null . Então no cron você pode fazer o seguinte sem problema:

0 4 * * * ssh auto@remoteserver > content.tar.gz
    
por 16.04.2012 / 19:58