Windows下WSL子系统安装及优化。

适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。

前言

WSL 可以方便地使用 Linux 来进行一些操作,不需要到 VPS 运行,使用中发现连接本地代理并不是简单的使用 127.0.0.1,发现已经有人写了现成的脚本,所以复制过来,简单记录一下,除此之外再记录一下其终端的美化。

安装

直接在终端输入安装命令,默认安装的是商店版本的 WSL2

POWERSHELL
wsl --list --online
wsl --install
点击展开查看更多

如果需要完整的说明可以参考:官方文档

WSL 配置

在 Windows 用户目录下创建文件 .wslconfig,添加如下配置:

TOML
[wsl2]
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=false # 设置为 true 自动使用 Windows 代理
ipv6=true



[experimental]
sparseVhd=true
hostAddressLoopback=true
autoMemoryReclaim=gradual
点击展开查看更多

配置文件会把 WSL 的网络模式改为镜像模式,可以直接使用 Windows 的网络,共享 IP 地址。

Root 登录

在 wsl 系统中 /etc/wsl.conf 配置中添加:

TOML
[user]
default=root
点击展开查看更多

设置代理

如果上述配置中 autoProxy=false ,需要手动配置代理解决网络问题,通过脚本文件来为环境设置代理,方法参考:WSL2 中访问宿主机 Windows 的代理 进行了优化。脚本包括环境、Git 以及 docker pull 的代理设置。

系统环境

新建一个脚本文件 proxy.sh 并添加执行权限。

BASH
touch ./proxy.sh
chmod +x ./proxy.sh
vim ./proxy.sh
点击展开查看更多
BASH
#!/bin/bash

# WSL 环境变量代理管理脚本
# 仅负责当前会话的环境变量代理设置

# 配置参数
DEFAULT_HTTP_PORT=7890
DEFAULT_HOST="127.0.0.1"  # 镜像模式使用
# DEFAULT_HOST=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')  # NAT模式使用

# 检测脚本调用方式
detect_source_call() {
    [[ "${BASH_SOURCE[0]}" != "${0}" ]]
}

# 安全退出函数
safe_exit() {
    local code=${1:-0}
    if detect_source_call; then
        # 在source模式下,设置一个特殊变量来标记退出
        _PROXY_SCRIPT_EXIT=1
        return $code
    else
        exit $code
    fi
}

# 获取配置
get_proxy_config() {
    local host=${1:-$DEFAULT_HOST}
    local port=${2:-$DEFAULT_HTTP_PORT}
    echo "http://${host}:${port}"
}

# 设置环境变量代理
set_env_proxy() {
    local proxy_url=$(get_proxy_config)
    echo "Setting environment proxy to: ${proxy_url}"
    
    export http_proxy="${proxy_url}"
    export HTTP_PROXY="${proxy_url}"
    export https_proxy="${proxy_url}"
    export HTTPS_PROXY="${proxy_url}"
    export no_proxy="localhost,127.0.0.1,::1"
    export NO_PROXY="localhost,127.0.0.1,::1"
    
    echo "✓ Environment proxy set successfully!"
}

# 取消环境变量代理
unset_env_proxy() {
    echo "Unsetting environment proxy..."
    
    unset http_proxy
    unset HTTP_PROXY
    unset https_proxy
    unset HTTPS_PROXY
    unset no_proxy
    unset NO_PROXY
    
    echo "✓ Environment proxy unset successfully!"
}

# 检查环境变量代理状态
check_env_status() {
    local proxy_url=$(get_proxy_config)
    
    echo "==================== Environment Proxy Status ===================="
    echo "Configuration:"
    echo "  Default Host: ${DEFAULT_HOST}"
    echo "  Default Port: ${DEFAULT_HTTP_PORT}"
    echo "  Proxy URL: ${proxy_url}"
    echo ""
    echo "Current Environment Variables:"
    echo "  http_proxy: ${http_proxy:-Not set}"
    echo "  https_proxy: ${https_proxy:-Not set}"
    echo "  no_proxy: ${no_proxy:-Not set}"
    echo "=================================================================="
}

