Como posso obter / bin / login para não timeout

5

No meu /etc/inittab , estou usando a seguinte linha:

ttyS0::respawn:/bin/login

Isso me dá um prompt de login se eu quiser me conectar à porta serial. Mas continua ecoando:

[hostname] login: 
Login timed out [hostname] login: 
Login timed out [hostname] login: 

Como posso parar isso e fazer com que ele não atinja o tempo limite?

Então, para esclarecer o que surgiu nos comentários:

  • O tempo limite de login é o comportamento esperado normal
  • Eu quero mudar esse comportamento na minha máquina, para que login não expire mais
  • Em outras distribuições do Linux, você pode editar LOGIN_TIMEOUT em /etc/login.defs , conforme explicado nesta resposta: altere o tempo limite de login do tty - ArchLinux
  • Isso não funciona no Busybox
por Dakkaron 26.01.2017 / 16:41

2 respostas

3

Aparentemente impossível sem alterar o código-fonte.

A pesquisa de login.defs ou LOGIN_TIMEOUT não produz resultados relevantes e analisa loginutils / login.c realmente parece que o valor e todo o temporizador são codificados:

enum {
    TIMEOUT = 60,
    EMPTY_USERNAME_COUNT = 10,
    /* Some users found 32 chars limit to be too low: */
    USERNAME_SIZE = 64,
    TTYNAME_SIZE = 32,
};

[…]

static void alarm_handler(int sig UNUSED_PARAM)
{
    /* This is the escape hatch! Poor serial line users and the like
     * arrive here when their connection is broken.
     * We don't want to block here */
    ndelay_on(STDOUT_FILENO);
    /* Test for correct attr restoring:
     * run "getty 0 -" from a shell, enter bogus username, stop at
     * password prompt, let it time out. Without the tcsetattr below,
     * when you are back at shell prompt, echo will be still off.
     */
    tcsetattr_stdin_TCSANOW(&G.tty_attrs);
    printf("\r\nLogin timed out after %u seconds\r\n", TIMEOUT);
    fflush_all();
    /* unix API is brain damaged regarding O_NONBLOCK,
     * we should undo it, or else we can affect other processes */
    ndelay_off(STDOUT_FILENO);
    _exit(EXIT_SUCCESS);
}

[…]

int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int login_main(int argc UNUSED_PARAM, char **argv)
{

[…]

    /* We install timeout handler only _after_ we saved G.tty_attrs */
    signal(SIGALRM, alarm_handler);
    alarm(TIMEOUT);

Note como a última parte não é recuada, parece não haver if em torno dela, então ela sempre roda. Como você provavelmente poderia fazer é descomentar as duas últimas linhas e compilar busybox se isso for possível.

Idéia alternativa

De busybox 'exemplo inittab :

# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
#                                  restart, ctrlaltdel, and shutdown.
#
#       Note: askfirst acts just like respawn, but before running the specified
#       process it displays the line "Please press Enter to activate this
#       console." and then waits for the user to press enter before starting
#       the specified process.

Você pode simplesmente alterar respawn para askfirst . Dessa forma, /bin/login após o tempo limite expira simplesmente ao prompt Please press Enter… em vez de iniciar /bin/login imediatamente.

    
por 26.01.2017 / 20:11
4

Como você viu, o programa login pode ser, e geralmente é, configurado para expirar se nenhuma entrada for recebida por um determinado número de segundos. Existem várias motivações para esse comportamento, desde a necessidade de manter linhas discadas não utilizadas claras até o mundo que deseja que você limpe sua tela. . Existem, igualmente, razões para não querer, como você tem aqui. Desligar para limpar a linha é bastante sem sentido se não houver modem, por um lado.

Infelizmente, os programas login variam nesse sentido. O pacote de login do login do (digamos) Debian respeita um arquivo de configuração /etc/login.defs . Eu tenho LOGIN_TIMEOUT definido como 0 no meu. Mas outros programas login têm isso inconfigurável e hardwired. Existe mais do que apenas o programa login no mundo. ☺

O programa login no FreeBSD é - ai! - um desses. Assim também, é o programa login que está embutido no Busybox. O primeiro tem um tempo limite de 300 segundos; o último, meros 60 segundos .

O código do Busybox é uma constante de tempo de compilação. Você terá que realmente modificar a fonte para o programa e reconstruí-lo para desabilitar esse comportamento. Por comentário no código do FreeBSD login program que explica porque é uma variável de tempo de execução e não uma constante de tempo de compilação, os autores do FreeBSD esperam que você varie isso corrigindo o próprio /usr/bin/login .

Existem algumas estratégias de atenuação. Um é - ai! - para manter getty no loop. O login do FreeBSD é invocado pelo getty do FreeBSD, que tem uma capacidade to em /etc/gettydefs que é normalmente definida como zero. O getty do Busybox similarmente tem uma opção -t . Ambos significam que um terminal serial ocioso, não conectado, fica para sempre no prompt login: exibido por getty e o tempo limite em login não é iniciado.

Eu não uso getty em terminais virtuais, eu mesmo. Então, para o FreeBSD eu tenho um programa muito simples login-prompt que simplesmente espera que o usuário pressione retorno. E no Linux eu desligo o tempo limite com login.defs como mencionado.

Para terminais reais em linhas seriais, no entanto, ainda uso getty .

Leitura adicional

por 26.01.2017 / 20:14