【问题标题】:wget is not using environment variable based proxy settingswget 没有使用基于环境变量的代理设置
【发布时间】:2016-06-26 18:46:12
【问题描述】:

我有一个 windows nano 服务器并尝试设置代理设置。 nano 服务器仅处于命令模式,没有 GUI。我已经在 PowerShell 中运行了

netsh winhttp set proxy proxy-server="ipadress:8080"

那我有

ping www.google.de 

并且显示了来自 google 的 IP 地址,因此存在一些连接。但是当我尝试运行时

wget www.google.de 

我明白了

"Unable to connect to the remote server"

然后我在PowerShell环境中设置了代理

set http_proxy="ipadress:8080" and https_proxy...

但同样的问题。当我使用代理设置直接调用 wget 时,它可以工作:

wget 'http://www.google.de' -Proxy http://ipadress:8080

如何让wget 使用全局代理设置?还是设置不正确?还是需要我安装一些 Windows 功能才能正常工作?

我稍后使用wget 测试连接,任何程序的任何网络请求都应该可以工作。

【问题讨论】:

  • 运行netsh winhtp set... 时返回了什么?重新启动后发生了什么(以确保您获得一个新的 powershell 会话,以防万一它没有选择新设置)?
  • netsh winhttp set -- 在“代理服务器”中返回了正确的代理配置。我重新启动服务时间没有变化。
  • 您是如何在 Nano Server 上运行 wget 'http://www.google.de' -Proxy http://ipadress:8080 的? wgetInvoke-WebRequest 的别名,我认为 Nano Server 上不可用
  • Invoke-WebRequest 在这个 nano server build 上可用

标签: windows powershell proxy wget nano-server


【解决方案1】:

很确定您的问题是您没有设置环境变量并且在 cmd exe 和 PowerShell cmdlet 之间混淆了。正如我们从(我希望的)documentation for wget concerning proxy information 中读到的:

Wget 识别的指定代理位置的标准方法是使用以下环境变量:

  • http_proxy
  • https_proxy

这正是您在此处尝试执行的操作,这是一个成功的操作(没有错误),但没有按预期工作。

set http_proxy="ipadress:8080"

问题是,如果你在 PowerShell 中运行它,setSet-Variable 的别名。见Get-Alias set

PS C:\Users\matt> Get-Variable http*

Name                           Value                                                                                        
----                           -----                                                                                        
http_proxy=ipadress:8080     

您还遇到wget 的问题,因为它是Invoke-WebRequest 的别名。如果您至少拥有看起来拥有的 PowerShell 3.0 版,那只会是一个问题。在您的工作示例中,您使用的是 cmdlet 语法 (-Proxy ...)。

在这两种情况下(set 和不工作的wget),命令都是模棱两可的,PowerShell 不得不尝试将其与某些东西匹配......

所以我们在这里看到的是about_Command_Precedence 开始发挥作用

如果不指定路径,Windows PowerShell 在运行命令时使用以下优先顺序:

  1. 别名
  2. 功能
  3. Cmdlet
  4. 本机 Windows 命令

本机 Windows 命令是列表中的最后一个!确实,如果您在 PowerShell 中执行此操作,您不妨使用 PowerShell cmdlet 来设置您的环境变量(如果您坚持使用 wget)。我唯一不确定的是您应该使用哪种方法,第一种方法不应该保留第二种方法永久存在的会话。当然第一个就足够了,但如果您想在会话之间将这些设置保留在计算机上,请使用第二个。

  1. $env:http_proxy = "ipaddress:8080"
  2. [Environment]::SetEnvironmentVariable("http_proxy", "ipaddress:8080", "Machine")

您可以阅读more on this from TechNet。还要注意“地址”的拼写


如果您要使用 cmd 实用程序,请确保附加 .exe,如果您未指定资源的完整路径,请确保其目录是路径环境变量的一部分。

【讨论】:

  • @FrodeF。我没有足够的使用它来让我想起它。 op 可能让两个人混淆了,tab 意外地完成了一些事情。我认为我的更新涵盖了 OP 正在做什么......混淆 gnu wget 和 Invoke-Webrequest 的用法和语法
【解决方案2】:

powershell commandlet 存在问题,wget 是 Invoke-WebRequest 的快捷方式,无法与需要身份验证的代理一起使用。它不是唯一不能与代理一起使用的命令行开关。最简单的方法是使用 cntlm

设置代理并将其用作代理,它正在工作。

【讨论】:

    猜你喜欢
    • 2013-08-30
    • 2020-08-04
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多