在Windows中实现代理检查 | AI生成和翻译

Home 2025.02

要在 Windows 中使用 Git-Bash 和 PowerShell 实现代理检查,您需要在每个 shell 中设置机制,以检测何时执行与网络相关的命令,并在配置了代理设置时显示它们。以下是针对 Git-Bash 和 PowerShell 的步骤和代码。提到的”终端”很可能是指托管这些 shell 的 Windows 终端,因此我们将重点放在 Git-Bash 和 PowerShell 的实现上。


对于 Git-Bash

Git-Bash 是 Windows 上的 Bash 模拟器,我们可以使用 DEBUG 陷阱在每次命令执行前运行一个函数。目标是检查命令是否与网络相关,以及是否设置了代理设置,然后显示它们。

步骤:

  1. 定义网络相关命令列表。
  2. 创建一个函数来显示代理设置。
  3. 创建一个函数来检查命令和代理设置。
  4. 设置 DEBUG 陷阱,以便在每条命令之前运行检查。
  5. 定义一个手动的 checkproxy 函数,用于按需显示代理设置。
  6. 将所有配置添加到 .bashrc 文件中。

实现:

将以下代码添加到您的 ~/.bashrc 文件中(如果不存在则创建它):

# 网络相关命令列表
network_commands=(
    "gpa"
    "git"
    "ssh"
    "scp"
    "sftp"
    "rsync"
    "curl"
    "wget"
    "apt"
    "yum"
    "dnf"
    "npm"
    "yarn"
    "pip"
    "pip3"
    "gem"
    "cargo"
    "docker"
    "kubectl"
    "ping"
    "traceroute"
    "netstat"
    "ss"
    "ip"
    "ifconfig"
    "dig"
    "nslookup"
    "nmap"
    "telnet"
    "ftp"
    "nc"
    "tcpdump"
    "adb"
    "bundle"
    "brew"
    "cpanm"
    "bundle exec jekyll"
    "make"
    "python"
    "glcoud"
)

# 显示代理设置的函数
display_proxy() {
    echo -e "🚀 **检测到代理设置:**"
    [ -n "$HTTP_PROXY" ] && echo "   - HTTP_PROXY: $HTTP_PROXY"
    [ -n "$http_proxy" ] && echo "   - http_proxy: $http_proxy"
    [ -n "$HTTPS_PROXY" ] && echo "   - HTTPS_PROXY: $HTTPS_PROXY"
    [ -n "$https_proxy" ] && echo "   - https_proxy: $https_proxy"
    [ -n "$ALL_PROXY" ] && echo "   - ALL_PROXY: $ALL_PROXY"
    [ -n "$all_proxy" ] && echo "   - all_proxy: $all_proxy"
    echo ""
}

# 检查命令是否为网络相关以及是否设置了代理的函数
proxy_check() {
    local cmd
    # 提取命令的第一个词
    cmd=$(echo "$BASH_COMMAND" | awk '{print $1}')
    
    for network_cmd in "${network_commands[@]}"; do
        if [[ "$cmd" == "$network_cmd" ]]; then
            # 检查是否设置了任何代理环境变量
            if [ -n "$HTTP_PROXY" ] || [ -n "$http_proxy" ] || \
               [ -n "$HTTPS_PROXY" ] || [ -n "$https_proxy" ] || \
               [ -n "$ALL_PROXY" ] || [ -n "$all_proxy" ]; then
                display_proxy
            fi
            break
        fi
    done
}

# 设置 DEBUG 陷阱,在每条命令之前运行 proxy_check
trap 'proxy_check' DEBUG

# 手动检查代理设置的函数
checkproxy() {
    echo "HTTP_PROXY: $HTTP_PROXY"
    echo "HTTPS_PROXY: $HTTPS_PROXY"
    echo "Git HTTP 代理:"
    git config --get http.proxy
    echo "Git HTTPS 代理:"
    git config --get https.proxy
}

工作原理:

用法:


对于 PowerShell

PowerShell 没有与 Bash 的 DEBUG 陷阱直接等效的功能,但我们可以使用 PSReadLine 模块的 CommandValidationHandler 来实现类似的功能。此处理程序在每条命令之前运行,允许我们检查网络命令和代理设置。

步骤:

  1. 定义网络相关命令列表。
  2. 创建一个函数来显示代理设置。
  3. 设置 CommandValidationHandler 来检查命令和代理设置。
  4. 定义一个手动的 checkproxy 函数,用于按需显示代理设置。
  5. 将所有配置添加到您的 PowerShell 配置文件中。

实现:

首先,通过在 PowerShell 中运行 $PROFILE 来定位您的 PowerShell 配置文件。如果它不存在,请创建它:

New-Item -Type File -Force $PROFILE

将以下代码添加到您的 PowerShell 配置文件(例如 Microsoft.PowerShell_profile.ps1):

# 网络相关命令列表
$networkCommands = @(
    "gpa",
    "git",
    "ssh",
    "scp",
    "sftp",
    "rsync",
    "curl",
    "wget",
    "apt",
    "yum",
    "dnf",
    "npm",
    "yarn",
    "pip",
    "pip3",
    "gem",
    "cargo",
    "docker",
    "kubectl",
    "ping",
    "traceroute",
    "netstat",
    "ss",
    "ip",
    "ifconfig",
    "dig",
    "nslookup",
    "nmap",
    "telnet",
    "ftp",
    "nc",
    "tcpdump",
    "adb",
    "bundle",
    "brew",
    "cpanm",
    "bundle exec jekyll",
    "make",
    "python",
    "glcoud"
)

# 显示代理设置的函数
function Display-Proxy {
    Write-Host "🚀 **检测到代理设置:**"
    if ($env:HTTP_PROXY) { Write-Host "   - HTTP_PROXY: $env:HTTP_PROXY" }
    if ($env:http_proxy) { Write-Host "   - http_proxy: $env:http_proxy" }
    if ($env:HTTPS_PROXY) { Write-Host "   - HTTPS_PROXY: $env:HTTPS_PROXY" }
    if ($env:https_proxy) { Write-Host "   - https_proxy: $env:https_proxy" }
    if ($env:ALL_PROXY) { Write-Host "   - ALL_PROXY: $env:ALL_PROXY" }
    if ($env:all_proxy) { Write-Host "   - all_proxy: $env:all_proxy" }
    Write-Host ""
}

# 设置 CommandValidationHandler 在执行前检查命令
Set-PSReadLineOption -CommandValidationHandler {
    param($command)
    # 提取命令的第一个词
    $cmd = ($command -split ' ')[0]
    
    if ($networkCommands -contains $cmd) {
        # 检查是否设置了任何代理环境变量
        if ($env:HTTP_PROXY -or $env:http_proxy -or $env:HTTPS_PROXY -or $env:https_proxy -or $env:ALL_PROXY -or $env:all_proxy) {
            Display-Proxy
        }
    }
    # 始终返回 true 以允许命令执行
    return $true
}

# 手动检查代理设置的函数
function checkproxy {
    Write-Host "HTTP_PROXY: $env:HTTP_PROXY"
    Write-Host "HTTPS_PROXY: $env:HTTPS_PROXY"
    Write-Host "Git HTTP 代理:"
    git config --get http.proxy
    Write-Host "Git HTTPS 代理:"
    git config --get https.proxy
}

工作原理:

要求:

用法:


关于”终端”的说明


其他注意事项


测试


此实现在 Git-Bash 和 PowerShell 中都提供了强大的代理检查功能,适用于在 Windows 终端内或独立使用。


Back Donate