Buon di a tutti
ho un testo fatto cosi
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
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
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:
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
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 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
il codice è 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
Ho scritto questo codice inserendo le tue righe in un file di testo:
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
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
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???
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
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)
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
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:
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
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:
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
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:
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.)
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
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....
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
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
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 ???
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 :)
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