Linux용 Windows 하위 시스템에서 호스트 이름을 소문자로 강제 적용

Linux용 Windows 하위 시스템에서 호스트 이름을 소문자로 강제 적용

시스템 속성에서 컴퓨터 이름을 소문자로 설정했습니다.

시스템 속성

cmd.exe소문자로 표시됩니다 .

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사용하여 기계를 생성할 때 기계 이름을 소문자로 본질적으로 하드 코딩합니다 . 문제에 대한 우아한 해결책은 아니지만 이는 쉘을 보다 일반적인 Linux 쉘처럼 보이게 만듭니다!bash 4.0$(A,,)

답변2

편집하다:이제 이것이 구현되었습니다.; 이제 시스템 속성에서 설정한 대문자 사용이 유지됩니다.

나는 같은 문제를 겪고있었습니다. /etc/hostname은 시작할 때마다 생성되기 때문에 BUW(Ubuntu on Windows)의 Bash 내에서 /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에 표시되도록 하는 방법을 고안할 수 있습니다.

관련 정보