네트워크 포트 액세스를 확인하고 유용한 메시지를 표시하는 방법은 무엇입니까?
아래와 같이 powershell을 이용하여 port의 개방 여부를 확인하려고 했습니다.
(new-object Net.Sockets.TcpClient).Connect("10.45.23.109", 443)
이 방법은 효과가 있지만 출력은 사용자 친화적이지 않습니다.오류가 없으면 액세스할 수 있다는 뜻입니다.성공 여부를 확인하고 "포트 443이 작동 중입니다"와 같은 메시지를 표시할 수 있는 방법이 있습니까?
Windows 8/Windows Server 2012 이상을 실행하는 경우 PowerShell에서 Test-NetConnection 명령을 사용할 수 있습니다.
예:
Test-NetConnection -Port 53 -ComputerName LON-DC1
저는 몇 가지 방법으로 살셀바프라부의 답변을 개선했습니다.
- 이제 기능입니다. 파워셸 프로필을 입력하고 필요할 때 언제든지 사용할 수 있습니다.
- 호스트를 호스트 이름 또는 IP 주소로 허용할 수 있습니다.
- 호스트 또는 포트를 사용할 수 없으면 더 이상 예외 없음 - 텍스트만 해당
이렇게 부릅니다.
Test-Port example.com 999
Test-Port 192.168.0.1 80
function Test-Port($hostname, $port)
{
# This works no matter in which form we get $host - hostname or ip address
try {
$ip = [System.Net.Dns]::GetHostAddresses($hostname) |
select-object IPAddressToString -expandproperty IPAddressToString
if($ip.GetType().Name -eq "Object[]")
{
#If we have several ip's for that address, let's take first one
$ip = $ip[0]
}
} catch {
Write-Host "Possibly $hostname is wrong hostname or IP"
return
}
$t = New-Object Net.Sockets.TcpClient
# We use Try\Catch to remove exception info from console if we can't connect
try
{
$t.Connect($ip,$port)
} catch {}
if($t.Connected)
{
$t.Close()
$msg = "Port $port is operational"
}
else
{
$msg = "Port $port on $ip is closed, "
$msg += "You may need to contact your IT team to open it. "
}
Write-Host $msg
}
사실 Shay levy의 답변은 거의 맞지만 그의 댓글란에서 언급했듯이 이상한 문제가 생겼습니다.그래서 명령어를 두 줄로 나누었는데 잘 작동합니다.
$Ipaddress= Read-Host "Enter the IP address:"
$Port= Read-host "Enter the port number to access:"
$t = New-Object Net.Sockets.TcpClient
$t.Connect($Ipaddress,$Port)
if($t.Connected)
{
"Port $Port is operational"
}
else
{
"Port $Port is closed, You may need to contact your IT team to open it. "
}
Connected 속성이 $true로 설정되어 있는지 확인하고 다음과 같은 친절한 메시지를 표시할 수 있습니다.
$t = New-Object Net.Sockets.TcpClient "10.45.23.109", 443
if($t.Connected)
{
"Port 443 is operational"
}
else
{
"..."
}
최신 버전의 PowerShell에서는 새로운 cmdlet인 Test-NetConnection이 있습니다.
이 cmdlet을 사용하면 사실상 다음과 같이 포트를 ping할 수 있습니다.
Test-NetConnection -ComputerName <remote server> -Port nnnn
이것이 오래된 질문이라는 것을 알지만, 만약 여러분이 이 정보를 찾기 위해 이 페이지를 누른다면, 이 추가사항은 도움이 될 것입니다!
저는 mshutov의 제안을 개선하려고 노력했습니다.출력을 객체로 사용할 수 있는 옵션을 추가했습니다.
function Test-Port($hostname, $port)
{
# This works no matter in which form we get $host - hostname or ip address
try {
$ip = [System.Net.Dns]::GetHostAddresses($hostname) |
select-object IPAddressToString -expandproperty IPAddressToString
if($ip.GetType().Name -eq "Object[]")
{
#If we have several ip's for that address, let's take first one
$ip = $ip[0]
}
} catch {
Write-Host "Possibly $hostname is wrong hostname or IP"
return
}
$t = New-Object Net.Sockets.TcpClient
# We use Try\Catch to remove exception info from console if we can't connect
try
{
$t.Connect($ip,$port)
} catch {}
if($t.Connected)
{
$t.Close()
$object = [pscustomobject] @{
Hostname = $hostname
IP = $IP
TCPPort = $port
GetResponse = $True }
Write-Output $object
}
else
{
$object = [pscustomobject] @{
Computername = $IP
TCPPort = $port
GetResponse = $False }
Write-Output $object
}
Write-Host $msg
}
Test-NetConnection을 사용할 수 없는 이전 버전의 Powershell을 사용하는 경우 호스트 이름 "my.hostname" 및 포트 "123"에 대한 원라이너가 있습니다.
$t = New-Object System.Net.Sockets.TcpClient 'my.hostname', 123; if($t.Connected) {"OK"}
확인 또는 오류 메시지를 반환합니다.
mshutov & Salselvaprabu의 훌륭한 답변.저는 조금 더 강력한 무언가가 필요했고, 그것은 첫 번째 것만 확인하는 대신 제공된 모든 IP 주소를 확인했습니다.
또한 Test-Connection 함수가 아닌 일부 파라미터 이름과 기능을 복제하고자 했습니다.
이 새로운 기능을 사용하면 재시도 횟수에 대한 카운트와 각 시도 간 지연을 설정할 수 있습니다.맛있게 드세요.
function Test-Port {
[CmdletBinding()]
Param (
[string] $ComputerName,
[int] $Port,
[int] $Delay = 1,
[int] $Count = 3
)
function Test-TcpClient ($IPAddress, $Port) {
$TcpClient = New-Object Net.Sockets.TcpClient
Try { $TcpClient.Connect($IPAddress, $Port) } Catch {}
If ($TcpClient.Connected) { $TcpClient.Close(); Return $True }
Return $False
}
function Invoke-Test ($ComputerName, $Port) {
Try { [array]$IPAddress = [System.Net.Dns]::GetHostAddresses($ComputerName) | Select-Object -Expand IPAddressToString }
Catch { Return $False }
[array]$Results = $IPAddress | % { Test-TcpClient -IPAddress $_ -Port $Port }
If ($Results -contains $True) { Return $True } Else { Return $False }
}
for ($i = 1; ((Invoke-Test -ComputerName $ComputerName -Port $Port) -ne $True); $i++)
{
if ($i -ge $Count) {
Write-Warning "Timed out while waiting for port $Port to be open on $ComputerName!"
Return $false
}
Write-Warning "Port $Port not open, retrying..."
Sleep $Delay
}
Return $true
}
이 값을 하나의 라이너로 압축하여 변수 "$port389Open"을 True 또는 False로 설정합니다. 포트 목록에 대해 빠르고 쉽게 복제할 수 있습니다.
try{$socket = New-Object Net.Sockets.TcpClient($ipAddress,389);if($socket -eq $null){$Port389Open = $false}else{Port389Open = $true;$socket.close()}}catch{Port389Open = $false}
정말로 미쳐가고 싶지 않다면 전체 배열을 돌려줄 수 있습니다.
Function StdPorts($ip){
$rst = "" | select IP,Port547Open,Port135Open,Port3389Open,Port389Open,Port53Open
$rst.IP = $Ip
try{$socket = New-Object Net.Sockets.TcpClient($ip,389);if($socket -eq $null){$rst.Port389Open = $false}else{$rst.Port389Open = $true;$socket.close();$ipscore++}}catch{$rst.Port389Open = $false}
try{$socket = New-Object Net.Sockets.TcpClient($ip,53);if($socket -eq $null){$rst.Port53Open = $false}else{$rst.Port53Open = $true;$socket.close();$ipscore++}}catch{$rst.Port53Open = $false}
try{$socket = New-Object Net.Sockets.TcpClient($ip,3389);if($socket -eq $null){$rst.Port3389Open = $false}else{$rst.Port3389Open = $true;$socket.close();$ipscore++}}catch{$rst.Port3389Open = $false}
try{$socket = New-Object Net.Sockets.TcpClient($ip,547);if($socket -eq $null){$rst.Port547Open = $false}else{$rst.Port547Open = $true;$socket.close();$ipscore++}}catch{$rst.Port547Open = $false}
try{$socket = New-Object Net.Sockets.TcpClient($ip,135);if($socket -eq $null){$rst.Port135Open = $false}else{$rst.Port135Open = $true;$socket.close();$SkipWMI = $False;$ipscore++}}catch{$rst.Port135Open = $false}
Return $rst
}
닫힌 포트를 스캔하면 오랫동안 응답이 없습니다.다음과 같이 fqdn to ip를 해결하는 것이 더 빠른 것 같습니다.
[System.Net.Dns]::GetHostAddresses("www.msn.com").IPAddressToString
언급URL : https://stackoverflow.com/questions/9566052/how-to-check-network-port-access-and-display-useful-message
'programing' 카테고리의 다른 글
쿼리 내부 쿼리에서 "열로" 반환됨 (0) | 2023.10.05 |
---|---|
MySQL Workbench - 이름이 다른 동일한 서버에서 데이터베이스를 복제하는 방법? (0) | 2023.10.05 |
Maria에서 업데이트 명령 롤백DB (0) | 2023.10.05 |
부울 값을 만드는 방법은? (0) | 2023.10.05 |
스크립트 내에서 리디렉션을 사용하면 유니코드 출력이 생성됩니다.싱글바이트 ASCII 텍스트를 내보내는 방법은? (0) | 2023.10.05 |