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/null
descarta 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 << SOMETEXMARKER
al 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 SOMETEXTMARKER
y 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