Eu quero executar o seguinte comando shell em uma máquina remota :
/bin/retail -f -u 'INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]' /opt/tomcat/logs/catalina.out
Este comando usa um binário chamado retail
, que basicamente é um normal Linux tail
com algum açúcar extra. Para obter mais informações, consulte o este repositório do github.
Quando eu insiro o comando acima dentro de um shell na máquina remota , ele faz o que eu quero, então o comando como está escrito está correto do ponto de vista funcional. Faz o que eu quero.
O problema é que eu quero executar esse comando dentro de um script no meu laptop e acionar a máquina remota.
Isso é o que tentei , mas todos os comandos não imprimem a saída desejada, em vez disso, eles imprimem nenhuma linha de log :
ssh [email protected] /bin/retail -f -u "INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]" /opt/tomcat/logs/catalina.out
Então tentei escapar [
e ]
ou usar '
em vez de "
e provavelmente todas as combinações, mas tudo não funcionou .
A saída desejada é: Comporte-se como um% normaltail
e, em seguida, saia se a nova linha corresponder à especificada na cadeia. Novamente, quando eu o executo na máquina remota, ele funciona como descrito.
Eu estava me perguntando: Talvez retail
não funcione no ssh? Eu tentei o Unix% normaltail
e funciona em ssh. O Autor de retail
diz que seu compatível com POSIX e um deles pode substituir seu sistema tail
por ele. Então, eu acho que também é não é um problema do próprio binário.
Portanto, o problema realmente é: Como posso formatar o argumento do comando ssh
, para que ele receba o comando corretamente?
Resposta ao comentário de Jaken551 :
Se você quer dizer:
ssh [email protected] '/bin/retail -f -u "INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]" /opt/tomcat/logs/catalina.out'
Então, sim, já tentei isso. Também imprime sem log line e não retorna ao prompt de entrada.
Resposta à resposta de Gerard H. Pille :
Infelizmente, o mesmo comportamento . Não imprime log e não retorna ao prompt de entrada. Para completar, eu tentei isso:
ssh [email protected] /bin/retail -f -u \'INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\\"ajp-nio-8009\\"\]\' /opt/tomcat/logs/catalina.out
Resposta à resposta de Patrick :
Infelizmente, também é negativo. Para completar, tentei as duas soluções sugeridas. Aqui o primeiro :
CMD="$(printf "%q " /bin/retail -f -u 'INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]' /opt/tomcat/logs/catalina.out)"
ssh [email protected] "$CMD"
Resultado: Não imprime log e não retorna ao prompt de entrada.
E o segundo :
ssh -T [email protected] <<'EOF'
/bin/retail -f -u 'INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]' /opt/tomcat/logs/catalina.out
EOF
Resultado: Gera um pseudo-terminal, mas não o log e não retorna ao prompt de entrada :
Pseudo-terminal will not be allocated because stdin is not a terminal.
Linux my-remote-server 4.1.15-1-lts #1 SMP Tue Dec 15 20:54:13 CET 2015 x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Como eu tentei algumas soluções agora, eu deveria tentar invocar um sh-script , que contém o comando retail
como Gerard H Pille sugerido. Eu ainda gostaria de ter nice one-liner quando possível (sem escrever um script que contenha a linha).
Resposta à resposta Archemar :
Eu peguei o comando original, que eu especifiquei e adicionei um -t
a ele, resultando no seguinte:
ssh -t [email protected] /bin/retail -f -u "INFORMATION \[main\] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler \[\"ajp-nio-8009\"\]" /opt/tomcat/logs/catalina.out
e funcionou . Archemar você deve escrever seu comentário como uma resposta para que eu possa marcá-lo.