Autore Topic: Comunicare con il Terminale  (Letto 1139 volte)

Offline Ferdinando88

  • Gamberetto
  • *
  • Post: 44
    • Mostra profilo
Comunicare con il Terminale
« il: 04 Aprile 2012, 08:28:04 »
Buon giorno a tutti :-)

Vorrei sapere se esiste un modo di inviare comandi al terminale da un interfaccia gambas  ???

Ho capito per esempio che se voglio installare supertuxkart faccio

SHELL "gnome-terminal -e 'sudo apt-get install supertuxkart'"

però vorrei che inviasse anche la password e y

come faccio ?
« Ultima modifica: 04 Aprile 2012, 08:59:06 da Ferdinando88 »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Comunicare con il Terminale
« Risposta #1 il: 04 Aprile 2012, 17:57:04 »
per inviare dati al terminale devi avviare shell come processo e quindi instradare l' output sul processo, se vuoi sul forum trovi molti messaggi in proposito.
però nel tuo caso non funziona perchè sudo non ti lascia fisicamente il tempo di inviare la password al processo.

se stai creando un programma che installa vari programmi ti conviene lanciarlo direttamente da root .

in alternativa io usavo questo codice in un mio programa per uso personale:

Codice: [Seleziona]
SHELL "echo " & pass & " | sudo -S shutdown  -h -P -v now"

dove pass contiene la password di root, modificatelo secondo le tue esigenze , ma sappi che non è molto bello come metodo

Offline alcresio

  • Grande Gambero
  • ***
  • Post: 100
    • Mostra profilo
Re: Comunicare con il Terminale
« Risposta #2 il: 11 Aprile 2012, 00:08:33 »
bhe! se vuoi una cosa davvero zozza, ma funzionante potresti creare uno script expect da codice, renderlo eseguibile e lanciarlo....
sono daccordo che non è elegante, ma quando devi avere a che fare con la shell l'eleganza non conta molto, secondo me conta l'efficenza...
 esempio:per scaricare via scp dei brani che ho sul server MPD in una "mdpstation"

    hFile = Open TmpScript For Output Create
    Print #hFile, "#!/usr/bin/expect"
    Print #hFile, "set Sorg " & Quote(Track)
    Print #hFile, "set Dest " & Quote(Dest)
    Print #hFile, "set timeout " & Quote("-1")
    Print #hFile, "set Pass " & Quote(SshPass)
    Print #hFile, "spawn /usr/bin/scp -P " & SshPort & " " & SshUser & "@" & Host & ":$Sorg $Dest"
    Print #hFile, "expect {"
    Print #hFile, "password: {send  " & Quote("$Pass\r") & "; exp_continue}"
    Print #hFile, "}"
    hFile.Close
    Shell "chmod +x " & TmpScript Wait   
    Exec [TmpScript] Wait For Read As "Execution"

ho usato exec as Execution per poter monitorare l'esecuzione dello script... quando lo script ha finito, volendo puoi killare il file che hai creato a run time...
per la password, scriverla in chiaro su di un file non è buona cosa, specie se è quella di root, così come non è bello scriverla nel sorgente... vedi un pochino te cosa ti conviene...

se vuoi visualizzare lo stato di avanzamento del tuo script in Execution_read puoi mettere del codice che ti faccia avanzare una prograssbar o quello che più ti aggrada...

non è elegante, lo ripeto, ma è davvero efficace!



Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.721
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comunicare con il Terminale
« Risposta #3 il: 22 Febbraio 2013, 23:43:11 »
però nel tuo caso non funziona perchè sudo non ti lascia fisicamente il tempo di inviare la password al processo.



bhe! se vuoi una cosa davvero... allucinante, potresti provare questo brivido   :-X
Codice: gambas [Seleziona]

'' E' necessario aver attivato il componente: "gb.desktop",
'' ed aver installato nel sistema il programma "x-term".
Public Sub Form_Open()

  Dim s As String

' Intendo avviare il tuo comando di prima come "root":
   Desktop.RunAsRoot("apt-get install supertuxkart")
  
' 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 "xdg-su",....
        If File.Load("/proc" &/ s &/ "comm") Like "*xdg-su*" Then

'...allora avvio il ciclo
          Do
             Wait 0.01
'...che gira, gira e rigira in attesa fino a quando
' il processo di "xdg-su" non è stato terminato:
          Loop 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

« Ultima modifica: 24 Febbraio 2013, 00:59:24 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »