Quero executar o seguinte comando em uma conexão ssh:
tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
Este comando está funcionando na minha máquina de destino.
Agora quero usar este comando em uma máquina diferente e executá-lo via ssh, então o que fiz foi o seguinte:
ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
O resultado é
cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
O que há de errado com minha ligação?
Responder1
Pode ser mais fácil simplificar o comando para que você tenha menos caracteres especiais com os quais o shell possa engasgar:
ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'
O final 2>/dev/null
descarta o texto do erro caso o arquivo PID não possa ser encontrado ou contenha um PID obsoleto.
Responder2
Eu recomendaria colocar esses comandos em um script com o qual você pode chamar remotamente ssh
. Caso contrário, você precisará colocar toda a parte "remota" da linha de comando entre aspas e escapar adequadamente de tudo dentro dela. Isso pode ser tedioso e sujeito a erros. É por isso que a chamada remota de script.
Responder3
O segundo comando como você executa a parte do código ( $()
) no subshell local. Você precisa fazê-lo rodar do outro lado escapando de caracteres especiais (basicamente $
):
ssh jboss@myTargetServer tmpValue=\$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk '{print $9}'
ou coloque tudo nos apóstrofos '
e fuja dos internos:
ssh jboss@myTargetServer 'tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk \'{print $9}\''
Não testei, mas é a ideia básica do que deve ser feito para consertar.
Responder4
Se você estiver realmente relutante em escrever roteiros, poderá descobrir
Aqui documentoútil. Em resumo, você adiciona << SOMETEXMARKER
ao final da linha e continua digitando quantos comandos desejar para o host remoto. Então, na última linha você insere (bem no início da linha) o mesmo SOMETEXTMARKER
e isso faz com que os comandos inseridos sejam executados remotamente
Aqui está uma amostra
[bobby@bobby ~]$ ssh jimmy@jimmy << MRK '
> # single quote above makes all vars resolve on remote host
> echo remote user and host are :
> echo $USER $(hostname)
> # entereing closing single quote
> '
> # finally entereing the marker
> MRK
remote user and host are :
jimmy jimmy