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 tty
comando ( 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 tty
fornendo alcuni codici di uscita che è possibile utilizzare, è improbabile che sia possibile utilizzare il tty
comando 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 è ENOTTY
stato generato, indicando che il descrittore di file passato non fa riferimento a un dispositivo terminale.
-t
sia 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.