Como posso determinar se uma conexão SSH do cliente tem um tty associado a ela?

2

Estou escrevendo um módulo PAM para lidar com a autenticação (lado do servidor - sshd) e eu tenho que saber se um cliente ssh é um tty (interativo) ou não (não interativo).

Alguém tem uma pista?

    
por jontra volta 15.07.2013 / 07:34

3 respostas

0

Você pode tentar verificar $SSH_TTY , mas isso não é confiável.

$ ssh -6 fedoraplug.local
Last login: ......
-$ echo "${!SSH*}"
SSH_CLIENT SSH_CONNECTION SSH_TTY
-$ exit
$ ssh -6 fedoraplug.local 'echo "${!SSH*}"'
SSH_CLIENT SSH_CONNECTION
$ ssh -t -6 fedoraplug.local 'echo "${!SSH*}"'
SSH_CLIENT SSH_CONNECTION SSH_TTY
Connection to fedoraplug.local closed.
    
por 15.07.2013 / 07:51
0

No lado do cliente, você pode usar o comando tty ( manpage aqui ). Assumindo que a sessão é interativa, esse comando retornaria algo como:

breakthrough@lt0:~$ tty
/dev/pts/0

No entanto, se o cliente não for não interativo / baseado em tty, o comando retornará:

not a tty

Para realmente escrever um módulo PAM, enquanto tty fornece alguns códigos de saída que você pode usar, é improvável que você possa usar o comando tty diretamente como syscall; em vez disso, você deve dar uma olhada em a função ttyname() (ou ttyname_r() ) .

Você pode ver uma implementação de exemplo de esta função aqui , que abrange alguns casos de uso geral. Embora deva ser suficiente para ver se um ttyname válido foi retornado, a melhor prática seria verificar se o erro ENOTTY foi gerado, indicando que o descritor de arquivo transmitido não se refere a um dispositivo terminal.

    
por 15.07.2013 / 08:38
0

Se você está escrevendo em C:

man isatty

DESCRIÇÃO        A função isatty () testa se fd é um descritor de arquivo aberto referente a um terminal.

VALOR DE RETORNO        isatty () retorna 1 se fd é um descritor de arquivo aberto referente a um terminal; Caso contrário, 0 será retornado.        e errno é definido para indicar o erro.

    
por 11.08.2013 / 16:08