![No puedo ejecutar un comando a través de ssh](https://rvso.com/image/1711437/No%20puedo%20ejecutar%20un%20comando%20a%20trav%C3%A9s%20de%20ssh.png)
Estoy ejecutando un comando en una máquina FreeBSD (xxx.yyy.zzz.net) y obtengo el resultado
dominio
sudo camcontrol devlist | grep -o 'ada[0-9]' | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done
producción
media RPM non-rotating
media RPM non-rotating
media RPM non-rotating
Estoy intentando ejecutar el mismo comando usando ssh desde otra máquina
dominio
ssh xxx.yyy.zzz.net sudo camcontrol devlist | grep -o 'ada[0-9]' | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done
error
sudo: camcontrol: command not found
Respuesta1
En su comando, cada |
es interpretado por su shell local. El último argumento ssh
que ve es devlist
. ssh
se invoca localmente (esto no es una sorpresa), pero también lo es todo después del primer |
.
El error que obtuvo provino sudo
de este fragmento: do sudo camcontrol identify $a
. Se ejecuta localmente y aparentemente camcontrol
no está disponible en la máquina local.
Necesita escapar o cotizar adecuadamente. En este caso, es posible que desee incluir todo el comando remoto entre comillas simples:
ssh xxx.yyy.zzz.net 'sudo camcontrol devlist | grep -o "ada[0-9]" | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done'
Tenga en cuenta que cambié las comillas simples que ya tenía. Las comillas simples (agregadas) no solo agrupan toda la cadena, sino que ssh
la obtienen; también impiden la expansión local de $a
.
Si sudo
va a solicitar su contraseña, necesitará un pseudoterminal. Puede forzar la asignación de pseudo-terminales con -t
la opción ssh
(como parece ssh -t xxx.yyy.zzz.net …
). Nota ssh -t
asigna pseudoterminal en el lado remoto. El control remoto sudo
le indica a su stderr pero luego este pseudo-terminal "imprime" stdout y stderr (como normalmente se imprimen en la consola) y en este punto ya no puede distinguirlos; la secuencia fusionada se captura y transfiere al lado local donde pasa a la salida estándar. Sin que -t
stdout y stderr remotos se transfieran por separado, vaya a stdout y stderr en el lado local y estos eventualmente se fusionarán (o no, si se redirigen) en lo que ve. Esto significa que -t
no puede (en el lado local) distinguir stderr remoto de stdout remoto. Si necesita procesar (redireccionar) localmente la salida aún más y la utiliza, -t
cualquier mensaje de sudo
interferirá.
También es probable que desees poner comillas dobles $a
(incluso en tu primer comando que no usa ssh
). Ver¿Por qué mi script de shell se atasca con espacios en blanco u otros caracteres especiales?