# 测试环境变量代理连通性
test_env_connectivity() {
    echo "==================== Environment Proxy Test ===================="
    
    # 测试网站列表
    local sites=("https://www.google.com" "https://github.com" "https://raw.githubusercontent.com")
    
    for site in "${sites[@]}"; do
        local name=$(echo "$site" | sed 's/https:\/\/\(www\.\)\?//' | sed 's/\/.*//')
        echo -n "Testing ${name}... "
        
        if curl -I --connect-timeout 5 --max-time 10 "$site" > /dev/null 2>&1; then
            echo "✓ Accessible"
        else
            echo "✗ Not accessible"
        fi
    done
    echo "================================================================"
}

# 显示帮助
show_help() {
    echo "WSL Environment Proxy Management Script"
    echo ""
    echo "⚠️  This script MUST be called with 'source' to work!"
    echo ""
    echo "Usage: source $0 [command]"
    echo ""
    echo "Commands:"
    echo "  set        Set environment proxy"
    echo "  unset      Unset environment proxy"
    echo "  status     Check environment proxy status"
    echo "  test       Test environment proxy connectivity"
    echo "  check      Check status + test connectivity"
    echo "  menu       Show interactive menu"
    echo "  help       Show this help message"
    echo ""
    echo "💡 Pro Tips:"
    echo "  - Add 'alias proxy=\"source $0\"' to ~/.bashrc"
    echo "  - This only affects current shell session"
    echo "  - Use proxy-git.sh and proxy-docker.sh for persistent settings"
}

# 显示交互菜单
show_menu() {
    local proxy_url=$(get_proxy_config)
    
    # 重置退出标志
    unset _PROXY_SCRIPT_EXIT
    
    while true; do
        # 检查退出标志
        if [[ "${_PROXY_SCRIPT_EXIT}" == "1" ]]; then
            unset _PROXY_SCRIPT_EXIT
            break
        fi
        
        echo ""
        echo "=============== Environment Proxy Manager ==============="
        echo "Current Configuration: ${proxy_url}"
        echo ""
        
        if ! detect_source_call; then
            echo "⚠️  WARNING: Script not sourced! Commands won't work."
            echo "   Please run: source $0 menu"
            echo ""
        fi
        
        echo "Environment Proxy Commands:"
        echo "  1) Set Environment Proxy"
        echo "  2) Unset Environment Proxy" 
        echo "  3) Check Proxy Status"
        echo "  4) Test Connectivity"
        echo "  5) Check Status + Test"
        echo ""
        echo "  0) Exit"
        echo "======================================================="
        echo -n "Select option [0-5]: "
        read -r choice
        
        case $choice in
            1) 
                echo ""
                if ! detect_source_call; then
                    echo "⚠️  Please run: source $0 menu"
                else
                    set_env_proxy
                fi
                ;;
            2) 
                echo ""
                if ! detect_source_call; then
                    echo "⚠️  Please run: source $0 menu"
                else
                    unset_env_proxy
                fi
                ;;
            3) echo ""; check_env_status ;;
            4) echo ""; test_env_connectivity ;;
            5) echo ""; check_env_status; echo ""; test_env_connectivity ;;
            6) 
                echo ""
                echo "Goodbye!"
                safe_exit 0
                ;;
            *) echo ""; echo "Invalid option. Please select 0-5." ;;
        esac
        
        # 检查是否需要退出
        if [[ "${_PROXY_SCRIPT_EXIT}" == "1" ]]; then
            unset _PROXY_SCRIPT_EXIT
            break
        fi
        
        echo ""
        echo -n "Press Enter to continue..."
        read -r
    done
}

# 主程序逻辑
main() {
    local cmd="$1"
    
    # 检查是否被source调用
    if ! detect_source_call; then
        echo "⚠️  ERROR: This script MUST be called with 'source'!"
        echo ""
        echo "Correct usage:"
        echo "  source $0 [command]"
        echo ""
        echo "Example:"
        echo "  source $0 set"
        echo "  source $0 menu"
        echo ""
        exit 1
    fi
    
    # 如果没有参数,显示菜单
    if [[ -z "$cmd" ]]; then
        show_menu
        return
    fi
    
    # 执行对应的命令
    case "$cmd" in
        "set") set_env_proxy ;;
        "unset") unset_env_proxy ;;
        "status") check_env_status ;;
        "test") test_env_connectivity ;;
        "check") check_env_status; echo ""; test_env_connectivity ;;
        "menu") show_menu ;;
        "help") show_help ;;
        *) 
            echo "Error: Unknown command '$cmd'"
            echo ""
            show_help
            safe_exit 1
            ;;
    esac
}

