27 votos

Fuerza de SSH para usar una shell específica

¿Hay alguna manera de obligar a SSH para usar una shell particular en el extremo remoto, independientemente de lo que es el shell por defecto del usuario?

He intentado soluciones afín a:

ssh host.domain.com /bin/bash -c 'complicated, multi-line command'

Pero lamentablemente el shell por defecto en el extremo remoto es responsable de analizar la parte del "comando multilínea, complicado", y tengo dificultades para escapar lo suficiente como para trabajar tanto para usuarios shell Bash y C.

30voto

aws Puntos 1

Me enfrenté a una situación similar hace poco donde necesitaba usar ksh coprocess de sqlplus y sólo tenía un ssh a través de que Lee y escribe debe llevarse a cabo.

Una manera de hacer esto es a todas sus órdenes dependientes de la pipa en una línea (usar ;) para /usr/bin/ksh en la máquina remota. por ejemplo:

host="user@host"

db_conn="ora_user/passwd"

a="select * from dual;"

frmt="set heading off echo off feedback off verify off pagesize 0 termout off"

var=$(ssh ${host} "echo 'sqlplus -silent /nolog |&; sql_pid=\$!; print -p \"conn ${db_conn}\"; print -p \"${frmt}\"; print -p \"${a}\"; print -p \"exit\"; wait \$sql_pid' > /remote_dir/kshcmd.txt; awk '{print \$0}' /remote_dir/kshcmd.txt | /usr/bin/ksh")

15voto

Utilice un heredoc:

ssh host.domain.com /bin/bash << EOF
big ugly commands
lots of them
EOF

10voto

Kurt Pfeifle Puntos 858

Utiliza la tecla de inicios de sesión basados, no basado en contraseña. A continuación, puede añadir un (lista de) "forzado comando(s)" a su público clave ssh (en las "opciones" de campo en caso de SSH1) que está instalado en el servidor (en ~/.ssh/authorized_keys de archivo para SSH1, ~/.ssh2/autorización para SSH2).

Hacer que su forzada de comando, por lo que su deseado shell se llama...

Más: puede asociar a la mayoría de los obligó a los comandos para una clave dada. Si necesita varios forzado comandos para diferentes propósitos, usted tiene que configurar los diferentes claves. (Por supuesto, usted puede poner varias cosas en una secuencia de comandos, que se llame a través de forzado de comandos. Pero tenga en cuenta que obligó a los comandos son siempre ejecutar para una cuenta determinada/clave si el usuario inicia sesión, sin importar si se pide algo diferente a ejecutar. Si aún desea honrar el comando original pidió, tener una mirada en cómo explotar la $SSH_ORIGINAL_COMMAND variable...)

Leer sobre forzada "comandos" a través de Google.

7voto

sysadmin1138 Puntos 86362

No creo que esto es posible, al menos con sistemas basados en openssh. Si usted tiene la capacidad, una mejor solución podría ser sftp un archivo de script de shell y luego ejecutarlo con el método que se registra. Tendría la ventaja de reducir al mínimo la cantidad de escape necesarios, pero dejaría un archivo subyacente que tendría que eliminarse (tal vez como el último paso de la secuencia de comandos).

1voto

Eric Woodruff Puntos 101

Es sorprendente ver resultados distintos con los siguientes:

en el tablero:

ssh eric@172.17.1.241 /bin/bash -c "echo <(cat)"                                              
sh: 1: Syntax error: "(" unexpected

vs bash:

ssh eric@172.17.1.241 '/bin/bash -c "echo <(cat)"'                                            
/dev/fd/63

Mostrando el comando completamente cotizado es trabajar como espera.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: