ejecutar comando a través de conexión ssh

ejecutar comando a través de conexión ssh

Quiero ejecutar el siguiente comando a través de una conexión 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 en mi máquina de destino.

Ahora quiero usar este comando desde una máquina diferente y ejecutarlo vía ssh, así que lo que he hecho es esto:

ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}' 

El resultado es

 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.

¿Qué pasa con mi llamada?

Respuesta1

Podría ser más fácil simplificar el comando para tener menos caracteres especiales con los que el shell pueda atascarse:

ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'

El final 2>/dev/nulldescarta el texto de error en caso de que no se pueda encontrar el archivo PID o contenga un PID obsoleto.

Respuesta2

Recomendaría poner esos comandos en un script al que llame de forma remota ssh. De lo contrario, necesitaría poner toda la parte "remota" de la línea de comando entre comillas y escapar correctamente de todo lo que hay dentro. Esto puede resultar tedioso y propenso a errores. Es por eso que se realiza una llamada de script remota.

Respuesta3

El segundo comando tal como lo tiene ejecuta la parte del código ( $()) en el subshell local. Debes ejecutarlo en el otro lado escapando de los caracteres especiales (básicamente $):

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 ponerlo todo en los apóstrofes 'y escapar de los 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}\''

No lo probé, pero es la idea básica de lo que se debe hacer para solucionarlo.

Respuesta4

Si realmente eres reacio a escribir guiones, es posible que encuentres Aquí documentopráctico. En pocas palabras, agrega << SOMETEXMARKERal final de la línea y continúa ingresando tantos comandos para el host remoto como desee. Luego, en la última línea ingresa (al principio de la línea) lo mismo SOMETEXTMARKERy eso hace que los comandos ingresados ​​se ejecuten de forma remota

Aquí hay una muestra

[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

información relacionada