2015-09-03 58 views
1

我需要編寫一個腳本來檢查大量的Web資源,以查看它們是否需要HTTP身份驗證才能查看。有沒有一種快速檢查網頁/資源是否需要登錄憑證的方法?

有沒有一個快速的方法來做到這一點,無論是批處理文件或shell腳本。 (或PowerShell)。我已經嘗試了一些不同的腳本,但總是得到一個HTTP 200狀態碼(成功)

我需要輸出是這樣的:

Url       http code credentials needed? 
www.mywebsite.com/en/page.jsp 200   yes 

一個401碼會工作爲好,只要因爲我知道它要求憑證。

這是我使用的一個小的powershell腳本,但這並不像我想的那樣工作。 (請求似乎超時的大部分時間):

## The URI list to test 
$URLListFile = "C:\URLList1.txt" 
$URLList = Get-Content $URLListFile -ErrorAction SilentlyContinue 
$Result = @() 

"<HTML><TITLE>Website Availability Report</TITLE><BODY background-color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Availability Report </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B>StatusCode</B></TD><TD><B>StatusDescription</B></TD><TD><B>ResponseLength</B></TD><TD><B>TimeTaken</B>  </TD</TR>" |Out-File -append C:\Scripts\Test.htm 

Foreach($Uri in $URLList) { 

Write-Host $Uri 

$request = $null 
$request = [system.Net.WebRequest]::Create($Uri) 
$request.Credentials = new-object System.Net.NetworkCredential("", ""); 
$request.PreAuthenticate = $true 
$request.timeout = 2000 

$time = try{ 
    $response = $request.GetResponse() 
} catch [System.Net.WebException] { 
    $request = $_.Exception.Response 
    $time = -1 
} 

$result = [PSCustomObject] @{ 
    Time = Get-Date; 
    Uri = $uri; 
    StatusCode = [int] $response.StatusCode; 
    StatusDescription = $response.StatusDescription; 
    ResponseLength = $response.RawContentLength; 
    auth = $response.IsMutuallyAuthenticated; 
    TimeTaken = $time; 
} 

foreach($Entry in $result){ 
    if($Entry.StatusCode -ne "200") 
    { 
     "<TR bgcolor=red>" |Out-File -append C:\Scripts\Test.htm 
    } 
    else 
    { 
     "<TR>" |Out-File -append C:\Scripts\Test.htm 
    } 
    "<TD>$($Entry.uri)</TD><TD align=center>$($Entry.StatusCode)</TD><TD align=center>$($Entry.StatusDescription)</TD><TD align=center>$($Entry.ResponseLength)</TD><TD align=center>$($Entry.timetaken)</TD></TD><TD align=center>$($Entry.auth)</TD></TR>" |Out-File -append C:\Scripts\Test.htm 
} 
$request=$null; 
$response=$null; 

} 
"<HTML><TITLE>Website Availability Report</TITLE><BODY background- color:peachpuff><font color =""#99000"" face=""Microsoft Tai le""><H2> Website Availability Report </H2></font><Table border=1 cellpadding=0 cellspacing=0><TR bgcolor=gray align=center><TD><B>URL</B></TD><TD><B>StatusCode</B></TD><TD><B>StatusDescription</B></TD><TD><B>ResponseLength</B></TD><TD><B>TimeTaken</B></TD</TR>" |Out-File -append C:\Scripts\Test.htm 
"</Table></BODY></HTML>" |Out-File -append C:\Scripts\Test.htm 
Invoke-Expression C:\Scripts\Test.htm 
+1

不,沒有通用的方式來判斷一個頁面是否需要登錄。這是因爲它通常是基於你的意圖的人類判斷(想要發佈的人會說StackOverflow需要登錄,只是想瀏覽的人會說它不會。) –

+0

這是一個基本的apache驗證登錄,是否會改變任何東西?當我取消登錄對話框時,我得到了401。 – Native

+1

是的,這有很大的不同(我更新了措辭)。可悲的是,我不知道powershell,但是如果有人在尋找Unix shell等價物時發現你的問題,它會是'[「$(curl --silent -w」%{http_code}「http://example.com/-o/dev/null)「=」401「]')。 –

回答

0

通過身份驗證失敗引發的異常包含與服務器響應嵌套異常:

try { 
    $response = $request.GetResponse() 
} catch { 
    $statusCode = $_.Exception.InnerException.Response.StatusCode.value__ 
    if ($statusCode -eq 401) { 'Authentication required.' } 
} 

請注意,這僅適用於HTTP認證。我認爲沒有可靠的方法來確定網站是否需要在應用程序級別進行身份驗證。

相關問題