No puedo ejecutar un comando a través de ssh

No puedo ejecutar un comando a través de ssh

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 sshque ve es devlist. sshse invoca localmente (esto no es una sorpresa), pero también lo es todo después del primer |.

El error que obtuvo provino sudode este fragmento: do sudo camcontrol identify $a. Se ejecuta localmente y aparentemente camcontrolno 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 sshla obtienen; también impiden la expansión local de $a.

Si sudova a solicitar su contraseña, necesitará un pseudoterminal. Puede forzar la asignación de pseudo-terminales con -tla opción ssh(como parece ssh -t xxx.yyy.zzz.net …). Nota ssh -tasigna pseudoterminal en el lado remoto. El control remoto sudole 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 -tstdout 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 -tno 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, -tcualquier mensaje de sudointerferirá.

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?

información relacionada