在適用於 Linux 的 Windows 子系統中強制使用小寫主機名

在適用於 Linux 的 Windows 子系統中強制使用小寫主機名

我已在系統屬性中將電腦名稱設定為小寫。

系統屬性

其中cmd.exe顯示為小寫。

執行程式

但是,在 Windows 10 Bash 中,即使該/etc/hostname檔案已更新為小寫,它仍顯示為大寫。

在此輸入影像描述

答案1

這種美學也讓我惱火。我沒有嘗試hostname返回小寫的內容,而是簡單地攻擊了bash提示的顯示方式。我編輯了.bashrc(這是特定於 Windows 安裝的,因此不太可能在不同電腦上重複使用)對提示變數執行以下操作PS1

# Annoyingly the windows hostname is UPPERCASE which really doesn't look
# good on linux. So for this machine I'm going to grab the hostname and
# hardcode it into the prompt
HN=`hostname`
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@${HN,,}\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@${HN,,}:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@${HN,,}: \w\a\]$PS1"
    ;;
*)
    ;;
esac

上面的程式碼本質上是在使用將字串 A 轉換為小寫的功能PS1來建立機器時將機器的小寫名稱硬編碼到其中。雖然這不是問題的優雅解決方案,但這確實讓 shell 看起來像一個更正常的 Linux shell!bash 4.0$(A,,)

答案2

編輯:目前該措施已經實施;您在系統屬性中設定的大小寫現在將被保留。

我也遇到了同樣的問題。事實證明,您不能只在 Windows 上的 Ubuntu (BUW) 上的 Bash 中更改 /etc/hostname,因為每次啟動時都會產生 /etc/hostname。 BUW 似乎使用電腦的 NetBIOS 名稱來產生 /etc/hostname,根據本文,「以大寫形式表示,其中從小寫到大寫的轉換演算法取決於 OEM 字元集」。當您在 Windows 中透過Settings > System > About或重新命名電腦時Control Panel > System and Security > System,它會保留您指定的大小寫,但 NetBIOS 名稱將轉換為全部大寫。也就是說,可以使用 Windows API 函數將 NetBIOS 名稱變更為小寫SetComputerName。這是一個小 C 程式(非統一碼)將 NetBIOS 名稱設定為其第一個參數(需要管理員權限):

#define _WIN32_WINNT 0x0500
#include <sdkddkver.h>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <stdio.h>

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <New NetBIOS name>\n", argv[0]);
        return 1;
    }

    if (SetComputerNameA(argv[1]) == 0) {
        LPSTR error_message = NULL;
        DWORD error_code = GetLastError();
        FormatMessageA(
            FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            error_code,
            0,
            (LPSTR)&error_message,
            0,
            NULL
        );

        fprintf(stderr, "SetComputerNameA error (%lu)", error_code);
        if (error_message != NULL) {
            fprintf(stderr, ": %s", error_message);
            LocalFree(error_message);
        }
        fprintf(stderr, "\n");
        return 2;
    }
    else {
        printf("NetBIOS name set to \"%s\"\n", argv[1]);
        return 0;
    }
}

使用它需要您自擔風險,因為我不完全確定使用非大寫 NetBIOS 名稱是否會產生任何不利影響(它可能會破壞依賴 DnsHostnameToComputerName 的東西)。最終我不確定 BUW 是否有意/有必要使用 NetBIOS 名稱;我問過這件事在 BUW 的問題追蹤器上。

或者,如果您不想變更 NetBIOS 名稱,則可以設計某種方法在每次開始使用 BUW 時變更主機名稱sudo hostname prophet-w10(然後exec bash使其顯示在提示字元中)。

相關內容