¿Hay alguna manera de obligar a SSH a usar un shell particular en el extremo remoto, independientemente de cuál sea el shell predeterminado del usuario?
He intentado soluciones similares a:
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
pero desafortunadamente, el shell predeterminado en el extremo remoto es responsable de analizar la parte del "comando complicado de varias líneas", y estoy teniendo dificultades para escapar lo suficiente como para que funcione tanto para los usuarios de shell Bash como para C.
ssh
bash
shell
command-line-interface
plinehan
fuente
fuente
Respuestas:
No creo que esto sea posible, al menos con sistemas basados en openssh. Si tiene la capacidad, una mejor solución podría ser crear un archivo de script de shell y luego ejecutarlo con el método que publicó. Tendría la ventaja de minimizar la cantidad de escape necesaria, pero dejaría un archivo que tendría que eliminarse (tal vez como el último paso del script).
fuente
Use un heredoc:
fuente
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. Entonces, en lugar de un paso, tiene dos pasos: paso 1, copie el script en un archivo, paso 2,cat
el script enssh
.Utilice inicios de sesión basados en claves, no basados en contraseña. Luego puede agregar una (lista de) "comandos forzados" a su clave ssh pública (en el campo "opciones" en el caso de SSH1) que está instalada en el servidor (en el archivo ~ / .ssh / Authorizedkeys para SSH1 , ~ / .ssh2 / autorización para SSH2).
Realice su comando forzado para que su shell deseado se llame ...
Más: puede asociar como máximo un comando forzado a una tecla determinada. Si necesita múltiples comandos forzados para diferentes propósitos, debe configurar diferentes teclas. (Por supuesto, puede poner varias cosas en una secuencia de comandos, que llama mediante un comando forzado. Pero tenga en cuenta que los comandos forzados siempre se ejecutan para una cuenta / clave determinada si el usuario inicia sesión, independientemente de si pidió algo diferente para ejecutar. Si aún desea respetar el comando original solicitado, eche un vistazo a cómo explotar la
$SSH_ORIGINAL_COMMAND
variable ...Lea sobre "comandos forzados" a través de Google .
fuente
/etc/sshrc
.Puede usar la
-t
opción para forzar la asignación de un pseudo-tty para el programa que desea iniciar, como si estuviera ejecutando el shell estándar. Luego pase el shell que desea como un argumento simple y antiguo.Con esta técnica, no solo puede usar cualquier shell instalado, sino que también puede abrir vim y otros programas que requieren un TTY, desde un solo comando. Lo cual es genial si estás escribiendo un script de shell que te conecta en algún lugar y abre un archivo en vim, htop o algo así.
No estoy seguro de si se trata de un shell de inicio de sesión, pero hay opciones para hacer que bash actúe como un shell de inicio de sesión, por lo que su shell también puede tener eso.
fuente
Sorprendentemente veo diferentes resultados con lo siguiente:
correr en el tablero:
vs bash:
Mostrar el comando entre comillas funciona como se esperaba.
fuente
sh -c "$*"
. Por lo tanto, estás corriendosh -c "/bin/bash -c echo <(cat)"
; elecho
comando en sí es el único argumento que se pasa-c
y<(cat)
es un argumento completamente diferente.Me enfrenté a una situación similar hace un tiempo, donde necesitaba usar ksh coprocess para sqlplus y solo tenía un ssh a través del cual las lecturas y escrituras deben tener lugar.
Una forma de hacerlo es canalizar todos sus comandos dependientes en una línea (use;) a / usr / bin / ksh en la máquina remota. por ejemplo:
fuente