Come posso determinare se a una connessione SSH client è associata una tty?


2

Sto scrivendo un modulo PAM per gestire l'autenticazione (lato server - sshd) e devo sapere se un client ssh è un tty (interattivo) o meno (non interattivo).

Qualcuno ha un indizio?

Risposte:


0

Potresti provare a verificare $SSH_TTY, ma non è affidabile.

$ 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.

non è quello sul lato client? Sono sul lato server (sshd)
jontra volta il

Uh, no, è fatto sul server.
Ignacio Vazquez-Abrams,

0

Sul lato client delle cose, puoi usare il ttycomando ( manpage qui ). Supponendo che la sessione sia interattiva, questo comando restituirebbe qualcosa del tipo:

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

Tuttavia, se il client non è interattivo / basato su tty, il comando restituirà:

not a tty

Per scrivere effettivamente un modulo PAM, pur ttyfornendo alcuni codici di uscita che è possibile utilizzare, è improbabile che sia possibile utilizzare il ttycomando direttamente come syscall; Invece, si dovrebbe dare un'occhiata a la ttyname()(o ttyname_r()funzioni) .

Puoi vedere un'implementazione di esempio di questa funzione qui che copre alcuni casi d'uso generali. Mentre dovrebbe essere sufficiente vedere se è stato restituito un ttyname valido, la migliore pratica sarebbe quella di verificare se l'errore è ENOTTYstato generato, indicando che il descrittore di file passato non fa riferimento a un dispositivo terminale.


A meno che non -tsia passato.
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams anche uno pseudo-terminale emula un terminale full-text, quindi ci si aspetterebbe che anche una sessione non interattiva invocata con questo dovrebbe indicare che la sessione è TTY a prescindere ...
Breakthrough

0

Se stai scrivendo in C:

man isatty

DESCRIZIONE La funzione isatty () verifica se fd è un descrittore di file aperto che fa riferimento a un terminale.

RETURN VALUE isatty () restituisce 1 se fd è un descrittore di file aperto che fa riferimento a un terminale; in caso contrario viene restituito 0 e errno viene impostato per indicare l'errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.