Normalmente, si le pasa un comando a ssh así
ssh [email protected] 'some-command.sh'
Obtiene una sesión no interactiva y ssh se cierra tan pronto como se ejecuta el comando (o script, o lo que sea). ¿Cómo puedo obtener una sesión interactiva y ejecutar un comando que he especificado desde mi máquina local? Por ejemplo, me gustaría poder abrir la pantalla y reiniciar una sesión de pantalla específica:
ssh [email protected] 'screen -r 12345'
pero esto no está permitido, devuelve el error "Debe estar conectado a un terminal". que supongo significa esencialmente "debe llamar a este comando desde un shell interactivo".
Como otro ejemplo, uso un montón de máquinas en el trabajo que a menudo requieren que use una cuenta compartida para tener derecho a hacer ciertas cosas (sí, lo sé: mala idea, pero no me culpes, no configuré cosas que manera), y generalmente tienen ksh como shell predeterminado. Me gustaría iniciar sesión, cambiar a bash (o zsh) y obtener el .bash_profile (o .zshrc) de mi propia cuenta. Esto sería fácil si pudiera establecer una sesión ssh interactiva y pasar un comando a la máquina remota para que se ejecute al iniciar sesión.
Tengo en mente una solución muy burlona (y no probada) que publicaré, pero espero que alguien conozca una mejor manera.
ACTUALIZACIÓN: para aquellos que no se dieron cuenta de esto, no estoy planeando hacer todo esto a mano, por lo que decirme que abra una sesión interactiva y luego hacerlo a mano en realidad no resuelve nada.
2ª ACTUALIZACIÓN: para intentar aclarar una vez más: estoy tratando de ejecutar comandos (arbitrarios) en el servidor (especificados programáticamente en el cliente) pero luego tengo una sesión interactiva abierta que se ve afectada por cualquier cosa hecha por esos comandos programáticos.
echo "command" | ssh user@remote_host
Respuestas:
Puede probar el siguiente comando para iniciar bash y obtener su propio perfil cuando ssh:
fuente
-t
interruptor también soluciona el problema del interrogadorscreen
.ssh -t www.dev "echo 'hi there'"
, la conexión se cierra inmediatamente después de ejecutar el comando.Sobre la base de la respuesta de Dogbane, una solución completa se ve así:
Aquí uso
-t
para forzar la asignación de un pseudo-terminal, que se requiere para un shell interactivo. Luego ejecuto dos comandos en el servidor: primero lo que quería hacer antes de abrir el shell interactivo (en mi caso, cambiar el directorio a una carpeta específica), y luego el shell interactivo en sí. bash ve que tiene un pseudo-terminal y responde de forma interactiva.Las comillas simples aseguran que todo se pasa al servidor remoto como el comando que debe ejecutar su shell predeterminado.
Gracias de nuevo a dogbane por proporcionar la pista necesaria
-t
. Solía resolver este problema conexpect
, que definitivamente está matando a un ratón con un cañón. (:fuente
Prueba esta solución.
El inicio de sesión es interactivo y su comando se pasa como si lo hubiera escrito en la línea de comandos interactiva. La sesión finaliza como si hubiera escrito
fuente
ssh
.-t
o su propio archivo bash. +1Use ssh -X para usar cmd de termIO.
Además, puede encadenar sus cmds como "ssh 'source ~ / .bashrc && cd && do'"
fuente
por qué no instalar detach en el sistema remoto y usar:
fuente
detach
,ls
no mantener la sesión abierta y se desconectará sin imprimir la salidals
, pero todavía va a correr.La respuesta de laggingreflex está cerca ... Lo cambiaría de la siguiente manera:
Desafortunadamente, no es probable que te guste la forma en que funciona, porque "cat" amortigua las líneas que escribe en stdout ... Si creamos un script llamado "echo-cat" que se parece a esto:
obtendremos el mismo resultado sin el almacenamiento en búfer:
Eso probablemente te acercará mucho más a tu objetivo ...
fuente
Esto no es probado, pero creo que debería funcionar.
Cree un script llamado (p. Ej.) Arranque remoto que tome un argumento entre comillas después de un argumento de usuario @ host:
Este script primero debe guardar el comando entre comillas (sin comillas) en el archivo llamado (por ejemplo)
.onetime
en la máquina remota, y luego ejecutar un comando ssh normal, esta vez sin pasar ningún comando para que se ejecute en la máquina remota. (Si ejecuta ssh [email protected] desde un script, puede funcionar ejecutar exe ssh [email protected]).Para que esto funcione, la máquina remota debe obtener
.onetime
de su .bash_profile o .zshrc o lo que sea. Después de ejecutarse.onetime
, debería eliminarse.onetime
, por lo que el archivo no se ejecutará la próxima vez que inicie sesión regularmente.fuente