# 执行主程序
main "$@"
点击展开查看更多

Git

Git 的代理设置是写入在全局配置环境中,因此设置一次即可。

BASH
#!/bin/bash

# Git 代理管理脚本
# 独立管理Git的全局代理配置

# 配置参数
DEFAULT_HTTP_PORT=7890
DEFAULT_HOST="127.0.0.1"

# 获取配置
get_proxy_config() {
    local host=${1:-$DEFAULT_HOST}
    local port=${2:-$DEFAULT_HTTP_PORT}
    echo "http://${host}:${port}"
}

# 设置Git代理
set_git_proxy() {
    local proxy_url=$(get_proxy_config)
    echo "Setting Git proxy to: ${proxy_url}"
    
    git config --global http.proxy "${proxy_url}"
    git config --global https.proxy "${proxy_url}"
    
    echo "✓ Git proxy set successfully!"
    echo "  All git operations will use proxy: ${proxy_url}"
}

# 取消Git代理
unset_git_proxy() {
    echo "Unsetting Git proxy..."
    
    git config --global --unset http.proxy 2>/dev/null || true
    git config --global --unset https.proxy 2>/dev/null || true
    
    echo "✓ Git proxy unset successfully!"
}

# 检查Git代理状态
check_git_status() {
    echo "==================== Git Proxy Status ===================="
    echo "Global Git Proxy Settings:"
    local git_http=$(git config --global --get http.proxy 2>/dev/null || echo "Not set")
    local git_https=$(git config --global --get https.proxy 2>/dev/null || echo "Not set")
    echo "  http.proxy: ${git_http}"
    echo "  https.proxy: ${git_https}"
    echo "==========================================================="
}

# 测试Git连接
test_git_connectivity() {
    echo "==================== Git Connectivity Test ===================="
    
    local test_repos=(
        "https://github.com/octocat/Hello-World.git"
        "https://gitlab.com/gitlab-org/gitlab.git"
    )
    
    for repo in "${test_repos[@]}"; do
        local name=$(echo "$repo" | sed 's/https:\/\/\([^\/]*\).*/\1/')
        echo -n "Testing ${name}... "
        
        if timeout 10 git ls-remote --exit-code "$repo" > /dev/null 2>&1; then
            echo "✓ Accessible"
        else
            echo "✗ Not accessible"
        fi
    done
    echo "================================================================"
}

# 显示帮助
show_help() {
    echo "Git Proxy Management Script"
    echo ""
    echo "Usage: $0 [command]"
    echo ""
    echo "Commands:"
    echo "  set                    Set global Git proxy"
    echo "  unset                  Unset global Git proxy"
    echo "  status                 Check Git proxy settings"
    echo "  test                   Test Git connectivity"
    echo "  check                  Check status + test connectivity"
    echo "  menu                   Show interactive menu"
    echo "  help                   Show this help message"
    echo ""
    echo "Examples:"
    echo "  $0 set"
    echo "  $0 unset"
    echo "  $0 status"
}

# 显示交互菜单
show_menu() {
    local proxy_url=$(get_proxy_config)
    
    while true; do
        echo ""
        echo "=================== Git Proxy Manager ==================="
        echo "Current Configuration: ${proxy_url}"
        echo ""
        echo "Git Proxy Commands:"
        echo "  1) Set Global Git Proxy"
        echo "  2) Unset Global Git Proxy"
        echo "  3) Check Git Proxy Status"
        echo "  4) Test Git Connectivity"
        echo "  5) Check Status + Test"
        echo ""
        echo "  0) Exit"
        echo "======================================================="
        echo -n "Select option [0-5]: "
        read -r choice
        
        case $choice in
            1) echo ""; set_git_proxy ;;
            2) echo ""; unset_git_proxy ;;
            3) echo ""; check_git_status ;;
            4) echo ""; test_git_connectivity ;;
            5) echo ""; check_git_status; echo ""; test_git_connectivity ;;
            6) echo ""; echo "Goodbye!"; exit 0 ;;
            *) echo ""; echo "Invalid option. Please select 0-5." ;;
        esac
        
        echo ""
        echo -n "Press Enter to continue..."
        read -r
    done
}

