...intendo dire la seconda parte compresa nel sotto-paragrafo:
Senza far aprire la finestra del Terminale per l'inserimento della password
(in particolare vedi l'ultimo esempio del sotto-paragrafo)
Faccio qui un esempio semplicissimo con il quale si eliminerà (limitatamente alla corrente sessione) la protezione ad un paio di file-device:
Public Sub Button1_Click()
Dim s As String
' Il programma resta in attesa che venga scritta nella console ed inviata la password dell'utente:
Input s
Shell "echo " & s & " | sudo -S chmod 666 /dev/tty1 && sudo -S chmod 666 /dev/tty2" Wait
End
Non riesco a trovarlo nemmeno io, c'è un' altro modo ?
Probabilmente rimettere mano all'installazione di Gambas. Poiché, però, io utilizzo solo SVN/Trunk per l'installazione/aggiornamento di Gambas, lascerei ad altri - ad esempio Gianluigi (http://www.astronomia.com/forum/images/smilies/customsmilies/whistling.gif) - l'opinione al riguardo e gli eventuali utili suggerimenti sul da farsi.
Non so che tipo di installazione ha fatto Andreone, se ha un sistema Ubuntu like posso dare una mano.
Le librerie che funzionano su Ubuntu 16.04 sono:
build-essential g++ automake autoconf libtool libbz2-dev libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-9.5 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsage-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libesd0-dev libdirectfb-dev libxtst-dev libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev libglew1.6-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgnome-keyring-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl0-dev libncurses5-dev libgmime-2.6-dev llvm-3.5-dev libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libqt5opengl5-dev libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev
Da gestore applicazioni o selezionato i pacchetti di gambas 3, tutti
Fai questo:
Apri Gambas e clicchi sul punto interrogativo dal menu clicchi su System information e posti qui il risultato fra i cancelletti di code ;D
:ciao:
[System]
Gambas=3.8.4
OperatingSystem=Linux
Kernel=4.4.0-31-generic
Architecture=x86_64
Distribution=Linux Mint 18 Sarah
Desktop=MATE
Theme=Gtk
Language=it_IT.UTF-8
Memory=3823M
[Libraries]
Cairo=libcairo.so.2.11400.6
Curl=libcurl.so.4.4.0
DBus=libdbus-1.so.3.14.6
GStreamer=libgstreamer-0.10.so.0.30.0
GStreamer=libgstreamer-1.0.so.0.802.0
GTK+2=libgtk-x11-2.0.so.0.2400.30
GTK+3=libgtk-3.so.0.1800.9
OpenGL=libGL.so.1.2.0
Poppler=libpoppler.so.58.0.0
QT4=libQtCore.so.4.8.7
QT5=libQt5Core.so.5.5.1
SDL=libSDL-1.2.so.0.11.4
[Environment]
CLUTTER_BACKEND=x11
COMPIZ_CONFIG_PROFILE=mate
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Ex7JIEfCmq,guid=31710eff7b748b9c74920859579ed956
DEFAULTS_PATH=/usr/share/gconf/mate.default.path
DESKTOP_SESSION=mate
DISPLAY=:0
GB_GUI=gb.qt5
GDMSESSION=mate
GDM_XSERVER_LOCATION=local
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/gambas3.desktop
GIO_LAUNCHED_DESKTOP_FILE_PID=20583
GTK_MODULES=gail:atk-bridge
GTK_OVERLAY_SCROLLING=0
HOME=<home>
LANG=it_IT.UTF-8
LOGNAME=<user>
MANDATORY_PATH=/usr/share/gconf/mate.mandatory.path
MATE_DESKTOP_SESSION_ID=this-is-deprecated
MDMSESSION=mate
MDM_LANG=it_IT.UTF-8
MDM_XSERVER_LOCATION=local
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
PWD=<home>
QT_ACCESSIBILITY=1
QT_IM_MODULE=compose
QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
QT_STYLE_OVERRIDE=gtk
SESSION_MANAGER=local/<hostname>:@/tmp/.ICE-unix/3532,unix/<hostname>:/tmp/.ICE-unix/3532
SHELL=/bin/bash
SSH_AGENT_PID=3600
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
TZ=:/etc/localtime
USER=<user>
USERNAME=<user>
WINDOWPATH=7
XAUTHORITY=<home>/.Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-mate:/etc/xdg
XDG_CURRENT_DESKTOP=MATE
XDG_DATA_DIRS=/usr/share/mate:/usr/local/share/:/usr/share/:/usr/share/mdm/
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SESSION_COOKIE=4603ef0b0eb640e2836974a04d12e5ab-1470028117.859652-1916993872
XDG_SESSION_DESKTOP=mate
XDG_SESSION_ID=c1
XDG_VTNR=7
1) Si
2) Si
???
Sarà che non sono riuscito io a spiegarmi, ma - se rileggi bene quanto avevo scritto - le due circostanze sono diverse: o segui una o segui l'altra.
Aggiungo che la mia proposta di utilizzare le risorse del Componente gb.form.terminal era determinata solo e semplicemente dal fatto che prooobabilmente potresti trovarti più agevolato nel gestire il tutto con il simil-Terminale messo a disposizione da quel Componente.
Circa l'assenza da te segnalata del Componente gb.form.terminal nel tuo sistema, ho posto la questione nel forum spagnolo:
https://www.gambas-es.org/viewtopic.php?f=2&t=5687
come puoi vedere è stato risposto che quel Componente - attualmente - è presente soltanto nella versione scaricata via SVN (come faccio io).
Torno - comunque - a ribadire che devi anche affrontare il problema di come intercettare i dati testuali povenienti dal processo in atto dei due comandi che tu vuoi utilizzare con Shell per l'aggiornamento !!!
Dim S As String
Dim prova As String
S = InputBox("Immetti password di root")
prova = Shell "echo " & S & " | sudo -S apt-get update && sudo -S apt-get upgrade" For Write
Label2.text = prova
C'è qualche cosa che non và
Dim S As String
Dim prova As String
S = InputBox("Immetti password di root")
prova = Shell "echo " & S & " | sudo -S apt-get update && sudo -S apt-get upgrade" For Write
Label2.text = prova
C'è qualche cosa che non và
1) Shell non ritorna una Stringa, bensì una variabile di tipo Process, quale handle per gestire il processo del comando avviato.
Per raccogliere direttamente un risultato testuale come unica stringa derivante da un comando, lanciato con Shell, solitamente si fa così:
Shell "nome_comando" To variabile_di_tipo_string
reindirizza il risultato alla variabile di tipo stringa.
Ma non credo che questo possa fare il caso tuo, perché le stringhe restituite saranno molteplici fino alla fine dell'aggiornamento di Lunux.
2) For Write significa che tu intendi scrivere nel flusso che gestisce il processo del comando avviato da Shell (......ed invece tu devi leggere da lì, perché i dati provengono dal flusso del processo);
3) .....ti avevo posto su un piatto d'argento un semplice codice esemplificativo che poteva farti da guida, ma sembra che tu non lo sia andato a vedere.
Ad ogni modo ricorda che la gestione dei dati da e verso un Terminale o console è in sé materia abbastanza complessa: (http://forum.ubuntu-it.org/images/smilies/sisi.gif)
http://www.gambas-it.org/wiki/index.php?title=Guide_della_comunit%C3%A0#Terminale_-_Console_IDE_Gambas
Se è una materia molto complessa ce un modo di aggiornare da gambas la versione di linux senza usare i comandi apt-get update ed apt-get upgrade ?
La tua idea di utilizzare quei due comandi è corretta.... scusa, insomma, puoi testare innanzitutto il seguente codice ?
Private pr As Process
Public Sub Button1_Click()
Dim root As String
root = InputBox("Immetti password di root")
' Lanciamo con Shell i due comandi, e ne poniamo in osservazione in lettura il processo: '
pr = Shell "echo " & root & " | sudo -S apt-get update && sudo -S apt-get upgrade" For Input As "Osserva"
End
Public Sub Osserva_Read()
Print pr.ReadLine()
End
.... però voglio che
Quando clicco sull' eseguibile mi apre il terminale e non devo lanciare il programma dal terminale
Dunque... possiamo esperire almeno due modalità.
1) la prima modalità (anche se è un po' farraginosa) prevede che siano attivati i Componenti gb.desktop e gb.desktop.x11:
Public Sub Form_Open()
Shell "gnome-terminal"
End
Public Sub Button1_Click()
Dim root As String
Dim c As Integer[]
root = InputBox("Immetti password di root")
' Trova l'identificativo della finestra del Terminale aperta prima.
' Nel metodo "FindWindow()" inseriamo il nome della finestra del Terminale: '
c = Desktop.FindWindow("Termin*")
If c.Count > 0 Then
' Attribuisce il "Focus" alla finestra del Terminale: '
Desktop.ActiveWindow = c[c.Max]
' Scrive nel Terminale l'intera riga di comndo e la lancia: '
Desktop.SendKeys("echo " & root & " | sudo -S apt-get update && sudo -S apt-get upgrade\n")
Endif
End
2) La seconda modalità prevede di far aprire un Terminale, lanciare i due comandi mediante la semplice Shell, e reindirizzare l'output al Terminale aperto inizialmente:
Private fl As File
Private pr As Process
Public Sub Form_Open()
Dim b As Byte
Dim pts, s As String
' Sollecitiamo l'apertura del Form e favoriamo la visibilità del Button:
Me.Show
Wait 0.3
pts = "/dev/pts"
' Verifichiamo innanzitutto quanti file 'pts' sono presenti in "/dev/pts": '
b = Dir(pts, Null, gb.Device).Count
' Apriamo il Terminale: '
Shell "gnome-terminal" Wait
' Restiamo in attesa che venga generato il file-device speciale del Terminale: '
Do
Wait 0.01
Loop Until b < Dir(pts, Null, gb.Device).Count
' L'ultimo file 'pts' creato è posizionato nel 1° elemento del vettore generato dalla funzione "Dir()": '
s = Dir(pts, Null, gb.Device)[0]
' Apriamo il file-device speciale del Terminale in lettura bufferizzata: '
fl = Open pts &/ s For Output
End
Public Sub Button1_Click()
Dim root As String
root = InputBox("Immetti password di root")
' Lanciamo con Shell i due comandi, e ne poniamo in osservazione in lettura il processo: '
pr = Shell "echo " & root & " | sudo -S apt-get update && sudo -S apt-get upgrade" For Input As "Osserva"
End
Public Sub Osserva_Read()
' Reindirizziamo l'output del processo verso il Terminale:
Output To #fl
Print pr.ReadLine()
End
Public Sub Form_Close()
' In caso di chiusura del Form, il file-device speciale viene chiuso ed il processo dei due comandi viene soppresso: '
fl.Close
pr.Kill
End