在适用于 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 字符集”。当您通过Settings > System > About或在 Windows 中重命名计算机Control Panel > System and Security > System时,它会保留您指定的大写字母,但 NetBIOS 名称会全部转换为大写字母。话虽如此,可以使用 Windows API 函数将 NetBIOS 名称更改为小写字母SetComputerName。这是一个小的 C 程序(非 Unicode),将 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使其显示在提示符中)。

相关内容