execute o comando pela conexão ssh

execute o comando pela conexão ssh

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/nulldescarta 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 << SOMETEXMARKERao 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 SOMETEXTMARKERe 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

informação relacionada