1. 程式人生 > >通過PowerShell傳送TCP請求

通過PowerShell傳送TCP請求

很多時候我們需要通過Socket傳送特定的TCP請求給伺服器的特定埠來實現探測伺服器的指定埠所開啟的服務。很多語言都有相應的方法實現上述需求,當然,PowerShell也不例外,比如我們要傳送一個簡單的http請求到指定的web伺服器:

GET / HTTP/1.1
Host:cn.bing.com

這裡我們想請求微軟必應的中文首頁,如果需要通過PowerShell向cn.bing.com伺服器傳送get請求,就需要建立一個System.Net.Sockets.TcpClient物件,向指定的伺服器和埠傳送請求。

具體程式碼如下:

        =====檔名:Send-TcpRequest.ps1=====
######################################## # Send-TcpRequest.ps1 ## Send a TCP request to a remote computer, and return the response. ## If you do not supply input to this script (via either the pipeline, or the ## -InputObject parameter,) the script operates in interactive mode. ## ## Example:
## ## $http = @" ## GET / HTTP/1.1 ## Host:cn.bing.com ## `n`n ## "@ ## ## $http | .\Send-TcpRequest cn.bing.com 80 ######################################## param( [string] $remoteHost = "localhost", [int] $port = 80, [switch] $UseSSL, [string
] $inputObject, [int] $commandDelay = 100 ) [string] $output = "" ## Store the input into an array that we can scan over. If there was no input, ## then we will be in interactive mode. $currentInput = $inputObject if(-not $currentInput) { $SCRIPT:currentInput = @($input) } $scriptedMode = [bool] $currentInput function Main { ## Open the socket, and connect to the computer on the specified port if(-not $scriptedMode) { write-host "Connecting to $remoteHost on port $port" } trap { Write-Error "Could not connect to remote computer: $_"; exit } $socket = new-object System.Net.Sockets.TcpClient($remoteHost, $port) if(-not $scriptedMode) { write-host "Connected. Press ^D followed by [ENTER] to exit.`n" } $stream = $socket.GetStream() if($UseSSL) { $sslStream = New-Object System.Net.Security.SslStream $stream,$false $sslStream.AuthenticateAsClient($remoteHost) $stream = $sslStream } $writer = new-object System.IO.StreamWriter $stream while($true) { ## Receive the output that has buffered so far $SCRIPT:output += GetOutput ## If we're in scripted mode, send the commands, ## receive the output, and exit. if($scriptedMode) { foreach($line in $currentInput) { $writer.WriteLine($line) $writer.Flush() Start-Sleep -m $commandDelay $SCRIPT:output += GetOutput } break } ## If we're in interactive mode, write the buffered ## output, and respond to input. else { if($output) { foreach($line in $output.Split("`n")) { write-host $line } $SCRIPT:output = "" } ## Read the user's command, quitting if they hit ^D $command = read-host if($command -eq ([char] 4)) { break; } ## Otherwise, Write their command to the remote host $writer.WriteLine($command) $writer.Flush() } } ## Close the streams $writer.Close() $stream.Close() ## If we're in scripted mode, return the output if($scriptedMode) { $output } } ## Read output from a remote host function GetOutput { ## Create a buffer to receive the response $buffer = new-object System.Byte[] 1024 $encoding = new-object System.Text.AsciiEncoding $outputBuffer = "" $foundMore = $false ## Read all the data available from the stream, writing it to the ## output buffer when done. do { ## Allow data to buffer for a bit start-sleep -m 1000 ## Read what data is available $foundmore = $false $stream.ReadTimeout = 1000 do { try { $read = $stream.Read($buffer, 0, 1024) if($read -gt 0) { $foundmore = $true $outputBuffer += ($encoding.GetString($buffer, 0, $read)) } } catch { $foundMore = $false; $read = 0 } } while($read -gt 0) } while($foundmore) $outputBuffer } . Main

該指令碼使用方法如下:

$http = @"
GET / HTTP/1.1
Host:cn.bing.com
`n`n
"@

$http | .\Send-TcpRequest cn.bing.com 80

執行效果如圖所示:

image

需要說明的是,由於頁面返回的內容太長了,這裡至少是將返回的內容快取在一個變數裡,並只輸出了變數的頭10行。

有了這個指令碼,我們就可以向指定的web伺服器傳送特定的請求,來實現模擬登陸和操作的功能了。

作者: 付海軍
出處:http://fuhj02.cnblogs.com
版權:本文版權歸作者和部落格園共有
轉載:歡迎轉載,為了儲存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段宣告;必須在文章中給出原文連線且保證內容完整!否則必究法律責任!
個人網站: http://www.fuhaijun.com/

相關推薦

通過PowerShell傳送TCP請求

很多時候我們需要通過Socket傳送特定的TCP請求給伺服器的特定埠來實現探測伺服器的指定埠所開啟的服務。很多語言都有相應的方法實現上述需求,當然,PowerShell也不例外,比如我們要傳送一個簡單的http請求到指定的web伺服器: GET / HTTP/1.1 Host:cn.bing.com

通過ajax傳送post請求向controller傳遞引數後,頁面無法跳轉問題

我的專案之前都是用location.href來向後臺傳遞引數,因為最近在學習ajax,所以將傳值方式改成了ajax傳送post請求,於是問題便接踵而來,我發現在controller中通過返回ModelAndView物件竟然不能實現頁面跳轉了,剛開始百思不得其解,現在總算明白這到底是怎麼一回事了,也想

