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

Da Gambas-it.org - Wikipedia.
 
(28 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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 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".
<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.
 
<BR>Prendendo in considerazione l'esempio precedente:
 
Private fl As File
 
Private sFile As String
 
 
 
'''Public''' Sub Form_Open()
 
 
<FONT color=#006400>' ''Temp$() rappresenta il file temporaneo d'appoggio:''</font>
 
  sFile = Temp$()
 
 
  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>
 
  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:
 
<FONT color=#006400>' ''Restiamo in attesa sino a quando il file non sarà creato:''</font>
 
  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 
 
 
 
<FONT color=#006400>' ''Intendo avviare il comando come "root":''</font>
 
  Desktop.RunAsRoot("''linea_di_comando''") 
 
 
 
<FONT color=#006400>' ''Per ciascun processo in questo momento attivo...''</font>
 
  For Each s In Dir("/proc", "", gb.Directory) 
 
   
 
<FONT color=#006400>' ''...vado a vedere il file "comm":''</font>
 
    If Exist("/proc" &/ s &/ "comm") Then 
 
   
 
<FONT color=#006400>' ''Se in quel file c'è una stringa simile a "xterm",...''</font>
 
      If File.Load("/proc" &/ s &/ "comm") Like "*xterm*" Then 
 
     
 
<FONT color=#006400>' ''...allora avvio il ciclo,''</font>
 
        Repeat 
 
          Wait 0.01 
 
<FONT color=#006400>' ''...che gira in attesa fino a quando il processo di "xterm" non è stato terminato:''</font>
 
        Until Exist("/proc" &/ s) = False 
 
      Endif 
 
 
 
    Endif 
 
  Next 
 
 
 
<FONT color=#006400>' ''Allora sono sicuro che ho passato *innanzitutto* la password, e il comando bash dovrebbe così poter partire tranquillamente.''</font>
 
 
'''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 |[[#Note|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.
+
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:
Riga 98: Riga 23:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
  <FONT color=#006400>' ''Se il file non possiede i più ampi permessi...''</font>
+
  <FONT color=gray>' ''Se il file non possiede i più ampi permessi...''</font>
 
   If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then
 
   If Stat("/dev/input/mouse0").Auth <> "rwsrwxrwx" Then
  <FONT color=#006400>' ''...allora modificheremo in quel senso i permessi del file:''</font>
+
  <FONT color=gray>' ''...allora modificheremo in quel senso i permessi del file:''</font>
 
     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=gray>' ''Restiamo in attesa fino a che i permessi non vengono modificati, come desiderato:''</font>
 
     Repeat
 
     Repeat
 
       Wait 0.01
 
       Wait 0.01
Riga 110: Riga 35:
 
   Endif
 
   Endif
 
   
 
   
  <FONT color=#006400>' ''Modificati i permessi, passiamo, dunque, avanti per gestire il file:''</font>
+
  <FONT color=gray>' ''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 pro_Read()
+
  Public Sub Processo_Read()
 
    
 
    
 
   Dim b As Byte
 
   Dim b As Byte
Riga 124: Riga 49:
 
   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\""
 
 
 
<FONT color=#006400>' ''oppure anche con "x-terminal-emulator":''
 
  <B><I>Shell "/usr/bin/x-terminal-emulator -e su -c \"''comando_da_lanciare''\" \"$user\""</i></b></font>
 
 
'''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:
 
Shell "xterm -e su -c \"''comando_da_lanciare'' <FONT color=#B22222><B>></b> ''percorso_file_d'appoggio''</font>\" \"$user\""
 
e raccogliere successivamente i dati salvati nel file d'appoggio:
 
Private c As File
 
 
 
'''Public''' Sub Form_Open()
 
 
   
 
   
   c = Open "/tmp/c" For Read Watch
+
   Shell "xterm -e sudo <I>comando_da_lanciare</i>"
 
    
 
    
  Shell "xterm -e su -c \"''comando_da_lanciare'' > ''percorso_file_d'appoggio''\" \"$user\""
+
  <FONT color=gray>' ''oppure usando "x-terminal-emulator":''</font>
 
+
   <FONT Color=gray>'''Shell "x-terminal-emulator -e sudo <I>comando_da_lanciare</i>"'''</font>
  <FONT color=#006400>' ''oppure anche con "x-terminal-emulator":''
 
   <B><I>Shell "/usr/bin/x-terminal-emulator -e su -c \"''comando_da_lanciare'' > ''percorso_file_d'appoggio''\" \"$user\""</i></b></font>  
 
 
 
'''End'''
 
 
   
 
   
 +
<FONT color=gray>' ''oppure usando "terminator":''</font>
 +
  <FONT Color=gray>'''Shell "terminator -x sudo <I>comando_da_lanciare</i>"'''</font>
 
   
 
   
  '''Public''' Sub File_Read()
+
  End
 
  Dim s As String
 
 
 
  s = File.Load("''percorso_file_d'appoggio''")
 
 
 
  Print s
 
 
 
'''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 "sudo", ad esempio per ottenere libero accesso ai file-device.
+
L'immissione della propria password di root con "Shell" può servire anche - come è noto - ad esempio per cambiare i permessi dei ''file-device'', ottenendone così libero accesso.
  
===Lanciando "sudo" da un Terminale appositamente aperto
+
===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:
 
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 4777 ''file_protetto_da_sbloccare''"
+
  Shell "xterm -e sudo chmod 666 <FONT Color=darkgreen>''/percorso/del/file/protetto/da/sbloccare''</font>"
oppure se si vuole lanciare un comando che necessita dell'inserimento della parola-chiave:
+
oppure richiamando "x-terminal-emulator":
  Shell "xterm -e sudo ''comando_da_lanciare''"
+
  Shell "x-terminal-emulator -e sudo chmod 666 <FONT Color=darkgreen>''/percorso/del/file/protetto/da/sbloccare''</font>"
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.
+
o "terminator":
 +
Shell "terminator -x sudo chmod 666 <FONT Color=darkgreen>''/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.
  
===Senza far aprire la finestra del Terminale per l'inserimento della password===
+
===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":
+
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"; come quando si deve lanciare un comando ''bash'' che necessita di ''sudo'':
  Shell "echo <FONT Color=gray>''password''</font> | sudo -S chmod 4777 <FONT Color=gray>''file_protetto_da_sbloccare''</font>"
+
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S <FONT Color=gray>''comando-da-lanciare''</font>"
Esempio:
+
Ad esempio per sbloccare un file protetto:
  '''Public''' Sub Main()
+
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 <FONT Color=darkgreen>''/percorso/del/file/protetto/da/sbloccare''</font>"
 +
Mostriamo un esempio pratico:
 +
Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
+
   Shell "echo <FONT Color=gray>''mia_password''</font> | sudo -S chmod 4777 '/dev/tty0'"
+
   Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'"
 
+
 +
<FONT Color=gray>' ''Compie il ciclo, finché i permessi del file-device non sono cambiati:''</font>
 
   Repeat
 
   Repeat
 
     Wait 0.01
 
     Wait 0.01
   Loop Until Stat("/dev/tty0").Auth = "rwsrwxrwx"
+
   Until Stat("/dev/tty0").Auth = "rw-rw-rw-"
 
   
 
   
 
   fl = Open "/dev/tty0" For Write
 
   fl = Open "/dev/tty0" For Write
  If IsNull(fl) Then Error.Raise("Impossibile aprire il dispositivo '/dev/tty0' !")
 
 
   
 
   
  ......
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
o anche più semplicemente ponendo ''Wait'' a destra dell'istruzione con ''Shell'':
+
o anche usando la funzione "[https://gambaswiki.org/wiki/lang/access?l=it Access()]":
'''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim fl As File
 
   Dim fl As File
 
    
 
    
   Shell "echo <FONT Color=gray>''mia_password''</font> | sudo -S chmod 4777 '/dev/tty0'" <FONT color=#B22222>Wait</font>
+
   Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'"
 +
 +
<FONT Color=gray>' ''Compie il ciclo, finché i permessi del file-device non sono cambiati:''</font>
 +
  Repeat
 +
    Wait 0.01
 +
  Until <FONT color=#B22222>Access</font>("/dev/tty0", gb.Write)
 +
 +
  fl = Open "/dev/tty0" For Write
 +
 
 +
  fl.Close
 +
 +
End
 +
oppure, anziché un ciclo, più semplicemente ponendo "Wait" a destra dell'istruzione con ''Shell'':
 +
Public Sub Main()
 +
 +
  Dim fl As File
 +
 +
<FONT Color=gray>' ''Resta in attesa, finché i permessi del file-device non sono cambiati:''</font>
 +
  Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'" <FONT color=#B22222>Wait</font>
 
    
 
    
 
   fl = Open "/dev/tty0" For Write
 
   fl = Open "/dev/tty0" For Write
  If IsNull(fl) Then Error.Raise("Impossibile aprire il dispositivo '/dev/tty0' !")
 
 
   
 
   
  ......
+
  fl.Close
 
   
 
   
  '''End'''
+
  End
 
 
===Se è necessario usare la propria password di sistema===
 
Per lanciare, invece, un comando che necessita dell'inserimento della proprie parola-chiave di sistema, si inserirà la propria password di sistema dopo il comando "echo":
 
Shell "echo ''mia-password'' | sudo -S ''comando_da_lanciare''"
 
 
 
  
Vediamo un semplice esempio pratico, 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:
+
===Uso dell'istruzione ''Input'' per passare la password===
  '''Public''' Sub Main()
+
Si potrà usare l'istruzione ''Input'' seguita da una semplice variabile di tipo ''Stringa'', che dovrà contenere la password immessa nello spazio sottostante la console del progetto, oppure nel Terminale.
 +
<BR>L'istruzione ''Input'' bloccherà lo scorrimento del programma sino a quando non sarà stata immessa, come prima descritto, e inviata (premendo il tasto "Invio" della tastiera) la nostra password:
 +
  Public Sub Main()
 
    
 
    
 
   Dim s As String
 
   Dim s As String
Riga 224: Riga 142:
 
   Input s
 
   Input s
 
      
 
      
   Shell "echo " & s & " | sudo -S chmod 666 /dev/tty2" Wait
+
   Shell "echo " & s & " | sudo -S chmod 666 /dev/tty0"
 
    
 
    
  '''End'''
+
  End
 +
 
 +
===Uso del Controllo grafico ''InputBox'' per passare la password===
 +
In ambiente grafico si potrà usare il Controllo ''InputBox'':
 +
  Dim s As String
 +
 
 +
  s = InputBox("Inserire la propria password...")
 +
   
 +
  Shell "echo " & s & " | sudo -S chmod 666 /dev/tty0"
  
  
 
=Lanciare i comandi ''bash'' senza uso di Shell=
 
=Lanciare i comandi ''bash'' senza uso di Shell=
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'', oppure alcune funzioni esterne dal API di ''libgksu2'' .
+
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.
 
 
 
 
 
 
==Uso della funzione esterna ''system( )''==
 
La funzione esterna ''system( )'' è dichiarata nel file header di sistema ''/usr/include/stdlib.h'' e passa il nome del comando o del programma specificato per eseguito.
 
  
 
Di seguito mostriamo un esempio con ''sudo'':
 
Di seguito mostriamo un esempio con ''sudo'':
Riga 245: Riga 166:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
   i = system_C("echo '<FONT Color=gray>''MIA_PASSWORD''</font>' | sudo -S chmod 666 /dev/tty0")
+
<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 !")
 
   If i < 0 Then Error.Raise("Impossibile lanciare il comando !")
 
    
 
    
  '''End'''
+
  End
 
 
 
 
==Uso delle risorse del API di ''libgksu2''==
 
La libreria ''libgksu2'' fornisce le funzionalità di "su" e di "sudo" all'utente. <SUP>[ [[#Note|Nota 3]] ]</sup>
 
 
 
Le risorse ; pertanto sarà necessario richiamare le seguenti librerie dinamiche condivise:
 
* "''libgtk-x11-2.0.so.0.2400.23''"
 
* "''libgksu2.so.0.0.2''"
 
 
 
 
 
Possiamo utilizzare due codici che mostriamo di seguito.
 
 
 
===1<SUP>a</sup> modalità===
 
Questa modalità richiederà di inserire la propria password ll'interno della console/Terminale:
 
Library "libgtk-x11-2.0:0.2400.23"
 
 
<FONT Color=gray>' ''void gtk_init (int *argc, char ***argv)''
 
' ''Initialize everything needed to operate the toolkit.''</font>
 
Private Extern gtk_init(argc As Pointer, argv As Pointer)
 
 
Library "libgksu2:0.0.2"
 
 
Public Struct GksuContext
 
  xauth As Pointer
 
  dirp As Pointer
 
  display As Pointer
 
  sudo_mode As Boolean
 
  gconf_client As Pointer
 
  userp As Pointer
 
  command As Pointer
 
  login_shell As Boolean
 
  keep_env As Boolean
 
  description As Pointer
 
  message As Pointer
 
  alert As Pointer
 
  grab As Boolean
 
  always_ask_password As Boolean
 
  sn_context As Pointer
 
  sn_id As Pointer
 
  ref_count As Integer
 
  debugb As Boolean
 
End Struct
 
 
<FONT Color=gray>' ''GksuContext* gksu_context_new (void)''</font>
 
Private Extern gksu_context_new() As Pointer
 
 
<FONT Color=gray>' ''gboolean gksu_sudo_full (GksuContext *context, GksuAskPassFunc ask_pass, gpointer ask_pass_data, GksuPassNotNeededFunc pass_not_needed, gpointer pass_not_needed_data, GError **error)''</font>
 
Private Extern gksu_su_full(context As GksuContext, ask_pass As Pointer, ask_pass_data As Pointer, pass_not_needed As Pointer, pass_not_needed_data As Pointer, GError As Pointer) As Boolean
 
 
 
Library "libc:6"
 
 
<FONT Color=gray>' ''char *getpass (const char *__prompt)''
 
' ''Prompt with PROMPT and read a string from the terminal without echoing.''</font>
 
Private Extern getpass(__prompt As String) As String
 
 
 
'''Public''' Sub Main()
 
 
 
  Dim cntxt As GksuContext
 
 
 
  gtk_init(0, 0)
 
 
 
  cntxt = gksu_context_new()
 
   
 
  With cntxt
 
    .debugb = False
 
    .command = Alloc("chmod 666 /dev/tty9")
 
  End With
 
   
 
  gksu_su_full(cntxt, su_ask_pass, 0, 0, 0, 0)
 
   
 
  Free(Object.Address(cntxt))
 
 
 
'''End'''
 
 
 
'''Private''' Function su_ask_pass(ct As Pointer, prompt As String, data As Pointer, GError As Pointer) As String
 
 
 
  Return getpass("Inserire la propria password: ")
 
 
 
'''End'''
 
 
 
 
 
===2<SUP>a</sup> modalità===
 
Quest'altra modalità determinerà l'apertura di un'apposita finestra, nella quale si dovrà inserire la propria password:
 
Library "libgtk-x11-2.0:0.2400.23"
 
 
<FONT Color=gray>' ''void gtk_init (int *argc, char ***argv)''
 
' ''Initialize everything needed to operate the toolkit.''</font>
 
Private Extern gtk_init(argc As Pointer, argv As Pointer)
 
 
 
Library "libgksu2:0.0.2"
 
 
<FONT Color=gray>' ''gboolean gksu_sudo (gchar *command_line, GError **error)''</font>
 
Private Extern gksu_su(command_line As String, GError As Pointer) As Boolean
 
 
 
'''Public''' Sub Main()
 
 
 
  Dim bo As Boolean
 
 
 
  gtk_init(0, 0)
 
 
 
  bo = gksu_su("chmod 666 /dev/tty1", 0)
 
  If bo = False Then Error.Raise("Errore alla funzione 'gksu_sudo()' !")
 
 
 
'''End'''
 
  
  
Riga 403: Riga 217:
 
<BR> 604 nega ogni permesso alla sola classe "gruppo";
 
<BR> 604 nega ogni permesso alla sola classe "gruppo";
 
<BR> 700 nega ogni permesso alle classi "gruppo" ed "altri".
 
<BR> 700 nega ogni permesso alle classi "gruppo" ed "altri".
 
 
[3] Per vedere le risorse della libreria ''libgksu2'': https://people.debian.org/~kov/gksu/reference/index.html
 

Versione attuale delle 14:28, 18 ott 2024

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".
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")

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"

' oppure usando "terminator":
 Shell "terminator -x sudo comando_da_lanciare"

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 cambiare i permessi dei file-device, ottenendone così libero accesso.

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"

o "terminator":

Shell "terminator -x 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"; come quando si deve lanciare un comando bash che necessita di sudo:

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

Ad esempio per sbloccare un file protetto:

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

Mostriamo un esempio pratico:

Public Sub Main()

 Dim fl As File

 Shell "echo MIA-PASSWORD | sudo -S chmod 666 '/dev/tty0'"

' Compie il ciclo, finché i permessi del file-device non sono cambiati:
 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'"

' Compie il ciclo, finché i permessi del file-device non sono cambiati:
 Repeat
   Wait 0.01
 Until Access("/dev/tty0", gb.Write)

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

End

oppure, anziché un ciclo, più semplicemente ponendo "Wait" a destra dell'istruzione con Shell:

Public Sub Main()

 Dim fl As File

' Resta in attesa, finché i permessi del file-device non sono cambiati:
 Shell "echo MIA-PASSWORD | sudo -S chmod 666 '/dev/tty0'" Wait
 
 fl = Open "/dev/tty0" For Write

 fl.Close

End

Uso dell'istruzione Input per passare la password

Si potrà usare l'istruzione Input seguita da una semplice variabile di tipo Stringa, che dovrà contenere la password immessa nello spazio sottostante la console del progetto, oppure nel Terminale.
L'istruzione Input bloccherà lo scorrimento del programma sino a quando non sarà stata immessa, come prima descritto, e inviata (premendo il tasto "Invio" della tastiera) la nostra password:

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

Uso del Controllo grafico InputBox per passare la password

In ambiente grafico si potrà usare il Controllo InputBox:

 Dim s As String
 
 s = InputBox("Inserire la propria password...")
   
 Shell "echo " & s & " | sudo -S chmod 666 /dev/tty0"


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".