Newsgroup: it.comp.os.linux.software
Titolo: Lock da consolle

Esiste un modo per "lockare" Linux da consolle ? Cioe', sto' lavorando con
Linux e devo assentarmi per andare a fumare una sigaretta e non voglio che
nel frattempo qualcuno possa avvicinarsi alla mia macchina e pasticciare. Mi
servirebbe una combinazione strana di tasti che mi permetta di "blankare" lo
schermo e far comparire una richiesta di password per sbloccarlo. Il tutto
da consolle, non da X (Che uso veramente poco).
-- 
                                                                     __
 __                                                              _  ///
| _        Student in Computer Science, Swiss Federal Institute  \\///
|__|iambo      of Technology - mailto:
ggia...@iiic.ethz.ch
       \X/


 * You can use this software under the terms of the GPL. If we meet some day,
 * and you think this stuff is worth it, you can buy me a beer in return.
 */
/* #define _XOPEN_SOURCE */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include <pwd.h>
#include <shadow.h>
extern char *crypt(const char *, const char *);
int openconsole(void);
void err_sys(const char *,...);
void sigterm(int);
int fd;
int main(void)
{
    int n = 1;
    struct spwd *sp;
    struct passwd *pw;
    char *rootpass;
    sigset_t mask;
    struct sigaction sterm;
    if ((sp = getspnam("root")) == NULL)
	err_sys("getspnam");
    if ((rootpass = malloc(strlen(sp->sp_pwdp))) == NULL)
	err_sys("malloc");
    strcpy(rootpass, sp->sp_pwdp);
    if ((pw = getpwuid(getuid())) == NULL)
	err_sys("getpwuid");
    if ((sp = getspnam(pw->pw_name)) == NULL)
	err_sys("getspnam");
    /* Don't let the user stop the program from the keyboard */
    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);
    sigaddset(&mask, SIGQUIT);
    sigaddset(&mask, SIGTSTP);
    if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0)
	err_sys("sigprocmask");
    sterm.sa_handler = sigterm;
    sigemptyset(&sterm.sa_mask);
    sterm.sa_flags = SA_RESTART;
    if (sigaction(SIGTERM, &sterm, NULL) < 0)
	err_sys("sigaction");
    fd = openconsole();
    if ((ioctl(fd, VT_LOCKSWITCH) < 0))
	err_sys("ioctl(VT_LOCKSWITCH)");
    printf("Console locked by user %s.\n"
	   "(The root password will unblock too.)\n", pw->pw_name);
    while(1) {
	char *p = getpass("Password: ");
	if (strcmp(crypt(p, sp->sp_pwdp), sp->sp_pwdp) == 0 ||
	    strcmp(crypt(p, rootpass), rootpass) == 0)
	    break;
	for (; *p != '\0'; *p++ = '\0'); /* clobber the cleartext password */
	printf("Wrong password (failure #%d)!\n", n++);
    }
    if ((ioctl(fd, VT_UNLOCKSWITCH) < 0))
	err_sys("ioctl(VT_UNLOCKSWITCH)");
    close(fd);
    exit(0);
}
void sigterm(int dummy)
{
    if ((ioctl(fd, VT_UNLOCKSWITCH) < 0))
	err_sys("ioctl(VT_UNLOCKSWITCH)");
    close(fd);
    exit(0);
}
int openconsole(void)
{
    int cfd;
    if ((cfd = open("/dev/console", O_WRONLY, 0)) < 0)
	err_sys("open(\"/dev/console\")");
    return cfd;
}
void err_sys(const char *fmt,...)
{
    va_list ap;
    va_start(ap, fmt);
    vfprintf(stderr, fmt, ap);
    fprintf(stderr, ": %s\n", strerror(errno));
    va_end(ap);
    exit(1);
}
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 servirebbe una combinazione strana di tasti che mi permetta di "blankare" lo
vlock oppure lockvc
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *

    if ((sp = getspnam("root")) == NULL)
	       ^^^^^^^^
man getspnam mi dice che non esiste,
a cosa serve questa funzione?
Per concludere, dove posso trovare qualche documento sulla gestione
dei segnali in standard POSIX?
Grazie, David

 nel frattempo qualcuno possa avvicinarsi alla mia macchina e pasticciare. Mi
vlock -a, ma se non ricordo male qualcuno mi aveva detto che aveva
qualche problemino di sicurezza. Dipende poi dal tipo di gente che
potrebbe cercare di entrare, come sempre...
-- 
Bye, Garden.
--
e-mail:    
qha...@yvoreb.vg
 (use ROT13 to decode)