Oracle 通過UTL_HTTP傳送http請求

HTTP_GET: CREATE OR REPLACE FUNCTION FN_HTTP_GET (v_url VARCHAR2) RETURN VARCHAR2 AS BEGIN DECLARE req UTL_HTTP.REQ; resp U

Kettle將資料轉成JSON格式後通過restClient傳送POST請求

第一步:處理好自己的資料,然後轉成JSON格式,使用JSON Output控制元件,並且把要轉成JSON併發送出去的欄位和元素名稱的對映關係對應好 資料條目行數選擇不填,填數字將會按照填寫的數字拆分資料,會導致後面傳送POST請求變成一條一條傳,效率低下 輸出值outputVal

Java工具類--通過HttpClient傳送http請求

在寫網路程式的時候,經常會有從網址獲取資料的需求,上一篇解析JSON就需要從百度獲取天氣資料,本文介紹一種Java傳送http請求的工具–HttpClient。 ##HttpClient的介紹 The most essential function of Ht

JavaSocket編寫傳送TCP請求的工具類

轉自:https://blog.csdn.net/jadyer/article/details/8788303 package com.jadyer.util; import java.io.ByteArrayOutputStream; import java.io.IOException;

通過PowerShell獲取TCP響應(類Telnet)

通常情況下,為了檢測指定的TCP埠是否存活,我們都是通過telnet指定的埠看是否有響應來確定,然而預設情況下win8以後的系統預設是不安裝telnet的。設想一下如果你黑進了一個伺服器,上面沒裝telnet,但是為了進一步滲透進內網,需要探測內部伺服器特定埠是否開啟,同時你還不願意安裝telnet,擔心引起

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下:

Multipart/form-data POST檔案上傳詳解 理論 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.soh

基於TCP傳送http請求建立連線與斷開連線的過程

首先說說TCP是什麼,HTTP又是什麼? TCP:傳輸控制協議,面向連線的,可靠地,安全的,基於位元組流的傳輸層協議 HTTP:超文字傳輸協議,但是這個協議是應用層傳輸協議,它是建立在TCP之上的協議 建立連線(三次握手):                        第

python通過get方式,post方式傳送http請求和接收http響應-urllib urllib2

測試用CGI,名字為test.py,放在apache的cgi-bin目錄下: #!/usr/bin/python import cgi def main():     print "Content-type: text/html\n"     form = cgi.FieldStorage()     i

java通過java.net.URL傳送http請求呼叫.net寫的webService介面

系統是用 java寫的,但需要呼叫同事用.net寫的一個webService介面。 所以記錄下java如何呼叫其他不同語言的介面的。 程式碼: 用到的工具類HttpUtil : package cn.com.comit.appointment.modules.wech

winpcap實現從TCP三次握手到傳送http請求

之前的文章我都是貼出了協議的格式,對具體欄位沒有具體說明,今天在這裡補充一下。 /* IP報文格式 0 8 16 32 +---------

python通過get方式,post方式,delete,put傳送http請求和接收http響應

測試用CGI,名字為test.py,放在apache的cgi-bin目錄下: #!/usr/bin/Python import cgi def main(): print "Content-type: text/html\n" form

C#通過GET/POST方式傳送Http請求

介紹http請求的兩種方式,get和post方式。並用C#語言實現,如何請求url並獲取返回的資料 兩者的區別: 引數 Get請求把提交的資料進行簡單編碼,同時將url的一部分發送到伺服器 比如url:Http://127.0.0.1/login.j

dva中不通過yield傳送封裝的請求並且獲取返回的資料

正常情況下我們會通過dispatch非同步傳送請求,但是資料非同步導致了一些問題,所以這裡我跳過了dispatch這一步,直接在函式中呼叫封裝的請求。但是封裝的請求返回的是一個promise物件,我們無法直接獲取其中的資料,以下是我的處理方法,如果有更好的處理方案,歡迎提供參

HttpClient通過Post方式傳送Json請求

 json 物件轉成string 。轉換的很多 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url);

【待解決】ajax傳送http請求後無法通過Spring Boot的modelAndView跳轉

問題:springboot提供的return modelandview可以非常簡便的返回到指定頁面並附帶各種引數。但是使用Ajax傳送請求時,雖然可以到達@requestMapping指示的方法,但是無法通過返回modelAndView的辦法跳轉頁面。。通過查詢資料後得知,這

通過Fiddler傳送請求

一.Fiddler簡介: Fiddler是一個http協議除錯代理工具,它能夠記錄並檢查所有你的電腦和網際網路之間的http通訊,設定斷點,檢視所有的“進出”Fiddler的資料(指cookie,html,js,css等檔案,這些都可以讓你胡亂

Android系列之網路(一)----使用HttpClient傳送HTTP請求通過get方法獲取資料)

轉載地址:http://www.cnblogs.com/smyhvae/p/4004983.html  這個關於http的內容寫的比較好 一、HTTP協議初探: HTTP(Hypertext Transfer Protocol)中文 “超文字傳輸協議”,是一種為分散式,

Android系列之網路(三)----使用HttpClient傳送HTTP請求(分別通過GET和POST方法傳送資料)

 【正文】 在前兩篇文章中,我們學習到了和HTTP相關的基礎知識。文章連結如下: 一、GET和POST的對比: 在漫長的時間當中,其他的方法逐漸的退出了歷史舞臺,最常用的只剩下GET和POST方法。而之前已經講過了通過GET方法獲取資料,今天來學習一下如何分別通過