venerdì 26 ottobre 2007

VirtualBox: su, sudo e cartelle condivise in guest Linux

Prologo: questo post riguarda tutte le distribuzioni Linux che usano il comando su invece che sudo come in Ubuntu per eseguire operazioni riservate all'amministratore di sistema. Come distribuzione di esempio è stata usata Mandriva 2008.

Dicevo qualche post fa che Mandriva è una delle distribuzioni che più mi piacciono fra quelle che non uso. Visti però i recenti problemi di installazione della openSUSE 10.3 in VirtualBox, ho deciso di farne la distribuzione da affiancare alla Ubuntu quando ci sono da fare esempi concreti nei post.

Una delle cose che inizialmente mi ha messo in difficoltà nell'usarla, è stata la differente gestione della modalità amministrativa rispetto ad Ubuntu. In poche parole Mandriva usa la modalità classica con il comando su che cambia la nostra utenza trasformandoci direttamente nell'amministratore; Ubuntu invece usa il comando sudo che eleva momentaneamente i nostri privilegi a quelli dell'amministratore restando però chi siamo.

Il comando sudo ha una serie di vantaggi rispetto a su: permette infatti un controllo molto più fine su quali attività amministrative l'utente può fare (scelte sempre dall'amministratore), usando direttamente la password utente: l'amministratore in questo modo non deve esporre la sua password ma può comunque concedere a determinati utenti la possibilità di fare cose che solo lui potrebbe. Ubuntu in realtà è andata oltre, disabilitando del tutto l'amministratore e usando solo il comando sudo per le attività amministrative; risulta comunque sempre possibile riattivare su con il comando sudo passwd root.

A seconda che la distribuzione usi il comando su oppure il comando sudo il comportamento della stessa cambia. Chi come Michele Benvegnù ha provato infatti a seguire quanto indicato nel post relativo alla condivisione cartelle su guest Linux, si è sicuramente accorto che le cose con Mandriva non funzionano. Vediamo allora come attivare il comando sudo per tutte le distribuzioni che, come Mandriva, di default usano il comando su.