GPG key:   90567BF7 - 3D40 4146 4F55 D2EA 8202  9AD5 8808 1AF7 9056 7BF7
--
This signature was accessed 114 times since Fri Jan 14 2000.

Esiste un modo per "lockare" Linux da consolle ? 
Il caro vecchio comando lock :-)
     Piergiorgio Ghezzo

 da consolle, non da X (Che uso veramente poco).
Guarda il programma lockvc.
-- 
  /Kinkie
Se sulla scatola c'e` scritto "Per windows 95 e superiori", dovrebbe
funzionare sotto Linux, vero?

da consolle, non da X (Che uso veramente poco).
Comunque fare il lock da x, a meno che non ci si sia loggati direttamente da
x stesso, e' una cazzata. Se si passa sulla console virtuale da dove si e'
dato startx e si batte qualche ctrl-c x muore e il controllo passa alla console
-- 
Ciao
Salvatore 
               L'unico modo di accelerare Windows e'...a 9,8m/s^2
                Bad Penguin, la distribuzione Linux in italiano
                               ICQ# 268227566

On Tue, 15 Feb 2000 22:51:50 +0100, Giambo wrote
| Dopo aver decommentato "#define _XOPEN_SOURCE" (Come da seconda riga di
| man crypt). Che faccio, insisto o cerco il binario :) ?
Idem... :-)
Farebbe comodo anche a me questo programmillo...
-- 
 ____      ___              | 3/4 Romulan, 1/4 Vorta. | [70:2E] [71:FF] 
/_  / ___ / _/______ ___ _  | Stirred, not Shaked.    |  - CMOS Eraser 
 / /_/ -_) _/ __/ _ `/  ' \ | 
http://zefram.8m.com
    | Lasciate che i concetti 
/___/\__/_//_/  \_,_/_/_/_/ | 
zef...@libero.it
	      | fluiscano liberi - ZC
	- Zefram is on a K6-166 32MB - RH6.1 - Kernel 2.2.12 -

   bash: lock: command not found
Usa vlock


 Chiedero' all'amico freshmeat ...
Infatti...


 dato startx e si batte qualche ctrl-c x muore e il controllo passa alla console
Dici? E se facessi
$ startx &
Ctrl-Alt-F<console>
$ vlock
nessuno potrebbe premere Ctrl-C per fare porcherie da una console
sul mio PC.


"`SA_RESTART' undeclared"
Ma che razza di libc hai?


dato startx e si batte qualche ctrl-c x muore e il controllo passa alla console
Se vuoi bloccare la console da dove hai lanciato X basta dare:
$ startx & exit
-- 
 +-------------------------------------------+ 
 |        Enrico Bodo  -   PhD student       |
 |      University of Rome "La Sapienza"     |
 |          Department of Chemistry          | 
 +-------------------------------------------+  

On 16 Feb 2000 00:05:01 +0100, Marco d'Itri wrote
| >E nella mia enorme ignoranza non riesco a compilare:
| >"`SA_RESTART' undeclared"
| Ma che razza di libc hai?
A me da lo stesso errore, e rpm -qa | grep libc mi restituisce:
glibc-2.1.1-6
glibc-devel-2.1.1-6
libc-5.3.12-31
compat-glibc-5.2-2.0.7.1
RedHat 6.1


glibc-devel-2.1.1-6
Questo e` veramente strano. Il tuo /usr/include/signal.h include
/usr/include/bits/sigaction.h?
Li` c'e` la definizione di SA_RESTART.


 A me da lo stesso errore, e rpm -qa | grep libc mi restituisce:
[root@fokhouse /tmp]# cat /etc/redhat-release
Red Hat Linux release 6.1 (Cartman)
[root@fokhouse /tmp]$ gcc -o lockvt lockvt.c -Wall -pedantic -lcrypt
[root@fokhouse /tmp]# rpm -q glibc{,-devel}
glibc-2.1.2-11
glibc-devel-2.1.2-11
[root@fokhouse /tmp]$
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