# 主程序逻辑
main() {
    local cmd="$1"
    
    # 如果没有参数,显示菜单
    if [[ -z "$cmd" ]]; then
        show_menu
        return
    fi
    
    # 执行对应的命令
    case "$cmd" in
        "set") set_git_proxy ;;
        "unset") unset_git_proxy ;;
        "status") check_git_status ;;
        "test") test_git_connectivity ;;
        "check") check_git_status; echo ""; test_git_connectivity ;;
        "menu") show_menu ;;
        "help") show_help ;;
        *) 
            echo "Error: Unknown command '$cmd'"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# 执行主程序
main "$@"
点击展开查看更多

Docker

Docker 的代理设置分为两种,一种是拉取推送镜像时的代理,另一种是构建或者运行时的代理,二者写入的文件不同。

BASH
#!/bin/bash

# Docker 完整代理管理脚本
# 管理Docker的各种代理设置:pull、run、build等

# 配置参数
DEFAULT_HTTP_PORT=7890
DEFAULT_HOST="127.0.0.1"

# 配置文件路径
DOCKER_SERVICE_DIR="/etc/systemd/system/docker.service.d"
DOCKER_PROXY_CONF="${DOCKER_SERVICE_DIR}/http-proxy.conf"
DOCKER_CONFIG_DIR="$HOME/.docker"
DOCKER_CONFIG_FILE="${DOCKER_CONFIG_DIR}/config.json"

# 获取配置
get_proxy_config() {
    local host=${1:-$DEFAULT_HOST}
    local port=${2:-$DEFAULT_HTTP_PORT}
    echo "http://${host}:${port}"
}

# 检查权限
check_sudo() {
    if [[ $EUID -ne 0 ]] && ! sudo -n true 2>/dev/null; then
        echo "⚠️  Some operations require sudo privileges."
        echo "   Please ensure you can run sudo commands."
    fi
}

# 设置Docker守护进程代理(用于pull镜像)
set_docker_daemon_proxy() {
    local proxy_url=$(get_proxy_config)
    echo "Setting Docker daemon proxy to: ${proxy_url}"
    
    # 创建目录
    sudo mkdir -p "$DOCKER_SERVICE_DIR"
    
    # 写入配置文件
    echo "[Service]" | sudo tee "$DOCKER_PROXY_CONF" > /dev/null
    echo "Environment=\"HTTP_PROXY=${proxy_url}\"" | sudo tee -a "$DOCKER_PROXY_CONF" > /dev/null
    echo "Environment=\"HTTPS_PROXY=${proxy_url}\"" | sudo tee -a "$DOCKER_PROXY_CONF" > /dev/null
    echo "Environment=\"NO_PROXY=localhost,127.0.0.1,::1\"" | sudo tee -a "$DOCKER_PROXY_CONF" > /dev/null
    
    # 重新加载Docker服务
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    echo "✓ Docker daemon proxy set successfully!"
}

# 取消Docker守护进程代理
unset_docker_daemon_proxy() {
    echo "Unsetting Docker daemon proxy..."
    
    if [[ -f "$DOCKER_PROXY_CONF" ]]; then
        sudo rm -f "$DOCKER_PROXY_CONF"
        sudo systemctl daemon-reload
        sudo systemctl restart docker
        echo "✓ Docker daemon proxy unset successfully!"
    else
        echo "No Docker proxy configuration found."
    fi
}

# 设置Docker客户端代理(用于docker命令)
set_docker_client_proxy() {
    local proxy_url=$(get_proxy_config)
    echo "Setting Docker client proxy to: ${proxy_url}"
    
    mkdir -p "$DOCKER_CONFIG_DIR"
    
    # 创建或更新配置文件
    echo "{" | tee "$DOCKER_CONFIG_FILE" > /dev/null
    echo "  \"proxies\": {" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "    \"default\": {" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "      \"httpProxy\": \"${proxy_url}\"," | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "      \"httpsProxy\": \"${proxy_url}\"," | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "      \"noProxy\": \"localhost,127.0.0.1,::1\"" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "    }" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "  }" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    echo "}" | tee -a "$DOCKER_CONFIG_FILE" > /dev/null
    
    echo "✓ Docker client proxy set successfully!"
}

# 取消Docker客户端代理
unset_docker_client_proxy() {
    echo "Unsetting Docker client proxy..."
    
    if [[ -f "$DOCKER_CONFIG_FILE" ]]; then
        rm -f "$DOCKER_CONFIG_FILE"
        echo "✓ Docker client proxy unset successfully!"
    else
        echo "No Docker client proxy configuration found."
    fi
}

