2016-02-07 21 views
5

Tôi đang cố duyệt qua lệnh trên máy chủ web được nhúng bằng cách sử dụng wget/invoke-webrequest. Làm thế nào có thể tránh được lỗi này?Powershell vi phạm giao thức wget

wget: Máy chủ đã vi phạm giao thức. Section = ResponseHeader chi tiết = CR phải được theo sau bởi LF

Đã thử nhiều thứ, ví dụ dưới đây nhưng không thành công:

[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true} 

Khi sử dụng BITS thay vào đó, đây là lỗi tôi nhận được

start-bitstransfer: Máy chủ không trả về kích thước tệp. URL có thể trỏ đến nội dung động. Tiêu đề Content-Length không có sẵn trong trả lời HTTP của máy chủ.

Cảm ơn rất nhiều sự giúp đỡ của bạn Clem

+0

Vì vậy, bạn đã thử hai khách hàng: [wget] (https://www.gnu.org/software/wget/) (từ Powershell) và [Microsoft BITS] (https://msdn.microsoft.com/en-us/ thư viện/aa362708% 28v = vs.85% 29.aspx). Trong cả hai trường hợp, bạn nhận được "lỗi giao thức" từ máy chủ. Hmmm .... Q: Điều gì sẽ xảy ra nếu bạn chạy wget từ dòng lệnh, hoặc .bat tập tin? Q: Bạn có thể nói chuyện thành công với máy chủ từ * ANY * client không? Q: Máy chủ phải làm gì? chính xác là những gì * IS * phản ứng thất bại, và nó được thực hiện như thế nào? – paulsm4

+0

@ paulsm4 wget được đặt bí danh là 'Invoke-WebRequest' –

+0

Điều đó là đúng, có vấn đề tương tự với cả hai. Đang cố gắng tải xuống ảnh từ máy ảnh hỗ trợ WiFi. Kết nối với máy chủ nhúng là tốt. Khi tôi làm điều này cùng một chính xác trong Linux với wget nó hoạt động tốt. Rất thích sử dụng BITS. – clem

Trả lời

6

Thiết lập ServerCertificateValidationCallback đại biểu sẽ không giúp bạn - SSL/TLS là không giao thức được gọi - vi phạm giao thức là liên quan đến các HTTP tiêu đề (ví dụ: dài sau TLS đã được thiết lập).

Có một .NET configuration flag called useUnsafeHeaderParsing kiểm soát xem các vi phạm đó có bị bỏ qua hay không.

Sử dụng phản chiếu, nó cũng có thể được đặt từ thời gian chạy. This Technet forum answer Cung cấp cho nhân một ví dụ tuyệt vời về cách làm như vậy trong PowerShell, chúng ta có thể quấn rằng trong một chức năng tiện lợi như dưới đây:

function Set-UseUnsafeHeaderParsing 
{ 
    param(
     [Parameter(Mandatory,ParameterSetName='Enable')] 
     [switch]$Enable, 

     [Parameter(Mandatory,ParameterSetName='Disable')] 
     [switch]$Disable 
    ) 

    $ShouldEnable = $PSCmdlet.ParameterSetName -eq 'Enable' 

    $netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection]) 

    if($netAssembly) 
    { 
     $bindingFlags = [Reflection.BindingFlags] 'Static,GetProperty,NonPublic' 
     $settingsType = $netAssembly.GetType('System.Net.Configuration.SettingsSectionInternal') 

     $instance = $settingsType.InvokeMember('Section', $bindingFlags, $null, $null, @()) 

     if($instance) 
     { 
      $bindingFlags = 'NonPublic','Instance' 
      $useUnsafeHeaderParsingField = $settingsType.GetField('useUnsafeHeaderParsing', $bindingFlags) 

      if($useUnsafeHeaderParsingField) 
      { 
       $useUnsafeHeaderParsingField.SetValue($instance, $ShouldEnable) 
      } 
     } 
    } 
} 

Và sau đó sử dụng như:

Set-UseUnsafeHeaderParsing -Enable 

trước khi gọi Invoke-WebRequest

+0

Cảm ơn bạn đã trả lời nhanh Khi sử dụng phản ánh tôi nhận được lỗi này mà tôi không thể giải quyết Ngoại lệ gọi "SetValue" với "2" đối số (s): "Object of type 'System.Management.Automation.SwitchParameter 'không thể được chuyển đổi thành loại ' System.Boolean '. " – clem

+0

@clem Tôi đã cập nhật tập lệnh để tránh điều đó :) –

+0

Đó là nó, cảm ơn rất nhiều @Mathias !! – clem

Các vấn đề liên quan