¿Sustitución de comandos tipo Bash en ssh o cómo solicitar cosas de ssh *cliente*?

¿Sustitución de comandos tipo Bash en ssh o cómo solicitar cosas de ssh *cliente*?

En bash (y otros shells) es posible insertar el resultado de un comando en una línea de comando usando algo como $() y `` (comillas invertidas).

Ahora sería bueno si tuvieras algo así pero para sesiones ssh. Entonces está en una sesión ssh y necesita información de su propia computadora y desea colocarla en la línea de comando interna de la máquina a la que está conectado.

Por ejemplo, digamos que desea acceder directamente a una consola MySQL. Podrías usar un comando como ese:

ssh [email protected] "mysql -u blub -pmypass"

Eso funciona, pero el problema es que puedes ver la contraseña en la línea de comando del proceso de shell ssh.

Para solucionar este problema de seguridad me gustaría tener algo como esto:

ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"

que se ejecutaría cat passfileen el cliente ssh y no en el servidor. ¿Se sabe algo así? ¿Tienes algún otro truco para hacerlo?

ACTUALIZACIÓN: Agradezco las respuestas que se refieren a mi ejemplo, pero no las aceptaré a menos que respondan a la pregunta real. Es decir, si es posible comunicarse con la computadora cliente ssh desde una sesión ssh. (Sé que esto puede constituir un posible problema de seguridad)

Soluciones posibles:

  • Tener un servidor ssh en el cliente al que volver a conectarse. (sweimann) El problema es cómo obtener las credenciales para volver a conectarse al servidor.
  • Crear un túnel con ssh y usar algún script netcat/telnet para ejecutar comandos en el servidor y enviar el resultado.
  • Utilice expect para programar el shell. (Zac Thompson)
  • Utilice un contenedor personalizado alrededor de ssh en el cliente que observa la consola y toma las medidas correspondientes. (sapporo)
  • Parche SSH para admitir esto. Hay un parche similar en la lista de correo.disponible.
  • Hay una opción 'SendEnv' parasshque establece variables de entorno en la computadora remota. Sin embargo, esto debe habilitarse en el sshd remoto.

Respuesta1

quieres usaresperarpara esto. Probablemente ya esté en tu máquina. Es la herramienta estándar para cualquier tipo de automatización interactiva de línea de comandos. Es una biblioteca Tcl, por lo que obtendrás algunas habilidades de Tcl de forma gratuita. Tener cuidado; Es adictivo.

#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact

Respuesta2

Intente usar un <.

ssh[correo electrónico protegido]"mysql -u blub -p" <archivo

Si la primera línea del "archivo" es su contraseña, "debería" usarla para solicitar la contraseña, luego el resto se usará para la parte sql.

Si simplemente está ejecutando un archivo sql en el servidor remoto, intente:

ssh[correo electrónico protegido]"mysql -u blub -p <archivo.sql" <contraseña

Respuesta3

He estado investigando el problema subyacente hace unos años. Quería activar una descarga de SCP desde una sesión SSH. Al igual que su problema, esto requiere comunicación desde dentro de la sesión SSH con algún proceso en el cliente.

Así que aquí hay una tercera solución posible: conectarse usando un contenedor alrededor de SSH, que escanea la salida de SSH y activa ciertos comandos localmente cuando reconoce un patrón. Es claramente un truco, pero podría funcionar.

Terminé con una versión modificada de /usr/bin/script que recordaría mi conexión SSH (por ejemplo me@somehost), y cada vez que se imprimiera mi sesión ssh ###/some/absulte/path/to/file/on/host.txt###, se ejecutaría localmentescp me@somehost:/some/absulte/path/to/file/on/host.txt .

Se utilizó un script de shell simple para producir convenientemente el patrón y la ruta absoluta en el servidor.

(Mi código en realidad hizo un poco más: abrió un editor de texto local en el archivo descargado y lo volvió a cargar usando SCP cuando se modificó el archivo. Avíseme si desea el código).

He estado buscando una implementación mejor de esto desde entonces, pero hasta ahora no he encontrado ninguna.

Quizás esta técnica podría implementarse como un comando proxy SSH (piense en connect.c) en lugar de un contenedor alrededor de SSH.

Respuesta4

Tienes que emular la sesión del terminal:

ssh -t [email protected] "mysql -u blub -p"

En este caso, se le pedirá la contraseña que viaja por la red a través del canal ssh cifrado y no se mostrará en la consola.

información relacionada