Strona 1 z 1

[+] Otwarte porty, przekazanie zmiennej do polecenia powłoki - bash, python

: 26 grudnia 2012, 14:10
autor: czaki249
Witam.
Mam problem ze skryptem, który ma sprawdzać otwarte porty takie jak 22 czy 80.

Robię tablicę asocjacyjną gdzie do nazwy usługi przypisuję port. Następnie chcę wyciągnąć port i poprzez polecenie:

Kod: Zaznacz cały

`netstat -tln | grep $P | awk '{print $6}'`
sprawdzić czy port jest otwarty.

I teraz mam problem, ponieważ, nie wiem jak przekazać wyciągnięty port do zmiennej $P w poleceniu. Oczywiście robię import os i odpowiednio wywołuję netstat.

Na razie mam coś takiego i nie bardzo wiem co dalej:

Kod: Zaznacz cały

import os


Porty={'SSH':'22', 'FTP':'21'}


for P in Porty:
    Port=os.system("netstat -tln | grep $P | awk '{print $6}'")


    if Port == LISTEN:


        print Porty[P] "OK."
    else:
        print Porty[P] "Nie dziala." 

W bashu mam coś takiego:

Kod: Zaznacz cały

PORT=('21' '22' '23' '25' '53' '69' '80' '110' '111' '119' '143'  '220' '389')
NAME=('FTP' 'Sftp' 'Telnet' 'SMTP' 'DNS' 'TFTP' 'WWW' 'POP3' 'NNTP' 'IMAP' 'IMAP')
for P in ${PORT
[*]}
do
     for N in $NAME
     do
          STAT=`netstat -tln | grep $P | awk '{print $6}'`
          if [ "$STAT" != "LISTEN" ]; then
               echo  "Nie dziala." $P $N
          else
               echo "Dziala." $P $N


          fi
     done
done
Jednak tutaj np.. nie pokazuje, że port 22 działa. Dalej, czy w bashu da się zrobić tablicę asocjacyjną. Mam basha 4.0 lub też pętlę w pętli: (for coś tam i for coś tam).

Proszę o jakieś wskazówki. Wiem, że można to zrobić choćby nmapem ale chcę z pomocą skryptu.

: 26 grudnia 2012, 14:55
autor: Rafal_F
Pythona nie znam.
Co do basha to tablice asocjacyjne w bash 4.0 http://www.linuxjournal.com/content/bas ... ive-arrays .
Pętle w pętli to właśnie zrobiłeś. Ale w pierwszym przypadku wykona się tylko na jednym elemencie, bo nie napisałeś:

Kod: Zaznacz cały

for N in ${NAME
[*]}
lub
for N in ${NAME[@]}
Ale rozumiem o co chodzi, pętla w pętli raczej nie zadziała. Musisz albo zrobić tak jak piszesz tablice asocjacyjną, albo po prostu zrobić licznik i w pętli while czytać obie tablice jednocześnie.

Edycja: tutaj w bash, musisz tylko powypełniać dobrze tablice:

Kod: Zaznacz cały

PORT=('21' '22' '23' '25' '53' '69' '80' '110' '111' '119' '143'  '220' '389')
NAME=('FTP' 'Sftp' 'Telnet' 'SMTP' 'DNS' 'TFTP' 'WWW' 'POP3' 'NNTP' 'IMAP' 'IMAP')


licznik=0
while [ $licznik -lt "${#PORT[@]}" ]; do
	STAT=`netstat -tln | grep "${PORT[licznik]}" | awk '{print $6}'`
	if [ "$STAT" != "LISTEN" ]; then
		echo  "Nie dziala." ${PORT[licznik]} ${NAME[licznik]}
	else
		echo "Dziala." ${PORT[licznik]} ${NAME[licznik]}
	fi
	((licznik += 1))
done

: 27 grudnia 2012, 20:07
autor: czaki249
Wielki dzięki za pomoc.