Differenze tra le versioni di "Inserire le password per lanciare comandi"
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 modalità. | ||
=Utilizzo della funzione Gambas: ''Desktop.RunAsRoot''= | =Utilizzo della funzione Gambas: ''Desktop.RunAsRoot''= | ||
Riga 15: | Riga 14: | ||
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. | ||
Riga 38: | Riga 36: | ||
'''End''' | '''End''' | ||
− | |||
'''Public''' Sub File_Read() | '''Public''' Sub File_Read() | ||
Riga 49: | Riga 46: | ||
'''End''' | '''End''' | ||
− | |||
===Attendere sino a quando non è stata immessa la password=== | ===Attendere sino a quando non è stata immessa la password=== | ||
Riga 88: | Riga 84: | ||
'''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=== | ||
Riga 114: | Riga 109: | ||
'''End''' | '''End''' | ||
− | |||
'''Public''' Sub pro_Read() | '''Public''' Sub pro_Read() | ||
Riga 125: | Riga 119: | ||
'''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 '' | + | ==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: | 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 | + | Shell "xterm -e sudo '<I>comando_da_lanciare</i>'" |
− | <FONT color=#006400>' ''oppure | + | <FONT color=#006400>' ''oppure usando "x-terminal-emulator":''</font> |
− | <B | + | <B>Shell "/usr/bin/x-terminal-emulator -e sudo '<I>comando_da_lanciare</i>'"</b></font> |
'''End''' | '''End''' | ||
− | + | L'eventuale stampa dei dati di risultato del comando lanciato, però si avranno all'interno della finestra del terminale. | |
− | Shell "xterm -e | + | <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 | + | Private fl As File |
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
− | + | fl = Open "<FONT Color=gray>''/percorso/del/file/d'appoggio''</font>" For Read Watch | |
− | Shell "xterm -e | + | 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> |
− | < | + | <FONT Color=gray>'<B>Shell "/usr/bin/x-terminal-emulator -e sudo '<I>comando_da_lanciare</i>'" <FONT color=#B22222><B>></b> ''/percorso/del/file/d'appoggio''</font>" |
'''End''' | '''End''' | ||
− | |||
'''Public''' Sub File_Read() | '''Public''' Sub File_Read() | ||
Riga 161: | Riga 154: | ||
Dim s As String | Dim s As String | ||
− | s = File.Load("'' | + | s = File.Load("<FONT Color=gray>''/percorso/del/file/d'appoggio''</font>") |
Print s | Print s | ||
Riga 167: | Riga 160: | ||
'''End''' | '''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==== |
− | |||
− | |||
− | ===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 | + | Shell "xterm -e sudo chmod 666 <FONT Color=gray>''/percorso/del/file/protetto/da/sbloccare''</font>" |
− | oppure | + | oppure richiamando "x-terminal-emulator": |
− | Shell " | + | 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 | + | 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. |
− | + | ====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". | ||
<BR>Per sbloccare un file protetto: | <BR>Per sbloccare un file protetto: | ||
− | Shell "echo <FONT Color=gray>'' | + | Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 4777 <FONT Color=gray>''file-protetto-da-sbloccare''</font>" |
oppure per lanciare un comando ''bash'' che necessita di ''sudo'': | oppure per lanciare un comando ''bash'' che necessita di ''sudo'': | ||
− | Shell "echo <FONT Color=gray>'' | + | Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S <FONT Color=gray>''comando-da-lanciare''</font>" |
Esempio: | Esempio: | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Dim fl As File | Dim fl As File | ||
− | + | ||
− | Shell "echo <FONT Color=gray>'' | + | Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 4777 '/dev/tty0'" |
Repeat | Repeat | ||
Riga 206: | Riga 197: | ||
Dim fl As File | Dim fl As File | ||
− | Shell "echo <FONT Color=gray>'' | + | Shell "echo <FONT Color=gray>''MIA-PASSWORD''</font> | sudo -S chmod 666 '/dev/tty0'" |
Repeat | Repeat | ||
Riga 222: | Riga 213: | ||
Dim fl As File | Dim fl As File | ||
− | Shell "echo <FONT Color=gray>''mia_password''</font> | sudo -S chmod | + | 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 | ||
Riga 236: | Riga 227: | ||
Input s | Input s | ||
− | Shell "echo " & s & " | sudo -S chmod 666 /dev/ | + | Shell "echo " & s & " | sudo -S chmod 666 /dev/tty1" |
'''End''' | '''End''' |
Versione delle 16:30, 28 dic 2021
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à.
Indice
Utilizzo della funzione Gambas: Desktop.RunAsRoot
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.
Nelle parentesi va scritta fra virgolette 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 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 1 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 "pro" End Public Sub pro_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 "/usr/bin/x-terminal-emulator -e sudo 'comando_da_lanciare'"</font> 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 "/usr/bin/x-terminal-emulator -e sudo 'comando_da_lanciare'" <B>></b> /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 4777 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 4777 '/dev/tty0'" Repeat Wait 0.01 Until Stat("/dev/tty0").Auth = "rwsrwxrwx" 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.Read) fl = Open "/dev/tty0" For Write fl.Close End
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/tty1" 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 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".