On 17 Feb 2000 01:09:13 +0100, Marco d'Itri wrote
| >glibc-2.1.1-6
| >glibc-devel-2.1.1-6
| Questo e` veramente strano. Il tuo /usr/include/signal.h include
| /usr/include/bits/sigaction.h?
| Li` c'e` la definizione di SA_RESTART.
in /usr/include/signal.h c'e` a chiamata a sigaction.h, e in
quest'ultimo c'e` la define per SA_RESTART...
A questo punto mi sto decisamente preoccupando...
Anche compilandolo da root mi da:
lockvt.c: In function `main':
lockvt.c:57: `SA_RESTART' undeclared (first use in this function)
lockvt.c:57: (Each undeclared identifier is reported only once
lockvt.c:57: for each function it appears in.)
Magari devo passare qualche parametro a gcc?


 Ma che razza di libc hai?
giambo@pc:~ > rpm -qa | grep libc
libc-99.4.4-0
Ah !


On Thu, 17 Feb 2000 12:53:25 GMT, Andrea Foco wrote
| [root@fokhouse /tmp]$ gcc -o lockvt lockvt.c -Wall -pedantic -lcrypt
								^^^^^^
Eccola qua... mi mancava questa chiamata...
Adesso compila, ma mi dice che non esiste getspnam...
Mi mancano delle lib?
[ormai e` diventata  una faccenda personale: lo  rompo fintantoche` non 
funziona, mi costasse dei mesi... :-)]                                  


 Eccola qua... mi mancava questa chiamata...
Mi intrometto: Visto che pure io avevo problemi di compilazione (Tuo stesso 
problema con SA_RESTART, che pero' esiste in /usr/include/sigaction.h), ho
pensato di risolvere compilando  con "-lcrypt". Purtroppo l'errore persiste,
se compilo con "-H", vedo che sigaction.h viene "trovato" ...
Dato che sono un'ignorante in materia (Il mio massimo splendore l'ho
raggiunto compilando "Hello World !" con tanto di Makefile :-)), mi rivolgo
a te, chiedendo consiglio.


On 19 Feb 2000 00:43:49 +0100, Marco d'Itri wrote
| 
zef...@wolverine.lohacker.net
 wrote:
| 
| > /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include/stddef.h
| A quanto pare vengono usati questi strani include.
Adesso  funziona (dopo  l'aiuto di  Andrea), ma  devo tenere  commentato
il  #define  _XOPEN_SOURCE...  come  mai? nella  man  crypt  e`  proprio
all'inizio...
| Non so come funziona il gcc di red hat, controlla la documentazione
| specifica.
Provvedero`...
-- 
 ____      ___              | 3/4 Romulan, 1/4 Vorta. | [70:2E] [71:FF]
/_  / ___ / _/______ ___ _  | Stirred, not Shaked.    |  - CMOS Eraser 
 / /_/ -_) _/ __/ _ \/  ' \ | 
http://zefram.8m.com
    | Lasciate che i concetti
/___/\__/_//_/  \_,_/_/_/_/ | 
zef...@libero.it
        | fluiscano liberi - ZC
Zef is on a Red Hat Linux release 6.1 (Cartman), Linux 2.2.14 i586

On Sat, 19 Feb 2000 19:19:00 +0100, Giambo wrote
| Dato che sono un'ignorante in materia (Il mio massimo splendore l'ho
| raggiunto compilando "Hello World !" con tanto di Makefile :-)), mi rivolgo
| a te, chiedendo consiglio.
Io  sono pure  piu`  ignorante di  te, sto  imparando  adsso a  scrivere
qualcosa in C, figurati farlo con un makefile... :-)
Cmq,  compilando tutto  da root  con le  istruzioni di  Andrea Foco,  e 
lasciando commentato il #define_XOPEN_SOURCE, la compilazione va a buon 
fine (anche se devo capire *perche`* viene commentato)...               


 fine (anche se devo capire *perche`* viene commentato)...               
Anche da me' funziona tutto, e pure io mi domando perche' devo decommentare
"#define_XOPEN_SOURCE". Forse perche' non usiamo Debian :-) ?


On Sat, 26 Feb 2000 18:32:59 +0100, Giambo wrote
| > lasciando commentato il #define_XOPEN_SOURCE, la compilazione va a buon 
| > fine (anche se devo capire *perche`* viene commentato)...               
| 
| Anche da me' funziona tutto, e pure io mi domando perche' devo decommentare
| "#define_XOPEN_SOURCE". Forse perche' non usiamo Debian :-) ?
Puo` darsi... mo' installo una Debian e vedo... ;-))
-- 
 ____      ___			| 3/4 Romulan, 1/4 Vorta. |
/_  / ___ / _/______ ___ _	| Stirred, Not Shaked.    |
 / /_/ -_) _/ __/ _ \/  ' \	| Email address is FAKE   |
/___/\__/_//_/  \_,_/_/_/_/	| 
http://zefram.8m.com
    |
		Zef Runs on a RH6.1, Linux 2.2.14 i586 
In less than a century, computers will be making substantial progress on
... the overriding problem of war and peace.
		-- James Slagle