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?
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:
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.
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.
-tsia passato.
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.