es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El símbolo del shell no aparece en el socket

Quiero establecer una shell remota a través de TCP.

Ya lo hice funcionar, pero hay un pequeño problema:
El indicador no aparece en el lado del cliente.

Si mi cliente ingresa echo hi, se imprimirá hi en la salida estándar (lado del cliente), y el proceso de la shell permanecerá abierto hasta que presione ctrl-D o elija salir de cualquier forma.

Después de una investigación básica, descubrí que bash imprime su indicador en stderr (por ejemplo, bash 2>/dev/null no mostrará ningún indicador en ningún terminal).

Esto puede ser una pista, pero antes de llamar a execve en el proceso de la shell, redirecciono desde mi servidor a la conexión del cliente de esta manera:

for (int i = 0; i < 3; i++)
{
    dup2(client->confd, i);
}
execve("/bin/bash", (char *[]){"bash", NULL}, NULL);

Y como la salida estándar (1) de mi servidor está bien redirigida a la conexión del cliente, stderr (2) también debería estarlo. ¿Estoy en lo correcto?

No sé cómo solucionarlo, cualquier ayuda sería muy apreciada.

Más contexto:

  • Si ingreso un comando no válido en el lado del cliente, aparece un mensaje, lo que significa que stderr está redirigido.
  • Si redirijo stderr a stdout antes de mis redirecciones en el lado del servidor, y luego redirijo stdin / stdout a la conexión del cliente, nada cambia.
  • Conecto los clientes a mi servidor de esta manera: nc localhost 8080.
  • Cierro todos los descriptores de archivos abiertos que sean mayores que 2 antes de mis redirecciones.
  • isatty(client->fd) devuelve 0, por lo que tal vez el indicador de la shell no se muestra en los descriptores no tty, pero no puedo encontrar ninguna pista en el código de readline o en cualquier otro lugar.
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para establecer una shell remota a través de TCP, necesitas redirigir la entrada, salida y error estándar de la shell remota al descriptor de archivo de conexión del cliente. En tu caso, ya has realizado las redirecciones, pero el indicador no se muestra en el lado del cliente.

    Una posible razón para esto es que el indicador de la shell se imprime en stderr, y solo has redirigido stdout al descriptor de archivo de conexión del cliente. Para solucionar esto, necesitas redirigir stderr al mismo descriptor de archivo que stdout. Puedes hacer esto agregando el siguiente código antes de tu llamada a execve:

    dup2(client->confd, STDERR_FILENO);
    

    Esto redirigirá stderr al mismo descriptor de archivo que stdout, que es el descriptor de archivo de conexión del cliente en tu caso.

    Otra posible razón para el problema podría ser que el indicador de la shell no se muestra en descriptores que no son tty. En este caso, puedes intentar usar la opción ‘-i’ al invocar la shell para forzar que actúe como si fuera interactiva. Puedes modificar tu llamada a execve de esta manera:

    execve("/bin/bash", (char *[]){"bash", "-i", NULL}, NULL);
    

    Esto iniciará la shell en modo interactivo y debería mostrar el indicador en el lado del cliente.

    Espero que esto te ayude a resolver el problema y establecer una conexión exitosa de la shell remota.

Comments are closed.