Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] netstat + tasklist Вся полезная информация в одном месте! [решено] (http://forum.oszone.net/showthread.php?t=218804)

shmurva 24-10-2011 23:07 1780958

netstat + tasklist Вся полезная информация в одном месте! [решено]
 
netstat + tasklist Вся полезная информация в одном месте!

Всем привет, меня зовут Владислав, решил поделиться со всеми своими заметками, на днях написал...

Установил на компьютере apache и mysql, и надо был смотреть, в какой порт открыты приложения легко и быстро. Для того есть несколько конcольных команд в Windows
Обзор активных портов системы:
netstat -ano
Обзор запущенных процессов:
tasklist

И чтобы найти запущен ли, например MySql сервера, приходилось писать
tasklist | findstr mysql
А чтобы узнать его порт, делал поиск либо по PID, либо по слову LIST и порту 330.* (я знал в каких десятках открыт порт)
netstat -ano | findstr 1674
netstat -ano | findstr 33.*LIST

Но очень не удобно было запускать каждый раз по две этих команды, чтобы проверить
1. Запущен ли MySql сервер (или apache)
2. И на каком порту он висит

В виду этого было принято решение написать batch-файл, который бы предоставлял нам всю необходимую информацию за одну операцию. Спустя долгие часы отладки bat-ника и изучения этой предметной магии, батник был написан =)

Инструкция применения:
1. Создать папку c:\bin
2. сохранить код батника в c:\bin\task.bat
3. добавить путь c:\bin в переменную окружения PATH
4. теперь мы можем писать в консоли что-то вроде
task mysql
или
task apache

5. Вы хотите создать сверху свой батник, где запускаются несколько task, то вызывать их из батника следует командой
call task mysql
call task apache


Код bat-файла task.bat
Код:

@echo off
rem ВНИМАНИЕ! УСТАНОВИТЕ ЭТУ ПЕРЕМЕННУЮ ТАКЖЕ КАК НАЗЫВАЕТСЯ ЭТОТ ФАЙЛ!  (если расширение .cmd или .bat, его можно не указывать)
set __FILENAME__=task

rem  Описание
rem  Данная команда выводит искомую строку из "tasklist" и оторажает связанный с ней порт из "netstat -ano"
rem  Входные параметры: %1 - часть строки для поиска
rem  Ограничение: если название программы в tasklist с пробелом, то пакет не сможет вывести netstat
rem  Примеры:
rem
rem  task mysql
rem  task http
rem
rem  Если вы пишите свой батник, то из него вызывать надо следующим образом (если вызвать без call,
rem  то выполнится только первая команда, пока не ясно почему)
rem  call task mysql
rem  call task apache
rem
rem  @author Владислав Вольнов
rem  @date 25.10.2011
rem 


rem Проверить, не вызван ли файл как спец. bat-ник
if "%~1"=="bat_find_task_list" (
    call :bat_find_task_list "%~2"
    goto :eof
)


goto begin
rem занятые метки циклов
rem forbegin1 forbegin2 forbegin3


rem Получить номер порта из строки netstat -ano
:get_port_from_netstat
    rem три вида строк, которы успешно обрабатываются данной функцией
    rem set str=UDP    [few0::91f3:bcea:1ab4:70e0%37]:1900  *:*
    rem set str=  UDP    [::]:3702              *:*
    rem set str=  UDP    192.168.56.1:1900      *:*
    set str=%~1
    rem echo %str%
    rem echo разделение
    for /f "delims=] tokens=1,2" %%i in ("%str%") do (
        if "%%j"=="" (
            for /f "delims=: tokens=2" %%a in ("%str%") do (
                for /f %%a in ("%%a") do (
                    rem echo port=%%a
                    set r1=%%a
                )
            )
        ) else (
            rem echo i=%%i
            rem echo j=%%j
            for /f "delims=:" %%a in ("%%j") do (
                for /f %%a in ("%%a") do (
                    rem echo port=%%a
                    set r1=%%a
                )
            )
        )
    )
goto :eof


rem Получить номер PID из указанной строки netstat -ano
:get_pid_from_netstat
    set str=%~1
    rem echo getPID %str%
    for /f "tokens=1,2,3,4,5" %%a in ("%str%") do (
    rem %%a %%b %%c %%d %%e
    if "%%e"=="" (
        rem echo getPID.r1=%%d
        set r1=%%d
    ) else (
        rem echo getPID.r1=%%e
        set r1=%%e
    )
    )
    rem echo getPID.r1=%r1%
goto :eof


rem Получить PID из строки tasklist
:get_pid_from_tasklist
    rem echo get_pid_from_tasklist %~1
    for /f "tokens=2" %%i in ("%~1") do set r1=%%i
    rem echo get_pid_from_tasklist.res=%r1%
goto :eof


rem Функция выполняющаяся, если вызвать текущий bat-файл с параметром %1 равным bat_find_task_list
:bat_find_task_list
    tasklist | findstr "%~1"
goto :eof


rem Вывести список программ, найденные по %1
:prn_find_tasklist
    set str=%~1
    rem echo prn_find_tasklist %str%
    rem echo NAME=%~0
    for /f "usebackq tokens=*" %%i in (`call %__FILENAME__% bat_find_task_list "%~1"`) do call :forbegin3 "%%i"
    goto :forend3
    :forbegin3
        rem echo for3body x1=%~1
        echo %~1
        call :get_pid_from_tasklist "%~1"
        rem echo for3body r1=%r1%
        call :prn_netstat_pid %r1%
        echo.
    goto :eof
    :forend3
goto :eof


rem Вывести строки с указанным портом из netstat -ano
:prn_netstat_port
    for /f "usebackq tokens=*" %%d in (`netstat -ano`) do call :forbegin1 "%%d" "%~1"
    goto :forend1
    :forbegin1
        rem echo str=%~1  port=%~2
        call :get_port_from_netstat "%~1"
        rem echo "%r1%"
        if "%r1%"=="%~2" (
            echo %~1
        )
    goto :eof
    :forend1
goto :eof


rem Вывести строки с указанным PID из netstat -ano
:prn_netstat_pid
    rem echo prn_netstat_pid %~1
    for /f "usebackq tokens=*" %%i in (`netstat -ano`) do call :forbegin2 "%%i" "%~1"
    goto :forend2
    :forbegin2
        call :get_pid_from_netstat "%~1"
        rem echo p=%~2 str=%~1 res=%r1%
        if "%r1%"=="%~2" echo %~1
        goto :eof
    :forend2
goto :eof



rem Основной код
:begin

echo.
call :prn_find_tasklist "%~1"

:eof

Также удобно в c:\bin поместить файл view.bat
Код файла view.bat
Код:

@echo off
call task mysql
call task http

Теперь запуска команды view будет выводить на экран информацию вида
Код:

mysqld.exe                    8176 Console                    1    42 408 КБ
TCP    0.0.0.0:3307          0.0.0.0:0              LISTENING      8176
TCP    [::]:3307              [::]:0                LISTENING      8176


httpd.exe                    7404 Services                  0    4 620 КБ
TCP    127.0.0.1:81          0.0.0.0:0              LISTENING      7404

Удобно, не правда ли :)


Время: 17:02.

Время: 17:02.
© OSzone.net 2001-