Execute um script remoto em um arquivo local via SSH

Execute um script remoto em um arquivo local via SSH

Eu tenho uma máquina remota com um binário Linux que aceita vários argumentos e um arquivo de texto. A saída de um programa é gravada em stdout e sempre gravo em um arquivo de texto. Acabei copiando um arquivo de dados para a máquina remota, executando o comando naquele arquivo e copiando o arquivo resultante de volta. Isso é demorado e sujeito a erros.

É possível com o SSH e as ferramentas padrão do Linux executar um binário remoto via SSH em um arquivo local sem copiá-lo primeiro para a máquina remota?

Idealmente, eu gostaria de ter um script bash na minha máquina local. Eu especifico o arquivo de dados como um argumento e ele executa toda a conexão SSH, envio de dados, etc. e gera o resultado no stdout localmente.

Minha máquina local é Mac OS X e a remota é Linux. Não, não consigo fazer o binário do Linux funcionar no Mac OS X.

Atualização: a ferramenta na máquina remotapodeleia de stdin.

Responder1

Se a ferramenta puder ler stdinem vez deum arquivo de texto e fornece sua saída via stdout, esta bashsintaxe deve executá-lo remotamente sem a necessidade de copiar nenhum arquivo:

< "/local_path/to/input_file" ssh user@remote 'the_tool -some_option1 -option2'

Nota: alguns comandos precisam de opção ou argumento especial (por exemplo -) para ler stdin; alguns leem stdin enquanto não há nenhum arquivo de entrada especificado. Não sei nada sobre sua ferramenta, então esta é uma abordagem genérica que talvez você precise ajustar.

O redirecionamento da saída para um arquivo local com >ou (local) teetambém funcionará:

< "/local_path/to/input_file" ssh user@remote 'the_tool -some_option1 -option2' | tee "/local_path/to/output_file"

Exemplo: remoto catconcatena local e remoto /etc/hosts:

< "/etc/hosts" ssh user@remote 'cat - /etc/hosts'

informação relacionada