Il file da modificare si trova in /etc e si chiama sudoers. Aprite la shell, in Mandriva e tutte le distribuzioni con l'interfaccia grafica KDE, si chiama Konsole (fig. 1), quando l'interfaccia grafica è Gnome si chiama Terminale (l'abbiamo visto in molti altri post con Ubuntu dove appunto si usa Gnome).

Fig. 1 - attivazione comando sudo - apertura konsole
fig. 1


Ora date i seguenti comandi (fig. 2):

cd /etc [invio]
su [invio]


Con questi comandi vi siete spostati nella directory etc e siete diventati amministratore (necessario per modificare il file sudoers altrimenti immodificabile per un utente normale).

Potete notare anche visivamente la differenza fra utente normale e amministratore: se guardate la forma del prompt, noterete che prima di dare il comando su, quindi utente normale, il prompt terminava sempre con $, dopo essere diventati amministratore la riga termina sempre con #. Quando non sapete se siete utente normale o amministratore, guardate l'ultimo carattere della riga: $ utente normale, # amministratore.

Ora date il comando:

visudo [invio]

Fig. 2 - attivazione comando sudo - comando visudo
fig. 2


Il contenuto del file sudoer si apre all'interno di un editor (fig. 3), fate molta attenzione: come avvisa anche la 3a riga del file, occorre usare esclusivamente il comando visudo per modificare sudoers. Questo perché quando salverete le modifiche, vengono eseguiti ulteriori controlli per evitare che errori di sintassi nel file taglino fuori tutti gli utenti del sistema.

Ora fate ancora più attenzione: l'editor in cui vi trovate funziona come vi (pronuncia vì ai): come utenti Windows non assomiglia a nulla di ciò che conoscete, perciò vi prego di fare esattamente come vi dico.

Prima cosa da sapere: ogni riga che inizia con il simbolo cancelletto #, è un commento (ogni file di configurazione di Linux è così, è una sua caratteristica generale, ricordatela).
Seconda cosa: vi, l'editor, ha due modalità di funzionamento: appena entrati, come in questo momento, è in modalità comando. Se scrivete una lettera adesso (non lo fate, per carità!), questa non comparirebbe come testo ma verrebbe interpretata come comando, perciò buoni e fermi, non premete nulla di più di quanto vi dico.

Ok, ora portate con i tasti freccia il cursore d'inserimento al punto dove lo vedete in fig 3 (il rettangolo chiaro sullo sfondo nero sul lato sinistra della schermata). Questo perché è in quel punto che vogliamo inserire del testo.

Fig. 3 - attivazione comando sudo - contenuto file sudoers
fig. 3


Premete il ":" (due punti) sulla tastiera. Vedrete il quadratino schizzare verso il fondo della schermata e lì comparirà il ":". Aggiungete la lettera "i" (fig. 4) e date invio.


Fig. 4 - attivazione comando sudo - modalità inserimento
fig. 4


Sia il ":" che la "i" scompariranno ma il cursore resterà sul posto. Siete entrati in modalità inserimento, e tutto ciò che da questo momento scrivete viene inserito come testo nel punto in cui si trovava inizialmente il cursore (ricordate? Nello spazio vuoto sotto la prima riga visibile in fig. 4). Bene, ora con la massima attenzione, date un invio, e anche se sembra non sia successo nulla, scrivete:

VostraUser ALL=(ALL) SETENV: ALL

dove al posto di "VostraUser" mettete il nome della vostra user, quella che usate per entrare nel sistema. Date un altro invio, poi premete il tasto Esc sulla tastiera. Dopo qualche attimo l'editor uscirà dalla modalità inserimento tornando alla modalità comando, e ciò che avete inserito comparirà magicamente al suo posto (fig. 5, la riga che inizia per gds, la mia user).

Fig. 5 - attivazione comando sudo - inserimento completato
fig. 5


A questo punto salvate il tutto e uscite dall'editor con il comando ":wq" e dando invio.

Se per qualche motivo doveste sbagliare, non allarmatevi: tornate in modalità comando con Esc e date il comando ":q!" seguito da invio. Uscirete dall'editor senza salvare, rientrate con il comando visudo e riprendete d'accapo.

Bene, se avete fatto tutto correttamente, ora il comando sudo è attivo anche per la vostra user. A questo punto non vi resta che seguire il post sulle cartelle condivise in guest Linux e vedrete che questa volta tutto funzionerà correttamente anche su Mandriva e le altre distribuzioni.

@:\>

4 commenti:

  1. C'è qualcosa che non quadra.
    Ho appena installato Mandriva, ma nella directosy /etc non c'è nessuno file visudo nè sudoer
    Pertanto, nella Konsole, do i comandi:
    cd /etc
    su (e inserisco la pw, il prompt cambia da $ a #).
    Ma se digito poi
    visudo
    mi da errore (bash: visudo: command not found).

    Dove sbaglio?

    RispondiElimina
  2. Ciao Michele.
    Il file si chiama sudoers, con la s finale, e questa volta ho avuto più fortuna, sono riuscito a replicare il problema. Come si vede da questo screenshot, il messaggio bash: visudo: command not found compare prima di essere diventato amministratore con il comando su (ho anche evidenziato la posizione di sudoers, in alto a destra).
    Una volta diventato amministratore tutto funziona regolarmente: il messaggio visudo: /etc/sudoers.tmp unchanged visibile in fondo allo screenshot indica proprio che sono entrato nel file sudoers e poi uscito senza fare modifiche.
    Prova di nuovo e fammi sapere com'è andata.

    @:\>

    RispondiElimina
  3. Purtroppo, confermo che il comando visudo da errore pur essendo amministratore (ho dato il comando su, il prompt cambia a cancelletto).
    Inoltre il file sudoers non c'è proprio nella directory /etc

    Ci sono troppe differenze tra le varie distribuzioni linux, ci si perde la testa.

    RispondiElimina
  4. Ciao Michele.
    L'errore credo sia dato proprio dalla mancanza (ma che strano) del file sudoers. A tutto c'è rimedio.

    Avvia la shell (cerca Konsole nei menù) e vai nella directory /etc, dopo esserti loggato come amministratore (il comando su), dai il comando kwrite per aprire l'omonimo editor (lascia perdere visudo); al suo interno copia quanto riportato in fondo a questo commento sostituendo UserID con la tua userid. Salva il documento nella directory corrente (ti trovi in /etc) chiamandolo sudoers e chiudi kwrite. Ora devi dare a questo file gli stessi permessi che avrebbe il file sudoers originale con il comando chmod 440 sudoers.

    Finito. Dovrebbe funzionare sin da subito: se però provando a dare sudo ottieni segnalazioni del tipo che esiste un errore in qualche riga che in realtà è corretta (a me è capitato), allora come amministratore dai il comando visudo mentre sei nella directory /etc e poi esci senza fare modifiche, se ancora non funziona riavvia. A quel punto ha funzionato.

    Si, in effetti Linux è davvero trasformista per chi come noi è abituato a Windows. Questo perché (usando una metafora), mentre Windows è stato costruito in un unico blocco di marmo, Linux è stato costruito come l'unione di tanti mattoncini Lego.

    Risultato: ciò che in Windows ha un solo ed unico aspetto, in Linux può assumere tanti aspetti diversi. Abituati noi alle cose con unico aspetto, ci lasciamo abbagliare e confondere dalle apparenze. L'unico modo per superare la difficoltà è dare un'occhiata da vicino a quei mattoncini, fuor di metafora, agli elementi base di Linux che si ripetono seppur con varie sfumature in ogni distribuzione.

    Compresi quelli, le sfumature non saranno più una rottura di balle, anzi, diverranno il punto di forza di Linux. E ognuno andrà a cercarsi la distribuzione con la sfumatura che più gli si addice! ;-D

    Per quanto riguarda gli elementi base di Linux oramai ci siamo, tra poco si comincia... quale sfumatura poi preferiamo, lì ognuno deve fare da se.

    @:\>


    # sudoers file.
    #
    # This file MUST be edited with the 'visudo' command as root.
    #
    # See the sudoers man page for the details on how to write a sudoers file.
    #

    # Host alias specification

    # User alias specification

    # Cmnd alias specification

    # Defaults specification

    # Runas alias specification

    # User privilege specification
    root ALL=(ALL) SETENV: ALL

    # Uncomment to allow people in group wheel to run all commands
    # and set environment variables.
    # %wheel ALL=(ALL) SETENV: ALL

    UserID ALL=(ALL) SETENV: ALL

    # Same thing without a password
    # %wheel ALL=(ALL) NOPASSWD: SETENV: ALL

    # Samples
    # %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
    # %users localhost=/sbin/shutdown -h now

    RispondiElimina

L'autore del commento si assume la totale responsabilità del suo contenuto. Commenti ritenuti offensivi o non attinenti potranno essere cancellati.