# 检查Docker代理状态
check_docker_status() {
    echo "==================== Docker Proxy Status ===================="
    echo "Docker Daemon Proxy Configuration:"
    if [[ -f "$DOCKER_PROXY_CONF" ]]; then
        echo "  Proxy configuration found."
    else
        echo "  No proxy configuration found."
    fi
    
    echo "Docker Client Proxy Configuration:"
    if [[ -f "$DOCKER_CONFIG_FILE" ]]; then
        cat "$DOCKER_CONFIG_FILE"
    else
        echo "  No client proxy configuration found."
    fi
    echo "============================================================="
}

# 显示帮助
show_help() {
    echo "Docker Proxy Management Script"
    echo ""
    echo "Usage: $0 [command]"
    echo ""
    echo "Commands:"
    echo "  set-daemon            Set Docker daemon proxy"
    echo "  unset-daemon          Unset Docker daemon proxy"
    echo "  set-client            Set Docker client proxy"
    echo "  unset-client          Unset Docker client proxy"
    echo "  status                Check Docker proxy settings"
    echo "  help                  Show this help messa#!/bin/bash

# Docker 完整代理管理脚本
# 管理Docker的各种代理设置:pull/push、build/run等

# 配置参数
DEFAULT_HTTP_PORT=10808
DEFAULT_HOST="127.0.0.1"

# 配置文件路径
DOCKER_SERVICE_DIR="/etc/systemd/system/docker.service.d"
DOCKER_PROXY_CONF="${DOCKER_SERVICE_DIR}/http-proxy.conf"
DOCKER_CONFIG_DIR="$HOME/.docker"
DOCKER_CONFIG_FILE="${DOCKER_CONFIG_DIR}/config.json"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 获取配置
get_proxy_config() {
    local host=${1:-$DEFAULT_HOST}
    local port=${2:-$DEFAULT_HTTP_PORT}
    echo "http://${host}:${port}"
}

# 检查权限
check_sudo() {
    if [[ $EUID -ne 0 ]] && ! sudo -n true 2>/dev/null; then
        echo -e "${YELLOW}⚠️  Some operations require sudo privileges.${NC}"
        echo "   Please ensure you can run sudo commands."
        echo
    fi
}

# 设置Docker Pull/Push代理(用于拉取推送镜像)
set_docker_pull_push_proxy() {
    local proxy_url=$(get_proxy_config)
    echo -e "${BLUE}Setting Docker Pull/Push proxy to: ${proxy_url}${NC}"
    
    # 创建目录
    if ! sudo mkdir -p "$DOCKER_SERVICE_DIR"; then
        echo -e "${RED}❌ Failed to create directory: $DOCKER_SERVICE_DIR${NC}"
        return 1
    fi
    
    # 写入配置文件
    {
        echo "[Service]"
        echo "Environment=\"HTTP_PROXY=${proxy_url}\""
        echo "Environment=\"HTTPS_PROXY=${proxy_url}\""
        echo "Environment=\"NO_PROXY=localhost,127.0.0.1,::1\""
    } | sudo tee "$DOCKER_PROXY_CONF" > /dev/null
    
    # 重新加载Docker服务
    if sudo systemctl daemon-reload && sudo systemctl restart docker; then
        echo -e "${GREEN}✓ Docker Pull/Push proxy set successfully!${NC}"
    else
        echo -e "${RED}❌ Failed to restart Docker service${NC}"
        return 1
    fi
}

# 取消Docker Pull/Push代理
unset_docker_pull_push_proxy() {
    echo -e "${BLUE}Unsetting Docker Pull/Push proxy...${NC}"
    
    if [[ -f "$DOCKER_PROXY_CONF" ]]; then
        if sudo rm -f "$DOCKER_PROXY_CONF" && sudo systemctl daemon-reload && sudo systemctl restart docker; then
            echo -e "${GREEN}✓ Docker Pull/Push proxy unset successfully!${NC}"
        else
            echo -e "${RED}❌ Failed to unset Docker Pull/Push proxy${NC}"
            return 1
        fi
    else
        echo -e "${YELLOW}No Docker Pull/Push proxy configuration found.${NC}"
    fi
}

# 设置Docker Build/Run代理(用于容器内网络访问)
set_docker_build_run_proxy() {
    local proxy_url=$(get_proxy_config)
    echo -e "${BLUE}Setting Docker Build/Run proxy to: ${proxy_url}${NC}"
    
    # 创建目录
    mkdir -p "$DOCKER_CONFIG_DIR"
    
    # 备份现有配置
    if [[ -f "$DOCKER_CONFIG_FILE" ]]; then
        cp "$DOCKER_CONFIG_FILE" "${DOCKER_CONFIG_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
    fi
    
    # 创建或更新配置文件
    cat > "$DOCKER_CONFIG_FILE" << EOF
{
  "proxies": {
    "default": {
      "httpProxy": "${proxy_url}",
      "httpsProxy": "${proxy_url}",
      "noProxy": "localhost,127.0.0.1,::1"
    }
  }
}
EOF
    
    if [[ $? -eq 0 ]]; then
        echo -e "${GREEN}✓ Docker Build/Run proxy set successfully!${NC}"
    else
        echo -e "${RED}❌ Failed to set Docker Build/Run proxy${NC}"
        return 1
    fi
}

# 取消Docker Build/Run代理
unset_docker_build_run_proxy() {
    echo -e "${BLUE}Unsetting Docker Build/Run proxy...${NC}"
    
    if [[ -f "$DOCKER_CONFIG_FILE" ]]; then
        # 备份现有配置
        cp "$DOCKER_CONFIG_FILE" "${DOCKER_CONFIG_FILE}.backup.$(date +%Y%m%d_%H%M%S)"
        
        # 删除配置文件
        if rm -f "$DOCKER_CONFIG_FILE"; then
            echo -e "${GREEN}✓ Docker Build/Run proxy unset successfully!${NC}"
        else
            echo -e "${RED}❌ Failed to unset Docker Build/Run proxy${NC}"
            return 1
        fi
    else
        echo -e "${YELLOW}No Docker Build/Run proxy configuration found.${NC}"
    fi
}

# 检查Docker代理状态
check_docker_status() {
    echo -e "${BLUE}==================== Docker Proxy Status ====================${NC}"
    echo
    echo -e "${YELLOW}Docker Pull/Push Proxy Configuration:${NC}"
    if [[ -f "$DOCKER_PROXY_CONF" ]]; then
        echo -e "${GREEN}  ✓ Proxy configuration found at: $DOCKER_PROXY_CONF${NC}"
        echo "  Configuration:"
        sudo cat "$DOCKER_PROXY_CONF" | sed 's/^/    /'
    else
        echo -e "${RED}  ❌ No Pull/Push proxy configuration found${NC}"
    fi
    
    echo
    echo -e "${YELLOW}Docker Build/Run Proxy Configuration:${NC}"
    if [[ -f "$DOCKER_CONFIG_FILE" ]]; then
        echo -e "${GREEN}  ✓ Proxy configuration found at: $DOCKER_CONFIG_FILE${NC}"
        echo "  Configuration:"
        cat "$DOCKER_CONFIG_FILE" | sed 's/^/    /'
    else
        echo -e "${RED}  ❌ No Build/Run proxy configuration found${NC}"
    fi
    
    echo
    echo -e "${YELLOW}Current Proxy Settings:${NC}"
    local proxy_url=$(get_proxy_config)
    echo "  Proxy URL: $proxy_url"
    echo -e "${BLUE}=============================================================${NC}"
}

# 一键设置所有代理
set_all_proxies() {
    echo -e "${BLUE}Setting all Docker proxies...${NC}"
    echo
    
    if set_docker_pull_push_proxy && set_docker_build_run_proxy; then
        echo
        echo -e "${GREEN}✓ All Docker proxies set successfully!${NC}"
    else
        echo
        echo -e "${RED}❌ Failed to set some proxies${NC}"
        return 1
    fi
}

# 一键清除所有代理
unset_all_proxies() {
    echo -e "${BLUE}Unsetting all Docker proxies...${NC}"
    echo
    
    unset_docker_pull_push_proxy
    unset_docker_build_run_proxy
    
    echo
    echo -e "${GREEN}✓ All Docker proxies cleared!${NC}"
}

# 显示帮助
show_help() {
    echo -e "${BLUE}Docker Proxy Management Script${NC}"
    echo
    echo "Usage: $0 [command]"
    echo
    echo "Commands:"
    echo "  set-pull-push         Set Docker Pull/Push proxy"
    echo "  unset-pull-push       Unset Docker Pull/Push proxy"
    echo "  set-build-run         Set Docker Build/Run proxy"
    echo "  unset-build-run       Unset Docker Build/Run proxy"
    echo "  set-all               Set all Docker proxies"
    echo "  unset-all             Unset all Docker proxies"
    echo "  status                Check Docker proxy settings"
    echo "  help                  Show this help message"
    echo
    echo "If no command is provided, interactive mode will start."
}

# 显示交互式菜单
show_menu() {
    echo -e "${BLUE}================== Docker 代理管理工具 ==================${NC}"
    echo
    echo "1. 设置 Pull/Push 代理 (镜像拉取推送)"
    echo "2. 取消 Pull/Push 代理"
    echo "3. 设置 Build/Run 代理 (容器网络访问)"
    echo "4. 取消 Build/Run 代理"
    echo "5. 检查代理状态"
    echo "6. 一键设置所有代理"
    echo "7. 一键清除所有代理"
    echo "8. 退出"
    echo
    echo -e "${BLUE}=======================================================${NC}"
}

# 交互式模式
interactive_mode() {
    while true; do
        show_menu
        echo -n "请选择操作 [1-8]: "
        read choice
        echo
        
        case $choice in
            1) set_docker_pull_push_proxy ;;
            2) unset_docker_pull_push_proxy ;;
            3) set_docker_build_run_proxy ;;
            4) unset_docker_build_run_proxy ;;
            5) check_docker_status ;;
            6) set_all_proxies ;;
            7) unset_all_proxies ;;
            8) 
                echo -e "${GREEN}再见!${NC}"
                exit 0
                ;;
            *) 
                echo -e "${RED}无效选择,请输入 1-8${NC}"
                ;;
        esac
        
        echo
        echo -n "按回车键继续..."
        read
        clear
    done
}

