Windows 에서 bat 일괄 처리 스 크 립 트 는 telnet 를 사용 하여 원 격 포트 소 기 를 대량으로 검사 합 니 다.

여러 해 동안 일괄 처 리 를 하지 않 았 습 니 다.새 회사 에 온 첫 번 째 케이스 는 bat 스 크 립 트 를 써 야 합 니 다.채집 에이전트 의 설정 파일 을 대량으로 업데이트 해 야 합 니 다.그 중에서 원 격 IP 포트 검 측 과 관련 됩 니 다.
리 눅 스 처럼 간단하게 판단 할 수 있 을 줄 알 았 는데:

echo q|telnet -e 'q' $ip $port && echo "$ip:port "||echo "$ip:port "
결과 Windows 아래 telnet 종료 결과 의 반환 값 이 실행 되 지 않 은 것 으로 나 타 났 습 니 다.

도움 을 빌리다
그래서 나 는 게 으 른 사람의 법칙 을 먼저 열 고 다른 대체 도 구 를 찾 았 다.과연 윈도 할머니 집에 서 찾 았 습 니 다.
Portqry: https://support.microsoft.com/en-us/kb/310099/zh-cn
확실히 사용 할 수 있 습 니 다.하지만 검 측 속 도 는 칭찬 할 수 없습니다.통 하 는 것 과 통 하지 않 는 것 이 모두 느 립 니 다!수중 에 더 좋 은 해결 방법 이 없 음 을 감안 하여 먼저 시험 해 보고 제 가 쓴 Portqry 관련 demo 를 붙 여 보 세 요.

::        【PortQry】       :
@echo off & setlocal enabledelayedexpansion

rem     IP   
set server_ip='192.168.1.1,192.168.1.2,192.168.1.3'
set serverport='9922'

rem      
call :check

::****     ****

:check
rem ※      --PortQry  ※
for /f "tokens=1,* delims=," %%i in ("!server_ip!") do (
 echo      %%i   !serverport!   ...
 rem          :
 "!tools_dir!\PortQry.exe" -n %%i -p tcp -e !serverport! | find "LISTENIN" >nul && (
  echo 【  】:      %%i:!serverport!
  ) || (
  echo 【  】:     %%i:!serverport!
 )
 echo=
 set server_ip=%%j
 goto check
)
goto :eof 
::*******     ********
P:check 은 call 에서 호출 된 모듈 입 니 다.그 안의 일부 변 수 는 소개 하지 않 습 니 다.
그래서 흥 에 겨 운 패키지 가 exe 로 되 어 IDC(server 2003 시스템)에 실 행 됐 고 그 결과 첫 번 째 대 는 비극 적 이 었 습 니 다!원 격 데스크 톱 이 바로 끊 겼 습 니 다:

그리고 다 시 는 연결 이 되 지 않 습 니 다.그들 에 게 기관실 에 가서 보라 고 했 는데 시스템 이 없어졌다 고 했 습 니 다!!?너무 충격 적 이 야.나무 있어?간단 한 텍스트 조작 스 크 립 트 가 시스템 을 해 치 웠 습 니까?그리고 스 크 립 트 에 삭제 명령 이 존재 하지 않 습 니 다...
그 쪽 에서 시작 오류 정 보 를 제공 해 야 하 는데 시스템 안내 가 고장 났 군요.

개인 적 으로 분석 해 보 니 Portqry 라 는 도구 로 인해 시스템 블 루 스크린 이 꺼 져 서 안내 가 손상 되 었 을 것 입 니 다!
니 마,친정 사람들 이 소개 할 때'성격'이 좋다 고 했 는데?

에이,이 공 구 는 감히 사용 할 수 없 을 것 같 아.숲 이 크 면 모든 시스템 이 다 있다 는 속담 이 있 잖 아!
2.새로운 길 을 개척 하 다
공 구 를 감히 사용 할 수 없 으 니 코드 를 계속 괴 롭 히 는 것 이 좋 겠 다!주말 에 자기 전에 갑자기 영감 이 떠 올 랐 습 니 다.tasklist 가 창 이름 을 판단 하 는'실전 묘기'가 생각 났 습 니 다.그래서 막 닫 은 공책 을 다시 열 었 습 니 다.마침내 GF 의 끊 임 없 는 불평 끝 에 이 문 제 를 해결 하 였 습 니 다.
① 창 판단
생각 은 간단 합 니 다.start 명령 을 사용 하여 새 창 에서 telnet-e 와 exit 명령 을 실행 합 니 다.포트 가 잘 통 하면 새로 연 창 은 바로 닫 히 고 통 하지 않 는 창 은 30 분 정도 유 지 됩 니 다.또한 창 이름 은 telnet 192.168.1.1 과 유사 합 니 다.이 30 분 동안 스 크 립 트 가 통 하 는 지 안 통 하 는 지 판단 할 수 있 습 니 다.
그래서 위의 check 부분 을 다음 과 같이 수정 합 니 다.

