Differenze tra le versioni di "Inserire le password per lanciare comandi"

Da Gambas-it.org - Wikipedia.
(33 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
A volte può capitare che per poter utilizzare alcuni comandi, sia necessario inserire la propria parola-chiave di ''root''.
+
A volte può capitare che per poter utilizzare alcuni comandi o per eliminare la protezione ad alcuni file, sia necessario inserire la propria parola-chiave (''password'' ) di ''root''.
  
A seconda delle circostanze vi sono alcune modilità.
+
A seconda delle circostanze vi sono alcune modalità.
  
 
+
=Utilizzo del Metodo Gambas: ''Desktop.RunAsRoot()''=
==Utilizzo della funzione Gambas: ''Desktop.RunAsRoot''==
+
Innanzitutto possiamo lanciare un comando ''bash'' attraverso il Metodo ".RunAsRoot()" della Classe statica ''Desktop''.
Innanzitutto possiamo lanciare un comando ''bash'' attraverso la funzione propria di Gambas: ''Desktop.RunAsRoot''. Essa presuppone innanzitutto che sia stato impostato il componente ''gb.desktop'', e che sia presente nel sistema il programma ''xterm''.
+
<BR>Esso presuppone che sia stato attivato il Componente "gb.desktop", e che sia presente nel sistema il programma ''xterm''.
<BR>Nelle parentesi va scritta fra virgolette l'intera linea di comando da lanciare, e non il solo comando:
+
<BR>Nel primo argomento del Metodo "Desktop.RunAsRoot()" va scritta l'intera linea di comando da lanciare e non il solo comando:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
  Desktop.RunAsRoot("''Intera_linea_di_comando''")
+
  Desktop.RunAsRoot("<FONT color=gray>''Intera_linea_di_comando''</font>")
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
Esempio:
 
Esempio:
 
  Desktop.RunAsRoot("<FONT color=#B22222>cat</font> /dev/input/mouse0")
 
  Desktop.RunAsRoot("<FONT color=#B22222>cat</font> /dev/input/mouse0")
 
 
 
Se il codice prevede l'intercettazione di dati, questi potrebbero essere raccolti servendosi, laddove possibile, di una variabile d'appoggio.
 
Se il codice prevede l'intercettazione di dati, questi potrebbero essere raccolti servendosi, laddove possibile, di una variabile d'appoggio.
 
<BR>Prendendo in considerazione l'esempio precedente:
 
<BR>Prendendo in considerazione l'esempio precedente:
  '''Private''' fl As File
+
  Private fl As File
  '''Private''' sFile As String
+
  Private sFile As String
 
   
 
   
 
   
 
   
Riga 26: Riga 23:
 
   
 
   
 
  <FONT color=#006400>' ''Temp$() rappresenta il file temporaneo d'appoggio:''</font>
 
  <FONT color=#006400>' ''Temp$() rappresenta il file temporaneo d'appoggio:''</font>
  sFile = Temp$()
+
  sFile = Temp$()
 
   
 
   
  Desktop.RunAsRoot("cat /dev/input/mouse0 > " & <FONT color=#B22222>sFile</font>)
+
  Desktop.RunAsRoot("cat /dev/input/mouse0 > " & <FONT color=#B22222>sFile</font>)
 
   
 
   
 
  <FONT color=#006400>' ''Restiamo in attesa sino a quando il file non sarà creato:''</font>
 
  <FONT color=#006400>' ''Restiamo in attesa sino a quando il file non sarà creato:''</font>
  Do
+
  Repeat
    Wait 0.1
+
    Wait 0.01
  Loop Until Exist(sFile)
+
  Until Exist(sFile)
 
   
 
   
  fl = Open sFile For Read Watch
+
  fl = Open sFile For Read Watch
 
   
 
   
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub File_Read()
 
  '''Public''' Sub File_Read()
 
   
 
   
  Dim s As String
+
  Dim s As String
 
   
 
   
    s = File.Load(sFile)
+
  s = File.Load(sFile)
 
   
 
   
    TextEdit1.Text = s
+
  TextEdit1.Text = s
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
 
===Attendere sino a quando non è stata immessa la password===
 
===Attendere sino a quando non è stata immessa la password===
 
Nel precedente esempio abbiamo visto una modalità per far attendere al programma l'immissione della password necessaria per l'esecuzione del comando inserito nella funzione ''Desktop.RunAsRoot''. In quel caso il codice attendeva la creazione di un file:
 
Nel precedente esempio abbiamo visto una modalità per far attendere al programma l'immissione della password necessaria per l'esecuzione del comando inserito nella funzione ''Desktop.RunAsRoot''. In quel caso il codice attendeva la creazione di un file:
 
  <FONT color=#006400>' ''Restiamo in attesa sino a quando il file non sarà creato:''</font>
 
  <FONT color=#006400>' ''Restiamo in attesa sino a quando il file non sarà creato:''</font>
  Do
+
  Repeat
    Wait 0.1
+
    Wait 0.1
  Loop Until Exist(sFile)
+
  Until Exist(sFile)
  
 
Ora vediamo una possibile soluzione nel caso in cui, invece, si debba attendere la chiusura della finestra di ''xterm'', nella quale viene immessa la password, ossia la chiusura del processo di quel programma:
 
Ora vediamo una possibile soluzione nel caso in cui, invece, si debba attendere la chiusura della finestra di ''xterm'', nella quale viene immessa la password, ossia la chiusura del processo di quel programma:
Riga 64: Riga 59:
 
    
 
    
 
  <FONT color=#006400>' ''Intendo avviare il comando come "root":''</font>
 
  <FONT color=#006400>' ''Intendo avviare il comando come "root":''</font>
  Desktop.RunAsRoot("''linea_di_comando''")   
+
  Desktop.RunAsRoot("''linea_di_comando''")   
 
    
 
    
 
  <FONT color=#006400>' ''Per ciascun processo in questo momento attivo...''</font>  
 
  <FONT color=#006400>' ''Per ciascun processo in questo momento attivo...''</font>  
  For Each s In Dir("/proc", "", gb.Directory)   
+
  For Each s In Dir("/proc", "", gb.Directory)   
 
      
 
      
 
  <FONT color=#006400>' ''...vado a vedere il file "comm":''</font>
 
  <FONT color=#006400>' ''...vado a vedere il file "comm":''</font>
    If Exist("/proc" &/ s &/ "comm") Then   
+
    If Exist("/proc" &/ s &/ "comm") Then   
 
+
   
 
  <FONT color=#006400>' ''Se in quel file c'è una stringa simile a "xterm",...''</font>
 
  <FONT color=#006400>' ''Se in quel file c'è una stringa simile a "xterm",...''</font>
      If File.Load("/proc" &/ s &/ "comm") Like "*xterm*" Then   
+
      If File.Load("/proc" &/ s &/ "comm") Like "*xterm*" Then   
 
+
     
 
  <FONT color=#006400>' ''...allora avvio il ciclo,''</font>
 
  <FONT color=#006400>' ''...allora avvio il ciclo,''</font>
        Do  
+
        Repeat  
            Wait 0.01   
+
          Wait 0.01   
  <FONT color=#006400>' ''...che gira in attesa fino a quando''
+
  <FONT color=#006400>' ''...che gira in attesa fino a quando il processo di "xterm" non è stato terminato:''</font>
' ''il processo di "xterm" non è stato terminato:''</font>
+
        Until Exist("/proc" &/ s) = False   
        Loop Until Exist("/proc" &/ s) = False   
+
      Endif   
      Endif   
 
 
    
 
    
    Endif   
+
    Endif   
  Next   
+
  Next   
 
    
 
    
  <FONT color=#006400>' ''Allora sono sicuro che ho passato *innanzitutto* la password,
+
  <FONT color=#006400>' ''Allora sono sicuro che ho passato *innanzitutto* la password, e il comando bash dovrebbe così poter partire tranquillamente.''</font>
' ''ed il comando bash dovrebbe così poter partire tranquillamente.''</font>
 
 
   
 
   
 
  '''End'''
 
  '''End'''
 
  
 
===Dare una volta sola la password di root per aprire un file protetto===
 
===Dare una volta sola la password di root per aprire un file protetto===
Per dare una volta sola la password di root per aprire un file protetto si utilizza il comando ''chmod'' |[[#Note|1]]| e il codice 4777 (corrispondente a: ''rwsrwxrwx'') per impostare il ''setUID''. Tale comando consentirà con effetto temporaneo, ossia limitato alla sola attuale sessione di sistema, di modificare i permessi del file, in modo tale ad esempio che tutti possano eseguire tranquillamente un programma o accedere ad un file che di norma richiede i permessi di root.
+
Per dare una volta sola la password di root per aprire un file protetto si utilizza il comando ''chmod'' <SUP>&#091;[[#Note|1]]&#093;</sup> e il codice - ad esempio - 4777 <SUP>&#091;[[#Note|2]]&#093;</sup> (corrispondente a: ''rwsrwxrwx'') per impostare il ''setUID''. Tale comando consentirà con effetto temporaneo, ossia limitato alla sola attuale sessione di sistema, di modificare i permessi del file, in modo tale ad esempio che tutti possano eseguire tranquillamente un programma o accedere ad un file che di norma richiede i permessi di root.
<BR>In sostanza, la password verrà sì inserita, ma 1 volta soltanto.
+
<BR>In sostanza, la password verrà sì inserita, ma <SPAN Style="text-decoration:underline">una</span> volta soltanto.
  
 
Esempio:
 
Esempio:
  '''Private''' pr as Process
+
  Private pr as Process
 
   
 
   
 
   
 
   
Riga 107: Riga 99:
 
     Desktop.RunAsRoot("<FONT color=#B22222>chmod 4777</font> /dev/input/mouse0")
 
     Desktop.RunAsRoot("<FONT color=#B22222>chmod 4777</font> /dev/input/mouse0")
 
   <FONT color=#006400>' ''Restiamo in attesa fino a che i permessi non vengono modificati, come desiderato:''</font>
 
   <FONT color=#006400>' ''Restiamo in attesa fino a che i permessi non vengono modificati, come desiderato:''</font>
     Do
+
     Repeat
 
       Wait 0.01
 
       Wait 0.01
     Loop Until Stat("/dev/input/mouse0").Auth = "rwsrwxrwx"
+
     Until Stat("/dev/input/mouse0").Auth = "rwsrwxrwx"
 
   Endif
 
   Endif
 
   
 
   
 
  <FONT color=#006400>' ''Modificati i permessi, passiamo, dunque, avanti per gestire il file:''</font>
 
  <FONT color=#006400>' ''Modificati i permessi, passiamo, dunque, avanti per gestire il file:''</font>
   pr = Shell "cat /dev/input/mouse0" For Read As "pro"
+
   pr = Shell "cat /dev/input/mouse0" For Read As "Processo"
 
   
 
   
 
  '''End'''
 
  '''End'''
 
   
 
   
+
  '''Public''' Sub Processo_Read()
  '''Public''' Sub pro_Read()
 
 
    
 
    
 
   Dim b As Byte
 
   Dim b As Byte
 
    
 
    
  Read #pr, b
+
  Read #pr, b
 
    
 
    
 
   Print b
 
   Print b
+
 
 
  '''End'''
 
  '''End'''
  
  
 
+
=Uso diretto di comandi ''bash'' lanciati mediante ''Shell''=
==Uso diretto di comandi ''bash'' lanciati mediante ''Shell''==
+
==Far aprire un terminale per inserire la propria password con ''sudo''==
===Far aprire un terminale per inserire la propria password con ''su''===
 
 
La seguente riga di comando farà aprire una finestra di Terminale, nella quale si potrà inserire la propria parola-chiave:
 
La seguente riga di comando farà aprire una finestra di Terminale, nella quale si potrà inserire la propria parola-chiave:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
  Shell "xterm -e su -c \"''comando_da_lanciare'' > ''percorso_file_d'appoggio''\" \"$user\""
+
  Shell "xterm -e sudo '<I>comando_da_lanciare</i>'"
+
 
  <FONT color=#006400>' ''oppure anche con "x-terminal-emulator":''
+
  <FONT color=#006400>' ''oppure usando "x-terminal-emulator":''</font>
  <B><I>Shell "/usr/bin/x-terminal-emulator -e su -c \"''comando_da_lanciare''\" \"$user\""</i></b></font>  
+
  <FONT Color=gray>'''Shell "x-terminal-emulator -e sudo '<I>comando_da_lanciare</i>'"'''</font>
 
   
 
   
 
  '''End'''
 
  '''End'''
Il risultato del comando però si svolgerà tutto all'interno della finestra del terminale. Altrimenti potremo deviare il flusso di dati verso un qualsiasi file d'appoggio:
+
L'eventuale stampa dei dati di risultato del comando lanciato, però si avranno all'interno della finestra del terminale.
  Shell "xterm -e su -c \"''comando_da_lanciare'' <FONT color=#B22222><B>></b> ''percorso_file_d'appoggio''</font>\" \"$user\""
+
<BR>E' possibile deviare il flusso di dati verso un qualsiasi file d'appoggio con questa riga:
 +
  Shell "xterm -e sudo '<I>comando_da_lanciare</i>'" <FONT color=#B22222><B>></b> ''/percorso/del/file/d'appoggio''</font>"
 
e raccogliere successivamente i dati salvati nel file d'appoggio:
 
e raccogliere successivamente i dati salvati nel file d'appoggio:
  '''Private''' c As File
+
  Private fl As File
 
   
 
   
 
   
 
   
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
  c = Open "/tmp/c" For Read Watch
+
  fl = Open "<FONT Color=gray>''/percorso/del/file/d'appoggio''</font>" For Read Watch
+
 
  Shell "xterm -e su -c \"''comando_da_lanciare'' > ''percorso_file_d'appoggio''\" \"$user\""
+
  Shell "xterm -e sudo '<I>comando_da_lanciare</i>'" <FONT color=#B22222><B>></b> ''/percorso/del/file/d'appoggio''</font>"
+
 
  <FONT color=#006400>' ''oppure anche con "x-terminal-emulator":''
+
  <FONT color=#006400>' ''oppure anche con "x-terminal-emulator":''</font>
  <B><I>Shell "/usr/bin/x-terminal-emulator -e su -c \"''comando_da_lanciare'' > ''percorso_file_d'appoggio''\" \"$user\""</i></b></font>  
+
  <FONT Color=gray>''''Shell "x-terminal-emulator -e sudo '<I>comando_da_lanciare</i>' > ''/percorso/del/file/d'appoggio''"'''</font>
+
 
 
  '''End'''
 
  '''End'''
 
 
   
 
   
 
  '''Public''' Sub File_Read()
 
  '''Public''' Sub File_Read()
Riga 163: Riga 153:
 
   Dim s As String
 
   Dim s As String
 
    
 
    
+
  s = File.Load("<FONT Color=gray>''/percorso/del/file/d'appoggio''</font>")
  s = File.Load("''percorso_file_d'appoggio''")
 
 
    
 
    
  Print s
+
  Print s
 
    
 
    
 
  '''End'''
 
  '''End'''
 
 
===Uso di ''gksu''===
 
Si potrà utilizzare semplicemente il comando ''gksu'' lanciato con ''Shell''. Nel primo spazio presente nella finestra, che sarà mostrata, si dovrà inserire l'intera riga di comando che si intende lanciare come ''root''.
 
'''Public''' Sub Button1_Click()
 
 
  Shell "gksu"
 
 
'''End'''
 
 
  
 
===Dare una volta sola la password di root per aprire un file protetto===
 
===Dare una volta sola la password di root per aprire un file protetto===
Per far immettere la propria password di root, con Shell si utilizza il comando gksu (o gksudo):
+
L'immissione della propria password di root con "Shell" può servire anche - come è noto - ad esempio per ottenere libero accesso ai ''file-device''.
  
  Shell "gksu ''file_ad_accesso_protetto''"
+
====Lanciando "sudo" da un Terminale appositamente aperto====
 +
Il comando ''sudo'' potrà essere utilizzato all'interno di un terminale, per sbloccare così sino alla chiusura della sessione un file protetto:
 +
Shell "xterm -e sudo chmod 666 <FONT Color=gray>''/percorso/del/file/protetto/da/sbloccare''</font>"
 +
oppure richiamando "x-terminal-emulator":
 +
Shell "x-terminal-emulator -e sudo chmod 666 <FONT Color=gray>''/percorso/del/file/protetto/da/sbloccare''</font>"
 +
Si aprirà la finestra del terminale, <SPAN Style="text-decoration:underline">nella quale inserire la propria parola-chiave di sistema</span>. Anche in questo caso gli eventuali dati, restituiti dal comando, saranno mostrati all'interno della finestra del terminale.
  
che fa aprire un'apposita finestra. Si dovrà, però, inserire ogni volta la password, se dobbiamo utilizzare il nostro applicativo più volte nella medesima sessione di sistema.
+
====Lanciando "sudo" senza far aprire la finestra del Terminale per l'inserimento della password====
 
+
Se non si vuole far aprire la finestra del terminale per l'inserimento della password, allora si potrà utilizzare la seguente modalità che prevede anche l'uso del comando "echo".
Si può ovviare a questo fastidio, utilizzando il comando ''chmod'' una volta sola per impostare il ''setUID''. Tale comando consentirà con effetto temporaneo, limitato alla sola attuale sessione di sistema, che tutti possano eseguire tranquillamente un programma o accedere ad un file che richiede i permessi di root.
+
<BR>Per sbloccare un file protetto:
In sostanza, la password verrà sì inserita, ma 1 volta soltanto:
+
Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 <FONT Color=gray>''/percorso/del/file/protetto/da/sbloccare''</font>"
  Shell "gksu <FONT color=#B22222>chmod 4777</font> ''file_ad_accesso_protetto''"
+
oppure per lanciare un comando ''bash'' che necessita di ''sudo'':
 
+
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S <FONT Color=gray>''comando-da-lanciare''</font>"
Se il comando che dobbiamo lanciare prevede delle opzioni indicate con il segno – (come ad esempio: ''wmctrl -l -p'') il comando da eseguire dovrà inserito tra degli apici semplici es:
+
Esempio:
  gksu 'wmctrl -l -p'
+
  '''Public''' Sub Main()
 
 
 
 
Vediamo di seguito un paio di esempi con l'intento di ottenere libero accedesso ai file-device.
 
 
 
 
 
====Uso di ''Process''====
 
Private flPro As Process
 
 
   
 
   
 +
  Dim fl As File
 
   
 
   
'''Public''' Sub Form_Open()
+
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'"
 +
 
 +
  Repeat
 +
    Wait 0.01
 +
  Until Stat("/dev/tty0").Auth = "rw-rw-rw-"
 
   
 
   
<FONT color=#006400>' ''Riconosce se il programma è stato già lanciato nell'attuale sessione di sistema operativo.''
+
  fl = Open "/dev/tty0" For Write
' ''<Span style="text-decoration:underline">Se non</span> è stato lanciato almeno una volta, fa inserire la password di root''
 
' ''per impostare il setUID e consentire l'apertura del file protetto:''</font>
 
  If Not Exist("/tmp/chmod.txt") Then
 
    Exec ["gksu", "chmod 4777", "percorso_del_file-device"] Wait
 
    File.Save("/tmp/chmod.txt", "c'è")
 
  Endif
 
 
   
 
   
<FONT color=#006400>' ''Va a gestire il file-device:''</font>
+
  fl.Close
  flPro = Exec ["cat", "percorso_del_file-device"] For Read As "flPro"
 
 
   
 
   
 
  '''End'''
 
  '''End'''
 +
o anche usando la funzione "[https://gambaswiki.org/wiki/lang/access?l=it Access()]":
 +
  '''Public''' Sub Main()
 
   
 
   
 +
  Dim fl As File
 +
 
 +
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'"
 +
 
 +
  Repeat
 +
    Wait 0.01
 +
  Until <FONT color=#B22222>Access</font>("/dev/tty0", gb.Write)
 
   
 
   
'''Public''' Sub flPro_Read()
+
  fl = Open "/dev/tty0" For Write
 
    
 
    
   Dim b As Byte
+
   fl.Close
 
   
 
   
  <FONT color=#006400>' ''legge i dati provenienti dal file-device del mouse...''</font>
+
  '''End'''
  Read #flPro, b
+
oppure più semplicemente ponendo ''Wait'' a destra dell'istruzione con ''Shell'':
 +
'''Public''' Sub Main()
 
   
 
   
<FONT color=#006400>' ''...e li mostra in console:''</font>  
+
  Dim fl As File
  Print b
+
 
 +
  Shell "echo <FONT Color=gray>''mia_password''</font> | sudo -S chmod 666 '/dev/tty0'" <FONT color=#B22222>Wait</font>
 
    
 
    
'''End'''
+
  fl = Open "/dev/tty0" For Write
 
 
 
 
====Uso di ''Open.... For''====
 
'''Private''' fl As File
 
 
 
'''Public''' Sub Form_Open()
 
 
<FONT color=#006400>' ''Riconosce se il programma è stato già lanciato nell'attuale''
 
' ''sessione di sistema operativo. *Se non* è stato lanciato almeno''
 
' ''una volta, fa inserire la password di root per impostare il setUID''
 
' ''e consentire l'apertura del file protetto:''</font>
 
  If Not Exist("/tmp/chmod.txt") Then
 
    Exec ["gksu", "chmod 4777", "percorso_del_file-device"] Wait
 
    File.Save("/tmp/chmod.txt", "c'è")
 
  Endif
 
 
   
 
   
<FONT color=#006400>' ''va a gestire il file-device:''</font>
+
  fl.Close
    fl = Open "percorso_del_file-device" For Read Watch
 
 
   
 
   
 
  '''End'''
 
  '''End'''
+
Vediamo ora un semplice esempio, nel quale si porrà il comando ''Input'' seguito da una semplice variabile di tipo ''Stringa'', che dovrà contenere la pasword immessa nello spazio sottostante la console del progetto, oppure nel Terminale. La funzione ''Input'' bloccherà lo scorrimento del programma sino a quando non sarà stata immessa ed inviata la nostra password per sbloccare un file-device, assegnando così i permessi di lettura e scrittura ai tre gruppi:
+
  '''Public''' Sub Main()
  '''Public''' Sub File_Read()
+
 
 +
  Dim s As String
 
    
 
    
   Dim b As Byte
+
   Input s
+
   
<FONT color=#006400>' ''legge i dati provenienti dal file-device della porta...''</font>
+
  Shell "echo " & s & " | sudo -S chmod 666 /dev/tty0"
  Read #fl, b
+
    
 
<FONT color=#006400>' ''...e li mostra in console:''</font>
 
   Print b
 
 
 
  '''End'''
 
  '''End'''
  
  
===Uso di ''sudo''===
+
=Lanciare i comandi ''bash'' senza uso di Shell=
Si potrà utilizzare anche il comando ''sudo'', da far lanciare però all'interno di un terminale, per sbloccare sino alla chiusura della sessione un file protetto:
+
E' possibile lanciare i comandi ''bash'' <SPAN Style="text-decoration:underline">senza</span> l'uso della funzione ''Shell'' di Gambas, ma utilizzando la funzione esterna "system()", dichiarata nel file header di sistema ''/usr/include/stdlib.h'', la quale passa il nome del comando o del programma specificato perché sia eseguito.
Shell "xterm -e sudo chmod 4777 ''file_protetto_da_sbloccare''"
 
oppure se si vuole lanciare un comando che necessita dell'inserimento della parola-chiave:
 
Shell "xterm -e sudo ''comando_da_lanciare''"
 
Si aprirà la finestra del terminale, nella quale inserire la propria parola-chiave. Anche in questo i dati saranno mostrati all'interno della finestra del terminale.
 
 
 
  
====Senza far aprire la finestra del Terminale per l'inserimento della password====
+
Di seguito mostriamo un esempio con ''sudo'':
Se non si vuole far aprire la finestra del terminale per l'inserimento della password, allora si potrà utilizzare la seguente modalità.
+
  Library "libc:6"
 
 
Per sbloccare un file protetto:
 
Shell "echo ''password'' | sudo -S chmod 4777 ''file_protetto_da_sbloccare''"
 
Esempio:
 
  '''Public''' Sub Main()
 
 
   
 
   
  Dim fl As File
+
<FONT Color=gray>' ''int system (const char *__command)''
 
+
' ''Execute the given line as a shell command.''</font>
  Shell "echo ''mia_password'' | sudo -S chmod 4777 '/dev/tty0'"
+
Private Extern system_C(__command As String) As Integer Exec "system"
 
   
 
   
  Do
 
    Wait 0.01
 
  Loop Until Stat("/dev/tty0").Auth = "rwsrwxrwx"
 
 
   
 
   
   fl = Open "/dev/tty0" For Write
+
'''Public''' Sub Main()
  If IsNull(fl) Then Error.Raise("Impossibile aprire il dispositivo '/dev/tty0' !")
+
 
+
  Dim i As Integer
   ......
+
    
 +
<FONT Color=gray>' ''Con il parametro -S (maiuscolo) non verrà richiesta l'immissione la password da Console o Terminale.''
 +
' ''Con il parametro -s (minuscolo) verrà, invece, comunque richiesta l'immissione la password da Console o Terminale.''</font>
 +
  i = system_C("echo '<FONT Color=gray>''MIA_PASSWORD''</font>' | sudo -'''S''' chmod 666 /dev/tty0")
 +
  If i < 0 Then Error.Raise("Impossibile lanciare il comando !")
 +
    
 
  '''End'''
 
  '''End'''
  
  
Per lanciare un comando che necessita dell'inserimento della parola-chiave:
+
 
  Shell "echo ''password'' | sudo -S ''comando_da_lanciare''"
+
=Note=
 +
[1] Va sottolineato che il comando ''chmod'' andrà scritto tutto in <SPAN style="text-decoration:underline">minuscolo</span> !
 +
 
 +
[2] Come impostare il valore per cambiare i permessi dei file con chmod:
 +
''chmod'' può prendere argomenti del tipo alfabetico, ad esempio, g + wr, u + x, a-w, laddove:
 +
  '''a''' = all (ossia per tutte e tre le classi: ''proprietario'' del file, ''gruppo'', ''altri'');
 +
'''o''' = "others" (altri);
 +
'''g''' = "group" (gruppo)
 +
'''u''' = "user" (proprietario)
 +
 +
'''r''' = lettura
 +
'''w''' = scrittura
 +
'''x''' = esecuzione
 +
È possibile utilizzare l'operatore '''-''' per rimuovere un privilegio, per esempio, a-w <SPAN Style="text-decoration:underline">rimuove</span> il permesso di scrittura per tutti;
 +
<BR>È possibile utilizzare l'operatore '''+''' per aggiungere un privilegio, ad esempio, g+w <SPAN Style="text-decoration:underline">aggiunge</span> permessi di scrittura per il gruppo;
 +
<BR>È possibile utilizzare l'operatore '''=''' per impostare il privilegio in modo identico per , ad esempio, a=rw imposterà il permesso di [rw-rw-rw-]
  
  
 +
''chmod'' può anche assumere argomenti numerici di "modalità" (''mode''), che così rappresentiamo: nnn
 +
<BR>laddove:
 +
<BR>- il primo numero è la modalità per il ''proprietario'' del file;
 +
<BR>- il secondo numero è la modalità per il ''gruppo'';
 +
<BR>- il terzo numero è la modalità per ogni altro utente.
  
 +
Per specificare i permessi attribuiti a ciascuna delle predette tre modalità, viene assegnato dato dalla eventuale <SPAN Style="text-decoration:underline">somma</span> dei seguenti numeri:
 +
'''4''' = lettura
 +
'''2''' = scrittura
 +
'''1''' = esecuzione
 +
<BR>Così, ad esempio 765 significa:
 +
<BR>alla classe "proprietario" sono modificati i permessi attribuendo: 4 (lettura) + 2 (scrittura) + 1 (esecuzione) = 7 (sono, dunque, modificati tutti e tre i permessi)
 +
<BR>alla classe "gruppo" sono sono modificati i permessi attribuendo: 4 (lettura) + 2 (scrittura) + 0 (esecuzione) = 6 (assegnando 0 al permesso per l'esecuzione, esso viene negato)
 +
<BR>alla classe "altri" sono sono modificati i permessi attribuendo: 4 (lettura) + 0 (scrittura) + 1 (esecuzione) = 5 (assegnando 0 al permesso per la scrittura, esso viene negato)
  
=Note=
+
Assegnando ad una classe utente del file il valore 0 (zero) per i tre permessi, viene negata alla classe ovviamente ogni tipo di permesso.
[1] Va sottolineato che il comando ''chmod'' andrà scritto tutto in <SPAN style="text-decoration:underline">minuscolo</span> !
+
<BR>Esempi:
 +
<BR> 000 nega ogni permesso a tutte e tre le classi di utenti;
 +
<BR> 604 nega ogni permesso alla sola classe "gruppo";
 +
<BR> 700 nega ogni permesso alle classi "gruppo" ed "altri".

Versione delle 01:27, 11 mag 2023

A volte può capitare che per poter utilizzare alcuni comandi o per eliminare la protezione ad alcuni file, sia necessario inserire la propria parola-chiave (password ) di root.

A seconda delle circostanze vi sono alcune modalità.

Utilizzo del Metodo Gambas: Desktop.RunAsRoot()

Innanzitutto possiamo lanciare un comando bash attraverso il Metodo ".RunAsRoot()" della Classe statica Desktop.
Esso presuppone che sia stato attivato il Componente "gb.desktop", e che sia presente nel sistema il programma xterm.
Nel primo argomento del Metodo "Desktop.RunAsRoot()" va scritta l'intera linea di comando da lanciare e non il solo comando:

Public Sub Button1_Click()

 Desktop.RunAsRoot("Intera_linea_di_comando")

End

Esempio:

Desktop.RunAsRoot("cat /dev/input/mouse0")

Se il codice prevede l'intercettazione di dati, questi potrebbero essere raccolti servendosi, laddove possibile, di una variabile d'appoggio.
Prendendo in considerazione l'esempio precedente:

Private fl As File
Private sFile As String


Public Sub Form_Open()

' Temp$() rappresenta il file temporaneo d'appoggio:
 sFile = Temp$()

 Desktop.RunAsRoot("cat /dev/input/mouse0 > " & sFile)

' Restiamo in attesa sino a quando il file non sarà creato:
 Repeat
   Wait 0.01
 Until Exist(sFile)

 fl = Open sFile For Read Watch

End

Public Sub File_Read()

 Dim s As String

 s = File.Load(sFile)

 TextEdit1.Text = s

End

Attendere sino a quando non è stata immessa la password

Nel precedente esempio abbiamo visto una modalità per far attendere al programma l'immissione della password necessaria per l'esecuzione del comando inserito nella funzione Desktop.RunAsRoot. In quel caso il codice attendeva la creazione di un file:

' Restiamo in attesa sino a quando il file non sarà creato:
 Repeat
   Wait 0.1
 Until Exist(sFile)

Ora vediamo una possibile soluzione nel caso in cui, invece, si debba attendere la chiusura della finestra di xterm, nella quale viene immessa la password, ossia la chiusura del processo di quel programma:

Public Sub Form_Open()  
 
 Dim s As String  
 
' Intendo avviare il comando come "root":
 Desktop.RunAsRoot("linea_di_comando")  
  
' Per ciascun processo in questo momento attivo... 
 For Each s In Dir("/proc", "", gb.Directory)  
    
' ...vado a vedere il file "comm":
   If Exist("/proc" &/ s &/ "comm") Then  
   
' Se in quel file c'è una stringa simile a "xterm",...
     If File.Load("/proc" &/ s &/ "comm") Like "*xterm*" Then  
     
' ...allora avvio il ciclo,
       Repeat  
         Wait 0.01  
' ...che gira in attesa fino a quando il processo di "xterm" non è stato terminato:
       Until Exist("/proc" &/ s) = False  
     Endif  
 
   Endif  
 Next  
  
' Allora sono sicuro che ho passato *innanzitutto* la password, e il comando bash dovrebbe così poter partire tranquillamente.

End

Dare una volta sola la password di root per aprire un file protetto

Per dare una volta sola la password di root per aprire un file protetto si utilizza il comando chmod [1] e il codice - ad esempio - 4777 [2] (corrispondente a: rwsrwxrwx) per impostare il setUID. Tale comando consentirà con effetto temporaneo, ossia limitato alla sola attuale sessione di sistema, di modificare i permessi del file, in modo tale ad esempio che tutti possano eseguire tranquillamente un programma o accedere ad un file che di norma richiede i permessi di root.
In sostanza, la password verrà sì inserita, ma una volta soltanto.

Esempio:

Private pr as Process


Public Sub Form_Open()

' Se il file non possiede i più ampi permessi...
 If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then
' ...allora modificheremo in quel senso i permessi del file:
   Desktop.RunAsRoot("chmod 4777 /dev/input/mouse0")
 ' Restiamo in attesa fino a che i permessi non vengono modificati, come desiderato:
   Repeat
     Wait 0.01
   Until Stat("/dev/input/mouse0").Auth = "rwsrwxrwx"
 Endif

' Modificati i permessi, passiamo, dunque, avanti per gestire il file:
  pr = Shell "cat /dev/input/mouse0" For Read As "Processo"

End

Public Sub Processo_Read()
 
 Dim b As Byte
 
 Read #pr, b
 
 Print b
 
End


Uso diretto di comandi bash lanciati mediante Shell

Far aprire un terminale per inserire la propria password con sudo

La seguente riga di comando farà aprire una finestra di Terminale, nella quale si potrà inserire la propria parola-chiave:

Public Sub Button1_Click()

 Shell "xterm -e sudo 'comando_da_lanciare'"
 
' oppure usando "x-terminal-emulator":
 Shell "x-terminal-emulator -e sudo 'comando_da_lanciare'"

End

L'eventuale stampa dei dati di risultato del comando lanciato, però si avranno all'interno della finestra del terminale.
E' possibile deviare il flusso di dati verso un qualsiasi file d'appoggio con questa riga:

Shell "xterm -e sudo 'comando_da_lanciare'" > /percorso/del/file/d'appoggio"

e raccogliere successivamente i dati salvati nel file d'appoggio:

Private fl As File


Public Sub Form_Open()

 fl = Open "/percorso/del/file/d'appoggio" For Read Watch
 
 Shell "xterm -e sudo 'comando_da_lanciare'" > /percorso/del/file/d'appoggio"
 
' oppure anche con "x-terminal-emulator":
 'Shell "x-terminal-emulator -e sudo 'comando_da_lanciare' > /percorso/del/file/d'appoggio"
 
End

Public Sub File_Read()

 Dim s As String
 
 s = File.Load("/percorso/del/file/d'appoggio")
 
 Print s
 
End

Dare una volta sola la password di root per aprire un file protetto

L'immissione della propria password di root con "Shell" può servire anche - come è noto - ad esempio per ottenere libero accesso ai file-device.

Lanciando "sudo" da un Terminale appositamente aperto

Il comando sudo potrà essere utilizzato all'interno di un terminale, per sbloccare così sino alla chiusura della sessione un file protetto:

Shell "xterm -e sudo chmod 666 /percorso/del/file/protetto/da/sbloccare"

oppure richiamando "x-terminal-emulator":

Shell "x-terminal-emulator -e sudo chmod 666 /percorso/del/file/protetto/da/sbloccare"

Si aprirà la finestra del terminale, nella quale inserire la propria parola-chiave di sistema. Anche in questo caso gli eventuali dati, restituiti dal comando, saranno mostrati all'interno della finestra del terminale.

Lanciando "sudo" senza far aprire la finestra del Terminale per l'inserimento della password

Se non si vuole far aprire la finestra del terminale per l'inserimento della password, allora si potrà utilizzare la seguente modalità che prevede anche l'uso del comando "echo".
Per sbloccare un file protetto:

Shell "echo MIA-PASSWORD | sudo -S chmod 666 /percorso/del/file/protetto/da/sbloccare"

oppure per lanciare un comando bash che necessita di sudo:

Shell "echo MIA-PASSWORD | sudo -S comando-da-lanciare"

Esempio:

Public Sub Main()

 Dim fl As File

 Shell "echo MIA-PASSWORD | sudo -S chmod 666 '/dev/tty0'"
 
 Repeat
   Wait 0.01
 Until Stat("/dev/tty0").Auth = "rw-rw-rw-"

 fl = Open "/dev/tty0" For Write

 fl.Close

End

o anche usando la funzione "Access()":

 Public Sub Main()

 Dim fl As File
 
 Shell "echo MIA-PASSWORD | sudo -S chmod 666 '/dev/tty0'"
 
 Repeat
   Wait 0.01
 Until Access("/dev/tty0", gb.Write)

 fl = Open "/dev/tty0" For Write
 
 fl.Close

End

oppure più semplicemente ponendo Wait a destra dell'istruzione con Shell:

Public Sub Main()

 Dim fl As File
 
 Shell "echo mia_password | sudo -S chmod 666 '/dev/tty0'" Wait
 
 fl = Open "/dev/tty0" For Write

 fl.Close

End

Vediamo ora un semplice esempio, nel quale si porrà il comando Input seguito da una semplice variabile di tipo Stringa, che dovrà contenere la pasword immessa nello spazio sottostante la console del progetto, oppure nel Terminale. La funzione Input bloccherà lo scorrimento del programma sino a quando non sarà stata immessa ed inviata la nostra password per sbloccare un file-device, assegnando così i permessi di lettura e scrittura ai tre gruppi:

Public Sub Main()
 
 Dim s As String
 
 Input s
   
 Shell "echo " & s & " | sudo -S chmod 666 /dev/tty0"
  
End


Lanciare i comandi bash senza uso di Shell

E' possibile lanciare i comandi bash senza l'uso della funzione Shell di Gambas, ma utilizzando la funzione esterna "system()", dichiarata nel file header di sistema /usr/include/stdlib.h, la quale passa il nome del comando o del programma specificato perché sia eseguito.

Di seguito mostriamo un esempio con sudo:

Library "libc:6"

' int system (const char *__command)
' Execute the given line as a shell command.
Private Extern system_C(__command As String) As Integer Exec "system"


Public Sub Main()
 
 Dim i As Integer
  
' Con il parametro -S (maiuscolo) non verrà richiesta l'immissione la password da Console o Terminale.
' Con il parametro -s (minuscolo) verrà, invece, comunque richiesta l'immissione la password da Console o Terminale.
 i = system_C("echo 'MIA_PASSWORD' | sudo -S chmod 666 /dev/tty0")
 If i < 0 Then Error.Raise("Impossibile lanciare il comando !")
  
End


Note

[1] Va sottolineato che il comando chmod andrà scritto tutto in minuscolo !

[2] Come impostare il valore per cambiare i permessi dei file con chmod: chmod può prendere argomenti del tipo alfabetico, ad esempio, g + wr, u + x, a-w, laddove:

a = all (ossia per tutte e tre le classi: proprietario del file, gruppo, altri);
o = "others" (altri);
g = "group" (gruppo)
u = "user" (proprietario)

r = lettura
w = scrittura
x = esecuzione

È possibile utilizzare l'operatore - per rimuovere un privilegio, per esempio, a-w rimuove il permesso di scrittura per tutti;
È possibile utilizzare l'operatore + per aggiungere un privilegio, ad esempio, g+w aggiunge permessi di scrittura per il gruppo;
È possibile utilizzare l'operatore = per impostare il privilegio in modo identico per , ad esempio, a=rw imposterà il permesso di [rw-rw-rw-]


chmod può anche assumere argomenti numerici di "modalità" (mode), che così rappresentiamo: nnn
laddove:
- il primo numero è la modalità per il proprietario del file;
- il secondo numero è la modalità per il gruppo;
- il terzo numero è la modalità per ogni altro utente.

Per specificare i permessi attribuiti a ciascuna delle predette tre modalità, viene assegnato dato dalla eventuale somma dei seguenti numeri:

4 = lettura
2 = scrittura
1 = esecuzione


Così, ad esempio 765 significa:
alla classe "proprietario" sono modificati i permessi attribuendo: 4 (lettura) + 2 (scrittura) + 1 (esecuzione) = 7 (sono, dunque, modificati tutti e tre i permessi)
alla classe "gruppo" sono sono modificati i permessi attribuendo: 4 (lettura) + 2 (scrittura) + 0 (esecuzione) = 6 (assegnando 0 al permesso per l'esecuzione, esso viene negato)
alla classe "altri" sono sono modificati i permessi attribuendo: 4 (lettura) + 0 (scrittura) + 1 (esecuzione) = 5 (assegnando 0 al permesso per la scrittura, esso viene negato)

Assegnando ad una classe utente del file il valore 0 (zero) per i tre permessi, viene negata alla classe ovviamente ogni tipo di permesso.
Esempi:
000 nega ogni permesso a tutte e tre le classi di utenti;
604 nega ogni permesso alla sola classe "gruppo";
700 nega ogni permesso alle classi "gruppo" ed "altri".