# 主程序逻辑
main() {
    local cmd="$1"
    
    check_sudo
    
    # 如果没有参数,进入交互式模式
    if [[ -z "$cmd" ]]; then
        interactive_mode
        return
    fi
    
    case "$cmd" in
        "set-pull-push") set_docker_pull_push_proxy ;;
        "unset-pull-push") unset_docker_pull_push_proxy ;;
        "set-build-run") set_docker_build_run_proxy ;;
        "unset-build-run") unset_docker_build_run_proxy ;;
        "set-all") set_all_proxies ;;
        "unset-all") unset_all_proxies ;;
        "status") check_docker_status ;;
        "help") show_help ;;
        *) 
            echo -e "${RED}Error: Unknown command '$cmd'${NC}"
            echo
            show_help
            exit 1
            ;;
    esac
}

# 执行主程序
main "$@"ge"
}

# 主程序逻辑
main() {
    local cmd="$1"
    
    check_sudo
    
    case "$cmd" in
        "set-daemon") set_docker_daemon_proxy ;;
        "unset-daemon") unset_docker_daemon_proxy ;;
        "set-client") set_docker_client_proxy ;;
        "unset-client") unset_docker_client_proxy ;;
        "status") check_docker_status ;;
        "help") show_help ;;
        *) 
            echo "Error: Unknown command '$cmd'"
            echo ""
            show_help
            exit 1
            ;;
    esac
}

# 执行主程序
main "$@"
点击展开查看更多

替换 Shell

安装 zsh

BASH
sudo apt install zsh
点击展开查看更多

安装 oh-my-zsh

BASH
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
点击展开查看更多

安装完成后会提示替换当前用户的 shellzsh ,也可以通过下面的命令来设置默认 shell,完成后的配置文件为 .zshrc

BASH
chsh -s /bin/zsh
点击展开查看更多

安装插件管理器

使用 Antigen 来管理 zsh 的插件,首先安装:

BASH
curl -L git.io/antigen > antigen.zsh
# or use git.io/antigen-nightly for the latest version
点击展开查看更多

配置文件

清空 .zshrc 文件,重新输入下面的内容:

BASH
source $HOME/antigen.zsh

antigen use oh-my-zsh

antigen bundle git
antigen bundle zsh-users/zsh-syntax-highlighting
antigen bundle zsh-users/zsh-autosuggestions
antigen bundle zsh-users/zsh-completions


antigen theme robbyrussell
antigen apply
点击展开查看更多

参考

版权声明

作者: Tom Almighty

链接: https://blog.grew.cc/posts/windows-wsl/

许可证: CC BY-NC-SA 4.0

本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

评论

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键