Gambas-it

Gambas3 => Programmazione => Topic aperto da: faustf - 07 Gennaio 2018, 16:20:26

Titolo: regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 07 Gennaio 2018, 16:20:26
Buon di a tutti
ho un testo fatto cosi
Codice: [Seleziona]
Starting Nmap 7.01 ( https://nmap.org ) at 2018-01-07 15:45 CET
Nmap scan report for 192.168.1.1
Host is up (0.014s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 00:A0:A2:A9:32:C8 (Digicom)

Nmap scan report for 192.168.1.25
Host is up (0.14s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.103
Host is up (0.18s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.105
Host is up (0.44s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.114
Host is up (0.21s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 30:10:B3:2A:18:33 (Liteon Technology)

Nmap scan report for 192.168.1.120
Host is up (0.17s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 10:60:4B:E0:B1:1C (Hewlett Packard)

Nmap scan report for 192.168.1.101
Host is up (0.00015s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server

Nmap done: 256 IP addresses (7 hosts up) scanned in 31.96 seconds

l idea è: voglio prendere i numeri ip e la penultima stringa di ogni blocco cioè 3389/tcp ..........
ho  fatto una cosa del genere per fare quanto detto
Codice: [Seleziona]
 rMatch = New RegExp(Result, "for\\d*.\\d*.\\d*.\\d*.\\d*")
    rMatchPort = New RegExp(Result, "3389/tcp .*")
ora gambas ovviamente prenderà solo il primo ip e il primo 3389/tcp
la domanda è: esiste un metodo che possa fare tipo un  globalmatch  di tutto e restituirmi  il tutto su un array ??
ho devo per forza di cose   mettere tutto in un ciclo ,  fare prima il compile e poi l exec ??
grazie a tutti


Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 07 Gennaio 2018, 17:05:30
Bada io non sono certo un esperto di RegExp, ma so che gb.pcre è basato sulla libreria pcre2 e qui trovi la documentazione (http://www.pcre.org/current/doc/html/pcre2syntax.html)

Credo comunque che tu debba seguire l'esempio della wiki di Gambas.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 07 Gennaio 2018, 19:22:23
avevo pensato anchio a quello ma infondo al cuore speravo fosse piu semplice  :D
ok  gli darò un occhiata
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 07 Gennaio 2018, 19:27:05
Non so se quanto riporto è un modo corretto di usare un suggerimento degli ideatori del componente, vedi tu se va bene. Ripeto io non sono esperto di espressioni regolari e mi sono basato su i tuoi pattern:

Codice: [Seleziona]
Public Sub Main()

  Dim sFile, sPat1, sPat2 As String
  Dim ss1, ss2 As String[]
  Dim i As Integer
  ' Ho copiato quello che hai postato in un file di testo sulla mia Scrivania
  ' comunque sia l'importante è che sFile contenga il testo da ciclare.'
  sFile = File.Load("~/Scrivania/Testo.text")
  sPat1 = "for +(\\d*.\\d*.\\d*.\\d*.\\d*)"
  sPat2 = "3389/tcp .*"
  ss1 = GRX(sPat1, sFile, 1)
  ss2 = GRX(sPat2, sFile, 0)
  If ss1.Count = ss2.Count Then
    For i = 0 To ss1.Max
      Print ss1[i]; " -- "; ss2[i]
    Next
  Endif
  '...'

End

Private Function GRX(pattern As String, subject As String, pos As Integer) As String[]

  Dim re As New Regexp
  Dim matches As New String[]
  Dim tmp As String

  tmp = subject
  re.Compile(pattern)
  re.Exec(tmp)
  Do While re.text <> ""
     matches.add(re[pos].text)
    tmp = Mid(tmp, re.offset + 2)
    re.Exec(tmp)
  Loop
  Return matches

End

 :ciao:

P.S. Così è meglio
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 07 Gennaio 2018, 20:52:24
l idea è: voglio prendere i numeri ip e la penultima stringa di ogni blocco cioè 3389/tcp ..........

Poiché v'è una sequenza costante delle righe, io proverei ad utilizzare la funzione nativa "Scan( )" all'interno di un ciclo.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 08 Gennaio 2018, 01:43:20
il problema  è il ciclo  che è variabile dipende dalla rete che hai  quindi come fai a  dirgli sacansiona dall inizio alla fine ???
piu  mi sbatto con gambas e  piu mi  piglia male  sarò  sincero ,   mi  piacerebbe  imparare a programmare con linux ma mi rendo conto che ha  degli strumenti di sviluppo veramente rudimentali non so come facciano a svilupparci sopra , riconosco che chi lo fa è  un genio e un eroe  allo steso tempo  ,  parlo in senso generale , ho provato perl  ed  era ottimo come linguaggio il problema è  le gui , per interfacciarlo  , prima devi costruire una  gui con glade , che  è  un inferno in terra , per via dei container (di m....) allora mi son detto troviamo un  linguaggio semplice ma che abbia per lo meno la possibilita di disegnare le gui , e sto provando gambas , ( e  già se usi ad esempio un frame e ci metti dentro dei bottoni e provi a spostarlo non sposta i  bottoni e  li lascia dove sono) ,ma  va be  si può  soprassedere rispetto a glade-hell  va  bene lo stesso è già accettabile ma sta storia dele regexp mi cascano le braccia , ciò uno sconforto esagerato :rolleyes: :o ,  con  Autoit basta una linea di codice 
Codice: [Seleziona]
Local $aArray = StringRegExp('<test>a</test> <test>b</test> <test>c</Test>', '(?i)<test>(.*?)</test>', $STR_REGEXPARRAYFULLMATCH)
con  questo $STR_REGEXPARRAYFULLMATCH  lui sa che deve fare il lavoro globalmente  , tanto semplice spero che un giorno Benoît Minisini o chi per lui possa inserire un opzione del genere tutto il mondo gambas  gliene sarebbe grato ...... scusate per lo sfogo ,  ma in VB.net è uguale la cosa??? , ringrazio per la possibile soluzione  che studierò , e  mi studierò puer questo Scan per vedere  bene se può fare al caso
grazie ancora torno ad impazzire  notte a tutti
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 02:07:42
mi  piacerebbe  imparare a programmare con linux ma mi rendo conto che ha  degli strumenti di sviluppo veramente rudimentali non so come facciano a svilupparci sopra
Scusa la mia ignoranza al riguardo, ma quanti linguaggi di programmazione possono essere utilizzati in Linux ?
Io ho sentito dire (ma purtroppo non so se è vero) che in Linux si può programmare anche in C, C++, Java, Python, Ruby, LUA, MatLab, Lazarus, HTML. Io, però, sinceramente non sono la persona adatta per dire se questi linguaggi siano rudimentali o avanzati.



spero che un giorno Benoît Minisini o chi per lui possa inserire un opzione del genere
Iscrivendoti nella Mailing List internazionale ufficiale potrai tu stesso richiedergli quel tipo di soluzione.



il problema  è il ciclo  che è variabile dipende dalla rete che hai  quindi come fai a  dirgli sacansiona dall inizio alla fine ???
Partiamo da qui:
come ottieni quelle righe che hai inserito come esempio nel tuo primo messaggio sopra ?
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 08 Gennaio 2018, 09:58:57
il problema non è la  quantità di linguaggi o il inguaggio che usi è che alla fine  ti scontri sempre(se vuoi una GUI) con dei tools vedi glade o wxwidget , che fanno uso dei container , e per mettere una listview  un textbox e un bottone , come vuoi tu , devi smattare  4  giorni per poi accontentarti .

non credo mi considererà , ma mai dire mai :)

le righe le ottengo da nmap -T4 -p3389 192.168.1.1/24 , quindi dipende da quane macchine ho  accese o meno al momento della scansione sulla rete

Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 10:24:53
è che alla fine  ti scontri sempre(se vuoi una GUI) con dei tools
Forse dipende dalle librerie grafiche utilizzate.



le righe le ottengo da nmap -T4 -p3389 192.168.1.1/24 , quindi dipende da quane macchine ho  accese o meno al momento della scansione sulla rete
Hai fatto qualche esempio di prova con Gambas per ottenere quelle righe ?
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 08 Gennaio 2018, 11:03:02
il codice è
Codice: [Seleziona]
 Dim Result As String
  Dim GetwayIP As String
  Dim Getway As String
  Dim rMatch As RegExp
  Dim rMatchPort As RegExp
  Dim IP As String
  Dim Element As Integer
 
 If TextBox1.Text = "" Then
    Message.Error("Errore devi inserire la pass di root se vuoi che funzioni, Ciao!")
    Else
    Shell "(/sbin/ip route | awk '/default/ { print $3 }')" To GetwayIP
    Getway = Trim(GetwayIP)
     'Print Getway & "/24 "
     'Print "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 "
     
    Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 " To Result
    Print Result
   
    rMatch.Compile("for\\d*.\\d*.\\d*.\\d*.\\d*", RegExp.MultiLine)
    rMatch.Exec(Result)
   ' rMatch = New RegExp(Result, "for\\d*.\\d*.\\d*.\\d*.\\d*")
    rMatchPort = New RegExp(Result, "3389/tcp .*")
Print rMatch.Count

    For Each Element In rMatch
    ip = Left$(rMatch[Element].Text, -4)
   ' ip = Right$(ip, -1)
   
   
    If rMatchPort[Element].Text <> "3389/tcp closed ms-wbt-server" Then
       Print ip
    Endif
    Next

   ' Print ip & rMatchPort[0].Text
     
     
     
      'Print rMatch
  Endif
'
 
ma il  codice postato da  Gianluigi credo sia la "soluzione migliore" , anche se per fare una cosa che gli altri linguaggi impiegano due righe  ci tocca farne una biga in piu,   >:( :evil:
N.B: nel mio codice ho un errore null object , che bo
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 12:04:42
nel mio codice ho un errore null object
Dove con precisione ?
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 13:56:17
Ho scritto questo codice inserendo le tue righe in un file di testo:

Codice: [Seleziona]
Public Sub Main()

  Dim car As String
  Dim num, ss As String[]
  Dim b As Byte
 
' Carico il contenuto del file in una variabile stringa:
   car = File.Load("/tmp/a")
   
' Ciascuna riga del testo viene caricata in un distinto elemento di un vettore di tipo stringa:
   ss = Split(car, "\n")
   
' Individuo le righe utili e ne estrapolo i dati che mi interessano:
   For b = 1 To ss.max - 1 Step 3
     If ss[b] Begins "Nmap" Then
      Write Scan(ss[b], "*for *")[1]
     Else
      Write " - " & ss[b] & "\n"
     Endif
   Next

End
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 08 Gennaio 2018, 15:53:04
Io la so così ma non è che sia molto ferrato nel campo.
Le espressioni regolari hanno motivo di essere usate sulle grandi quantità di dati.
Altrimenti va benissimo qualunque sistema alternativo.
Nel concreto per estrarre qualche decina di dati il codice che ho postato è inutile ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.

 :ciao:
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 16:27:31
... ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.
Be', certo, il lavoro lo fai fare al C.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 08 Gennaio 2018, 16:35:39
... ma se si tratta di estrarne qualche migliaio o più allora ci si rende conto della differenza e della potenza delle regexp.
Be', certo, il lavoro lo fai fare al C.

Non voleva assolutissimamente essere una critica al tuo codice, molto interessante come al solito.  :)
E poi non so neanche se il mio codice sia valido dal punto di vista del componente gb.pcre 
Probabilmente c'è un'espressione per estrarre entrambi i dati nello stesso passaggio ma io ci capisco poco :-\
 :ciao:
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 08 Gennaio 2018, 16:52:18

Non voleva assolutissimamente essere una critica al tuo codice
Io notoriamente sono un coglione, ma in questo caso sapevo bene che, la tua, non era una critica.
Io stavo solo cercando di giustificare la velocità del procedimento di una funzione del Componente da te citato.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 08 Gennaio 2018, 17:05:26

Non voleva assolutissimamente essere una critica al tuo codice
Io notoriamente sono un coglione, ma in questo caso sapevo bene che, la tua, non era una critica.
Io stavo solo cercando di giustificare la velocità del procedimento di una funzione del Componente da te citato.

Il fatto è che con questi specifici codici in una molto empirica misurazione il tuo codice estrae 7000 voci 20 volte più velocemente del mio  ;D

Quindi se tu sei quello che sostieni e scrivi codice che fa le stesse cose del mio in un ventesimo di tempo io come mi devo considerare  :mad:


Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 09 Gennaio 2018, 10:36:59
sto provando ad usare  scan applicato al mio problema ,  se non ho capito male  scan dovrebbe  fare un po come le regexp  array=scan("testto","regexp per cercare"), quindi ho messo il seguente codice giusto per vedere se avevo capito 
Codice: [Seleziona]
   
  Dim rMatch As String[]

    Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 " To Result
    Print Result
    rMatch = Scan(Result, "Nmap")
    Print rMatch[0].Text
ma mi dice outofbound  dell array rMatch[0].Text , come senon trovasse nulla
è possibile???
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: Gianluigi - 09 Gennaio 2018, 11:12:32
è possibile???

Io direi che è certo  ;D
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 09 Gennaio 2018, 13:28:12
ma mi dice outofbound  dell array rMatch[0].Text , come senon trovasse nulla
è possibile???
...molto probabilmente stai usando male la sintassi di "Scan( )".

http://www.gambas-it.org/wiki/index.php?title=Scan
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 10 Gennaio 2018, 02:06:50
per non saper ne legere e ne scrivere , come si  dice dalle mie parti ho fato due cose
1 su un bottone  vuoto homesso l esempio da manuale
Codice: [Seleziona]
Public Sub Button2_Click()
 Dim s As String = "Scrivo una frase qualunque all'interno della quale devo trovare un riscontro"
  Dim ss As String[]
 
  ss = Split(s, " ")
  For Each s In ss
    If s Like "qual*" Then Print s
  Next



End
e  funziona
poi ho messo sul bottone  uno l esempio ma modificato leggermente (anche se non fa quello che deve fare solo per vedere se fa)
Codice: [Seleziona]
  Dim Result As String
  Dim GetwayIP As String
  Dim Getway As String
  Dim rMatch As String[]
  Dim rMatchPort As RegExp
  Dim IP As String
  Dim Element As Integer
 
 If TextBox1.Text = "" Then
    Message.Error("Errore devi inserire la pass di root se vuoi che funzioni, Ciao!")
    Else
    Shell "(/sbin/ip route | awk '/default/ { print $3 }')" To GetwayIP
    Getway = Trim(GetwayIP)
     'Print Getway & "/24 "
     'Print "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 "
     
    Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 " To Result
    Print Result
    'rMatch = Scan(Result, "Nmap")
    'Print rMatch[0].Text
     rMatch = Scan(Result, "* * * * * *")
      For Each Result In rMatch
    Print Result
     Print Result[0].Text
   
  Next
   
   
    'rMatch.Compile("for\\d*.\\d*.\\d*.\\d*.\\d*", RegExp.MultiLine)
    'rMatch.Exec(Result)
   ' rMatch = New RegExp(Result, "for\\d*.\\d*.\\d*.\\d*.\\d*")
    rMatchPort = New RegExp(Result, "3389/tcp .*")
Print rMatch.Count

    For Each Element In rMatch
    ip = Left$(rMatch[Element].Text, -4)
   ' ip = Right$(ip, -1)
   
   
    If rMatchPort[Element].Text <> "3389/tcp closed ms-wbt-server" Then
       Print ip
    Endif
    Next

   ' Print ip & rMatchPort[0].Text
     
     
     
      'Print rMatch
  Endif
'
 

End

Public Sub Button2_Click()
 Dim s As String = "Scrivo una frase qualunque all'interno della quale devo trovare un riscontro"
  Dim ss As String[]
 
  ss = Split(s, " ")
  For Each s In ss
    If s Like "qual*" Then Print s
  Next


ma non va e mi da     Print Result[0].Text  not en object
qualche idea??? io le ho finite , ma solo prerchè è tarda l ora
:D
notte
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 10 Gennaio 2018, 02:46:37
ma non va e mi da     Print Result[0].Text  not en object


Gambas non ti sta semplicemente lanciando un avviso di errore: ti dice in via generale anche il tipo di errore.
Quindi ogni avviso va letto in modo opportuno e con attenzione.

Nello specifico Gambas ti sta dicendo che "Result" non è un "Oggetto", dichiarato e creato nel tuo codice e appartenente a una "Classe".

...ed infatti l'identificatore "Result" a cosa si riferisce ? Come lo hai dichiarato ?
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 10 Gennaio 2018, 10:24:25
  Dim Result As String

l' ho dichiaratocome stringa  all inizio
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 10 Gennaio 2018, 16:31:14
  Dim Result As String

l' ho dichiaratocome stringa  all inizio

Appunto.
In Gambas la variabile (http://www.gambas-it.org/wiki/index.php?title=Le_Variabili) di un tipo fondamentale di dati ("atomico") non appartiene ad alcuna Classe (http://www.gambas-it.org/wiki/index.php?title=Gli_Oggetti_e_le_Classi), e pertanto non rappresenta alcun specifico Oggetto (http://www.gambas-it.org/wiki/index.php?title=Gli_Oggetti_e_le_Classi).
Dunque un tipo fondamentale di dati ("atomico") in Gambas non possiede Eventi (http://www.gambas-it.org/wiki/index.php?title=Gli_eventi), né Proprietà, né Metodi.


Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 11 Gennaio 2018, 00:40:39
quindi come dovrei fare per stampare il contenuto di result ??
perche se metto print result mi dice solo  6

 :rolleyes: :rolleyes: :rolleyes: ??? ???
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 11 Gennaio 2018, 01:36:44
se metto print result mi dice solo  6

Ossia, il risultato in console di Print Result, posto dopo la linea di comando Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 " To Result , e che dovrebbe corrispondere alle righe da te riportate nel tuo primo messaggio di questa discussione, è solamente il carattere del numero 6 ?

Io ho ripreso quelle tue righe del primo messaggio e le ho nuovamente inserite in un file di testo.
Quindi ho ricopiato parte del tuo ultimo codice:
Codice: [Seleziona]
Public Sub Main()

  Dim car, s As String
  Dim rMatch As String[]

   car = File.Load("/tmp/a")

  rMatch = Scan(car, "* * * * * *")
   
    For Each s In rMatch
      Print s
    Next

End
Ecco il risultato:

Starting
Nmap
7.01
(
https://nmap.org
) at 2018-01-07 15:45 CET
Nmap scan report for 192.168.1.1
Host is up (0.014s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 00:A0:A2:A9:32:C8 (Digicom)

Nmap scan report for 192.168.1.25
Host is up (0.14s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.103
Host is up (0.18s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.105
Host is up (0.44s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.114
Host is up (0.21s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 30:10:B3:2A:18:33 (Liteon Technology)

Nmap scan report for 192.168.1.120
Host is up (0.17s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 10:60:4B:E0:B1:1C (Hewlett Packard)

Nmap scan report for 192.168.1.101
Host is up (0.00015s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server

Nmap done: 256 IP addresses (7 hosts up) scanned in 31.96 seconds


Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 11 Gennaio 2018, 10:11:02
 :) hai ragione probabilmente facevo casino io  :2birre:
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 11 Gennaio 2018, 10:34:07
la  domanda di fondo adesso è perchè
se io imposto come dic il wiki
   rMatch = Scan(Result, "Nmap scan report for *")
lui non  ritorna nulla? ??
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 11 Gennaio 2018, 15:08:45
La composizione della stringa, da passare al secondo paramentro della funzione Scan( ), deve tenere in considerazione comunque l'intera stringa di caratteri passata al primo argomento attuale della funzione.

Quindi, se la stringa è ad esempio:
 Gambas non è un clone di VB
nel secondo parametro dovrò tenere conto dell'intera frase, e quindi ad esempio fare una cosa di questo genere:
 
Codice: [Seleziona]
ss = Scan("Gambas non è un clone di VB", "*un clone*")
Laddove il primo metacarattere dell'asterisco farà riferimento (ingloberà) la parte "Gambas non è " (ossia dal primo carattere della stringa) , e il secondo asterisco farà riferimento a "di VB" (ossia fino all'ultimo carattere della stringa).
Va fatto rilevare che le parti della stringa, presenti in modo esplicito (i caratteri "un clone " del nostro esempio) nel secondo argomento, non vengono memorizzate nella variabile vettoriale restituita dalla funzione Scan( ).

Al termine avremo il vettore ritornato e istanziato con soli due elementi (...ovviamente corrispondenti ai due asterischi):
  ss[0] --> Gambas non è
  ss[1] --> di VB
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 11 Gennaio 2018, 21:58:53
una cosa  che non mi è chiara ,su  http://www.gambas-it.org/wiki/index.php?title=Scan , fa vedere solo pattern con l' *.   o *parle
la domanda è ma  regexp non  se le cag.... ?? 
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 11 Gennaio 2018, 22:25:17
altra domanda  come  faccio a dirgli fino a fine riga nel pattern dello scan ?

esempio
volendo perndere l ip  di questa stringa
Nmap scan report for 192.168.1.101 metterò   (*for *)e poi cosa metto ?? per dirgli che basta catturare ?? 
se  volessi perndere scan   avrei fatto (Nmap * report)
grazie
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 11 Gennaio 2018, 23:51:30
la domanda è ma  regexp non  se le cag.... ??
Io non ho mai usato il Componente gb.pcre per le espressioni regolari, quindi non so dirti.

Ad ogni modo, gestire stringhe regolari è la cosa più semplice che esista.



altra domanda  come  faccio a dirgli fino a fine riga nel pattern dello scan ?

esempio
volendo perndere l ip  di questa stringa
Nmap scan report for 192.168.1.101 metterò   (*for *)e poi cosa metto ?? per dirgli che basta catturare ?? 
Il secondo asterisco ti raccoglie tutti i caratteri che vengono dopo il carattere dello spazio, che segue la parola "for", fino alla fine della stringa passata nel primo parametro attuale.
Se tu vuoi fermare la raccolta al primo carattere escape di ritorno a capo (espresso nel C con il valore esadecimale "0x0A" e in Gambas con "&h0A"), devi esplicitarlo nel modello-stringa, posto nel secondo parametro attuale.
Ciò però, come sappiamo, non è sufficiente, poiché dobbiamo nel secondo parametro di Scan( ) in fine aver raccolto l'intera stringa. Pertanto, avremo cura di aggiungere un asterisco dopo il carattere escape di fine riga-a capo ("\n").

Esempio pratico:
Codice: [Seleziona]
Public Sub Main()

  Print Scan("Nmap scan report for 192.168.1.101\n", "*for *\n*")[1]

End
(Ciò che a noi interessa, è il numero IP, che viene salvato dalla funzione Scan( ) nel secondo asterisco, il quale corrisponde all'indice 1 del vettore ritornato dalla funzione.)

Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 12 Gennaio 2018, 01:19:38
allora grazie per la spiegazione sei un mito , ma la storia dell' * a fine /n dove stava scritta ?? che io non  l ho propio vista  :'( :'(.
mettendo cosi
 rMatch = Scan(Result, "*for *\n") o cosi  rMatch = Scan(Result, "*for *\n*") o  rMatch = Scan(Result, "*for *")
il risultato è sempre cosi
Codice: [Seleziona]
Starting Nmap 7.01 ( https://nmap.org ) at 2018-01-12 01:14 CET
Nmap scan report
192.168.1.1
Host is up (0.0061s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 00:A0:A2:A9:32:C8 (Digicom)

Nmap scan report for 192.168.1.25
Host is up (0.018s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.102
Host is up (0.098s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 88:30:8A:50:90:52 (Murata Manufacturing)

Nmap scan report for 192.168.1.103
Host is up (-0.060s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.106
Host is up (0.11s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server
MAC Address: 00:0A:F5:DE:F8:38 (Airgo Networks)

Nmap scan report for 192.168.1.111
Host is up (0.025s latency).
PORT     STATE SERVICE
3389/tcp open  ms-wbt-server
MAC Address: 80:1F:02:8E:4F:9B (Edimax Technology)

Nmap scan report for 192.168.1.101
Host is up (0.00016s latency).
PORT     STATE  SERVICE
3389/tcp closed ms-wbt-server

Nmap done: 256 IP addresses (7 hosts up) scanned in 29.93 seconds
pesca il primo ip.... suppongo  e poi....
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 12 Gennaio 2018, 01:36:48
ma la storia dell' * a fine /n dove stava scritta ?? che io non  l ho propio vista
Ho interpretato male la riga "Nmap scan report for 192.168.1.101" da te scritta prima.

Comunque, hai visto questo mio esempio al riguardo ?
http://www.gambas-it.org/smf/index.php?topic=6061.msg42966#msg42966


Ad ogni modo, volendo tu gestire stringhe di caratteri, devi studiare le funzioni di Gambas sulla gestione delle Stringhe, ...altrimenti gironzoli vanamente.
Ricordati sempre di lasciar perdere ogni riferimento al VB, giacché Gambas NON è un adattamento di VB per Linux: Gambas è un linguaggio "orientato agli oggetti" con autonomia e dignità propria.
Ogni paragone con VB è semplicemente fuorviante.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 12 Gennaio 2018, 09:53:58
Buon dì e grazie  ancora per le infinite dritte che tu mi dai , qualcosa da leggere riguardo le stringhe ingambas , hai percaso qualche link ?
approposito dell esempio , che ho fatto girare  propio ora , ho come outof bound  ss    Write Scan(ss, "*for *")[1], e  non capisco il pattern  che usi piu sopra
    num = Scan(Result, "*IP addresses (* *")   ma la parola  IP addresses non c'è  nel listato che  sputa  nmap , ma non si era detto che  scan usa le parole del testo per non prendere  e gli asterischi per prendere ??
 :rolleyes: :rolleyes: :rolleyes: :rolleyes: ???
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 12 Gennaio 2018, 17:03:31
qualcosa da leggere riguardo le stringhe ingambas , hai percaso qualche link ?
Attualmente manca un manuale aggiornato di Gambas in Italiano.
In lingua inglese è facilmente reperibile quello di Rittinghouse, anche se ormai molto, troppo vecchio:
http://www.emcu.it/GAMBAS/gambas.pdf
dal quale potrai comunque ancora apprendere alcuni elementi basilari, in particolare sulle funzioni per la gestione dei file e delle stringhe.

In caso di dubbi nella programmazione, noi del forum siamo sempre soliti incoraggiare il principiante a effettuare la ricerca sul forum, a porre domande nel forum, e a servirsi della guida on-line che appare durante la scrittura delle risorse di Gambas nei codici.

Riporto di seguito altri collegamenti utili all'apprendimento del linguaggio Gambas:

Sito ufficiale di Gambas:
 - http://gambas.sourceforge.net/en/main.html

Wiki ufficiale di Gambas:
 - http://gambaswiki.org/wiki

Forum, Wiki ed altri siti esistenti su Gambas:
 - https://www.gambas-es.org/forum.php
 - http://www.gambasforge.org/
 - http://www.gambas-club.de/index.php
 - https://forum.gambas.one/
 - https://gambas.guru/tw/Welcome
 - http://www.gambaslinux.fr/
 - http://www.gambas-it.org/wiki/index.php?title=Pagina_principale .......
 - http://wiki.gambas-es.org/doku.php
 - https://gambas-buch.de/dw/doku.php
- http://www.gambas-book.net
 - http://www.gambasforge.org/wiki
 - http://sologambas.blogspot.it/p/indice.html

Testi e manuali esistenti:
 - http://gambaswiki.org/wiki/doc/book?nh&l=en



approposito dell esempio , che ho fatto girare  propio ora , ho come outof bound  ss    Write Scan(ss, "*for *")[1]
Usando all'interno di quel mio codice le righe, da te sempre riportate, io ottengo questi risultati:
192.168.1.1 - 3389/tcp closed ms-wbt-server
192.168.1.25 - 3389/tcp open  ms-wbt-server
192.168.1.103 - 3389/tcp open  ms-wbt-server
192.168.1.105 - 3389/tcp open  ms-wbt-server
192.168.1.114 - 3389/tcp closed ms-wbt-server
192.168.1.120 - 3389/tcp closed ms-wbt-server
192.168.1.101 - 3389/tcp closed ms-wbt-server

Non so perché a te non funziona.
Le tue righe doi esempio vanno copiate e incollate così come sono in un file di testo da salvare nella cartella /tmp.


non capisco il pattern  che usi piu sopra
num = Scan(Result, "*IP addresses (* *")   ma la parola  IP addresses non c'è  nel listato che  sputa  nmap
Se vedi bene, le parole "IP addresses" sono presenti nell'ultima riga.
In vero questa mia linea di comando è rimasta nel codice erroneamente, poiché avevo inizialmente pensato ad un'altra soluzione e mi serviva sapere quanti risultati erano stati trovati: l'ultima riga dice sette
 IP addresses (7 hosts up) scanned
Però con questo codice che ho postato quella linea non è più utile, e provvedo ora a correggere il codice togliendola.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 13 Gennaio 2018, 00:12:50
grazie per le dritte  :) , se un giorno ne scriverai uno di libri , ricorda che voglio la prima stampa con  dedica .
ho provato facendo il file nella tmp ed effettivamente funziona , ora il dubbio è ...forse lo stdout  di nmap è diverso dal txt salvato ??
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 13 Gennaio 2018, 00:41:05
allora  ho fatto questa prova easy
prima copiando e incollano il listato che avevo messo nel fogli a in tmp e funziona  tutto ok ,  poi gli ho detto alla scansione di di buttare il risultato in tmp in b con questo comando
Codice: [Seleziona]
Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 > /tmp/b" To Result 
e dada non funziona mi da array outofbound 

che poi prima che inchiodi mi  scrive questo
Codice: [Seleziona]
 Starting Nmap 7.01 ( https://nmap.org ) at 2018-01-13 00:45 CET
 - PORT     STATE  SERVICE
 -
 - PORT     STATE    SERVICE
 -
 - PORT     STATE    SERVICE
 -
 - PORT     STATE  SERVICE
 -
 - PORT     STATE    SERVICE
 -
 - PORT     STATE  SERVICE
ma come è possibile se nel pattern ci sono 5 spazi ???
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 13 Gennaio 2018, 01:04:28
se un giorno ne scriverai uno di libri
Ci hanno già provato Gianluigi e kicco a coinvolgermi nella scrittura di un manuale: ...ve ne potete scordare.



Codice: [Seleziona]
Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 > /tmp/b" To Result 
e dada non funziona mi da array outofbound 

che poi prima che inchiodi mi  scrive questo

ma come è possibile se nel pattern ci sono 5 spazi ???
Noto che l'impostazione delle righe del risultato del file b.txt è diversa da quella delle righe da te riportate nel tuo primo post.
Devi trovare una soluzione "universale" a livello di codice; che vada cioè bene sempre.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 13 Gennaio 2018, 01:48:32
ok mi basta le dritte allora :D

e infatti stavo propio guardando , ho notato se lancio l nmap a casa della mia donna , ho le parentesi nell ip mentre da me a casa mia ho solo sul primo ip le parentesi e poi senza  :rolleyes: ???
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 13 Gennaio 2018, 01:49:58
Non si ottengono dunque risultati con impostazioni "costanti".   :-X
In tal caso il mio codice di esempio ovviamente non è utile.
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 13 Gennaio 2018, 12:00:57
non utile al caso ma  didatticamente utilissimo  ;D :)
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 15 Gennaio 2018, 00:11:52
per i posteri: è stato un parto...... e  alla fine  ho usato il  buon vecchio grep , secondo la mia modesta opinione (e io di programmazione ci capisco poo) come ho gia detto le regexp il gambero le gestisce davvero ..... male tipo: analizziamo , cè  il comando scan che farebbe quasi un ottimo lavoro se non poi cascare su pattern, che non mi sembrano aderenti a gli standard perl o qualsiasi altro per le regexp , il comando ad una  riga di regexp  farebbe a livello di pattern un ottimo lavoro , ma mi casca sul fatto che non legge in maniera globalmatch ma solo una riga e non cè un metodo o una classe chepossa farlo  , l unico potrebbe essere scrivere il mega pappone che si trova nel help , una roba che per un beginner , che è leggermente  piu avanti di hello world  , diventa un po un suicidio non assistito , in pratica quello che la shell linux con  grep awk ,perl e autoit (in windows )(che sono i linguaggi che "conosco") fanno in una  riga massimo due e sopratutto con sintassi da  beginner  gambas la fa complicata un casino , senza apportare nessun vantaggio dalla complicanza
di seguito la mia soluzione  :)
Codice: [Seleziona]
  Dim GetwayIP As String
  Dim Getway As String
  Dim GetwayMeno As String
  Dim IP As String
  Dim Port3389 As String
  Dim num, ss As String[]
  Dim i As Byte
 
  If TextBox1.Text = "" Then
    Message.Error("Errore devi inserire la pass di root se vuoi che funzioni, Ciao!")
  Else
    Shell "(/sbin/ip route | awk '/default/ { print $3 }')" To GetwayIP
    Getway = Trim(GetwayIP)
    GetwayMeno = Left(Getway, -1)   
    Shell "echo " & TextBox1.Text & " | sudo -S nmap -T4 -p3389 " & Getway & "/24 -oN /tmp/h" Wait
    Shell "cat /tmp/h  | grep -oP '" & GetwayMeno & "*'" To IP
    Shell "cat /tmp/h | grep -P '3389/tcp '" To Port3389
   
    ss = Split(IP, "\n")
    ss.Remove(0)
    num = Split(Port3389, "\n")
   
    For i = 0 To num.Max
      Print ss[i]
      Print num[i]
    Next
  Endif

P.S.  due cose che  mancano secondo me nell ide di gambas  sono il duplica righe con ctrl+d  stile scite editor e quando seleziono una variabile vederla selezionata in tutto il foglio
saluti
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: vuott - 15 Gennaio 2018, 00:45:05
(https://hips.hearstapps.com/esquireuk.cdnds.net/17/11/1489661766-giphy.gif)
Titolo: Re:regexp vediamo se ho capito qualcosa (non infamatemi troppo :D)
Inserito da: faustf - 15 Gennaio 2018, 00:49:45
 ;D ;D ;D ;D