::  telnet       
@echo off & setlocal enabledelayedexpansion

rem     IP   
set server_ip='192.168.1.1,192.168.1.2,192.168.1.3'
set serverport='9922'

rem      
call :check_port

::****     ****

:check_port
rem ※      --telnet  ※
for /f "tokens=1,* delims=," %%i in ("!server_ip!") do (
 echo [No.!check_num!]:     %%i   !serverport!   ... 
 rem      telnet,           ,    3    telnet      ,            !
 start /min cmd.exe /k "echo q|telnet -e 'q' %%i !serverport! & exit"
 ping -n 3 127.1>nul
 rem       “Telnet ${ip}” cmd  ,        IP  
 tasklist /fi "windowtitle eq Telnet %%i" | find "cmd.exe" >nul && (
  echo 【  】:     %%i:!serverport!
 ) || (
  echo 【  】:      %%i:!serverport!
 )
 echo=
 set server_ip=%%j
 goto check_port
)
goto :eof
::     ...
이렇게 하면 Windows 에서 telnet 에서 원 격 포트 를 탐지 하 는 문 제 를 해결 할 수 있 습 니 다.또한 검 측 속 도 는 마이크로소프트 의 어느 portqry 보다 훨씬 빠 릅 니 다.역시 생각 은 기술 보다 더 중요 합 니 다.생각 만 있 으 면 그 어떠한 기술 도 병목 이 되 어 서 는 안 됩 니 다!
② 프로 세 스 판단[최신 보충]
창 으로 판단 하 는 방안 을 통 해 각 기관실 에서 실 시 했 을 때 또 하나의 문제 가 발생 했 습 니 다!창 판단 은 일부 버 전의 Windows 에서 통 하지 않 습 니 다.예 를 들 어 영어 버 전의 명령 프롬프트 창 이름과 중국어 버 전이 다 르 기 때문에 이 방안 도 완선 되 지 않 습 니 다!
그래서 계속 귀 를 긁 고 볼 을 긁 으 며 두 번 째 방안 을 생각해 냈 다.텔 넷 프로 세 스 의 수량 을 판단 하여 네트워크 가 잘 통 하 는 지 여 부 를 판단 하 는 것 이다.
프로젝트 아이디어:

a. telnet.exe ,
b. , start cmd telnet
c. telnet.exe ( telnet )
d. telnet , IP
예제 코드:

::  telnet       
@echo off & setlocal enabledelayedexpansion

rem     IP   
set server_ip='192.168.1.1,192.168.1.2,192.168.1.3'
set serverport='9922'

::****     ****
rem       telnet.exe     ,             telnet.exe
call :telnet_num conf

rem      
call :check_port

:check_port
set /a check_num+=1
rem ※      ※
for /f "tokens=1,* delims=," %%i in ("!server_ip!") do (
	echo [No.!check_num!]:     %%i   !serverport!   ...
	::call :set_iPSec %%i
	rem   telnet        ,           ,    3    telnet      ,            !
	start /min cmd.exe /k "echo q|telnet -e 'q' %%i !serverport! & exit"
	echo=
	set server_ip=%%j
	set total_num=!check_num!
	goto check_port
)

ping -n 3 127.1>nul

#    telnet    ,             telnet  
call :telnet_num

echo      :!telnet_num!
goto :eof

:telnet_num
rem   telnet    ,         telnet
set conf=0
for /f "delims=*" %%i in ('tasklist ^| findstr "telnet.exe"') do (
	if "%1"=="conf" (
		set /a conf+=1
	) else (
		set /a telnet_num+=1
	)	
)
set /a telnet_num=!telnet_num!-!conf!
goto :eof
내 가 모든 IP 중 몇 개가 통 하지 않 는 지 테스트 한 것 은 분명 하 다.안 타 깝 게 도 어떤 IP 가 통 하지 않 는 지 알 수가 없 었 습 니 다.그러나 수중 에 있 는 이 케이스 에 서 는 구체 적 으로 통 하지 않 는 IP 가 필요 없 이 통 하 는 IP 가 기준 에 달 했 는 지 만 알 면 된다.
자,드디어 이 문 제 를 해결 했다.자만 심이 아니 라 언제든지 여러 가지 방안 을 제시 해 야 한 다 는 것 은 분명 하 다.그렇지 않 으 면 문제 가 생기 면 곤경 에 빠 질 것 이다.물론 기술 보다 아이디어 가 더 중요 하 다 는 것 을 다시 한 번 설명 했다.

좋은 웹페이지 즐겨찾기