Windows 터미널의 설정 및 ssh 사용하기

In 네트워크와 시스템 관리 by Choi Kyung-sik

Windows 10은 OpenSSH를 포함하고 있으나 명령 프롬프트(cmd.exe)의 기능 부족으로 사용이 꺼려졌다. Windows 터미널이 나오면서 Xshell, SecureCTR, PuTTY 등을 대체할 수준까지 올라왔다. Windows 터미널을 처음 설치하고 막막할 수 있는 설정 방법과 ssh 클라이언트의 효율적인 사용을 정리해 본다.

Windows 터미널은 Microsoft 스토어에서 검색해서 설치한다. Windows Terminal 구매에서 무료 버튼을 클릭하면 Windows 터미널이 있는 스토어로 들어갈 것이다.

프로필에 기본적인 설정하기

Windows 터미널 화면상에서 <Ctrl + ,> 키를 누르면 settings.json 설정 파일이 열린다.

...
    "profiles":
    {
        "defaults":
        {
            // Put settings here that you want to apply to all profiles.
            "fontSize": 10,
            "cursorShape": "vintage"
        },
        "list":
        [
            {
                // Make changes here to the powershell.exe profile.
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            },
            {
                // Make changes here to the cmd.exe profile.
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "명령 프롬프트",
                "commandline": "cmd.exe",
                "hidden": false
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "source": "Windows.Terminal.Azure"
            }
        ]
    },
...

위의 내용은 settings.json 파일에서 일부분을 발췌한 것이다. 라인 1과 34의 ...은 내용을 생략하였음을 나타낸다. 우리가 중점적으로 보아야 할 부분은 라인 2부터 시작하는 “profiles”이다. Windows 터미널은 설정 단위로 프로필이라는 용어를 사용한다. 처음 설치 시 Windows Powershell, 명령 프롬프트, Azure Cloude Shell 3개의 프로필이 있다. 라인 10의 “list” 절(section)에서 각 프로필을 포함하고 있는 것을 볼 수 있다. 라인 4의 “defaults” 절에서 모든 프로필에 적용할 속성(property)을 설정할 수 있다. 속성 설정은 “속성”: “문자열 값” 형식으로 한다. 숫자 값이나 불린 값(true, false)은 “속성”: 값 형태로 값에 인용 부호(“)를 사용하지 않는다.

라인 7, 8은 내가 추가한 설정이다. 폰트가 너무 큰 것 같아 “fontSize” 속성을 10으로 설정하였다. 라인 8은 커서의 모양을 굵은 밑줄로 한 것이다. 커서 모양 속성인 “cursorShape”"bar", "vintage", "underscore", "filledBox", "emptyBox" 값을 설정할 수 있다. 편집한 내용을 저장하면 설정이 바로 적용되는 것을 볼 수 있을 것이다.

나는 커서가 깜박이는 것을 좋아하지 않는다. 나와 취향이 비슷한 분을 위해 설명을 추가한다. 커서 깜박임 설정은 윈도우 운영체제에서 해야 한다. 다음의 절차로 커서 깜박임을 없앨 수 있다.

  1. 시작 > 설정설정 검색에 ‘제어판‘을 입력하고 검색한 후 제어판을 클릭한다.
  2. 제어판 검색에 ‘키보드‘를 입력하고 검색한다.
  3. 키보드 상태 확인을 클릭한다.
  4. 속도 탭에서 커서 깜박임 속도없음으로 설정한다.
  5. 확인 버튼을 클릭하여 설정을 마친다.
Git Bash 프로필 추가하기

기본으로 제공하는 3개의 프로필에 더하여 새로운 프로필을 추가해 보자. Git Bash 프로필을 추가하는 방법을 먼저 살펴본다. Git Bash는 Git – Downloads에서 Windows 용 설치 파일을 다운로드하여 설치할 수 있다. git을 사용하지 않는다면 GUID 생성 방법과 속성 설명 만을 보고 다음으로 넘어간다.

각 프로필은 고유의 GUID 값을 가져야 한다. Windows 터미널은 실행할 때 디폴트로 파워쉘을 실행한다. 파워쉘에서 ‘[guid]::NewGuid()‘ 명령어를 실행하여 GUID를 만들 수 있다.

PS C:\Users\bitneer> [guid]::NewGuid()

Guid
----
d32532fa-83a2-4b38-91ad-fb5990d24199


PS C:\Users\bitneer>

라인 5의 값을 복사해서 “guid” 속성의 값으로 사용하면 된다. Windows 터미널에서 클립보드로 복사하는 단축키는 <Ctrl + C>, <Ctrl + Shift + C>, <Ctrl + Insert> 3가지가 있다. <Ctrl + C> 키는 Unix/Linux 시스템에서 포그라운드 프로세스를 종료하는 데 사용한다. 따라서 <Ctrl + Shift + C>나 <Ctrl + Insert> 키로 복사하는 습관을 들이는 것이 좋겠다.

settings.json 파일에 Git Bash 프로필 설정을 다음과 같이 추가한다.

...
        "name": "Azure Cloud Shell",
        "source": "Windows.Terminal.Azure"
    },
    {
        "guid": "{d32532fa-83a2-4b38-91ad-fb5990d24199}",
        "name": "Git Bash",
        "commandline": "C:/Program Files/Git/bin/bash.exe --login",
        "icon": "file:///C:/Program Files/Git/mingw64/share/git/git-for-windows.ico",
        "hidden": false
    }
...

기본적으로 제공하는 프로필 중 마지막 프로필인 Azure Cloude Shell 뒤에 Git Bash 프로필을 추가하였다. 라인 4에서 쉼표(,)를 추가하는 것에 주의한다. 프로필 항목이 이어지면 쉼표를 붙이고 라인 11처럼 제일 끝 항목은 쉼표를 붙이지 않는다. 속성도 마찬가지로 라인 10의 마지막 “hidden” 속성에는 쉼표를 붙이지 않았다.

라인 6의 “guid” 속성은 위에서 만든 GUID 값으로 설정하였다. 라인 7의 “name” 속성에는 원하는 이름을 사용한다. 이 이름이 드롭다운 메뉴에 나타난다. 라인 10의 “hidden” 속성은 드롭다운 메뉴에 프로필을 숨길지를 설정한다. 디폴트 값이 false이므로 이 속성을 삭제할 수 있다. 그러나 설정 내용은 유지하면서 드롭다운 메뉴에서 숨기고 싶을 때 편집의 용이성을 위해 넣어주는 것이 좋을 것이다. 라인 9의 “icon” 속성에 Git Bash의 아이콘 이미지의 파일 경로를 설정하여 드롭다운 메뉴와 에 아이콘을 보이게 한다.

라인 8의 “commandline” 속성에 Git Bash의 실행 파일 경로를 값으로 설정하였다. ‘–login‘ 옵션을 주어 로그인 시 적용하는 환경 변수들을 불러온다. 추가로 환경 변수를 설정하고 싶다면 자신의 홈 폴더에 .profile 파일을 만들고 로그인 시에 적용할 내용을 넣어 줄 수 있다. 예를 들면 다음과 같이 할 수 있다.

export LS_COLORS="di=00;36:fi=00;37"
cd "D:\MySpace"

라인 1은 ls 명령어 사용 시 디렉토리의 색깔이 어두운 파란색으로 나오는 것을 좀 더 밝은색으로 한 것이다. 라인 2는 주로 작업하는 디렉토리로 이동하기 위한 것이다. 여러분에게 맞게 설정 내용을 추가할 수 있다. 참고로 Windows 용 Git에는 MinGW를 포함하고 있다. 따라서 vim, grep, ssh 같은 유닉스 명령어들을 사용할 수 있다. Git Bash 쉘에서 ‘echo $PATH‘ 명령어를 실행하고 나온 경로를 통해 어떤 명령어들을 사용할 수 있는지 확인해 볼 수 있을 것이다.

OpenSSH 클라이언트 확인하기

Git Bash는 ssh를 포함하고 있으므로 Git Bash 쉘에서 ssh를 바로 사용할 수 있다. 파워 쉘이나 명령 프롬프트에서 모든 경로를 타이핑하지 않고 편하게 사용하려면 64-bit 시스템일 때 C:\Program Files\Git\usr\bin 폴더를 PATH 환경 변수에 추가해야 할 것이다.

Git Bash를 설치하지 않는다면 Windows 10의 OpenSSH를 사용할 수 있다. OpenSSH 클라이언트를 추가하였는지 다음과 같이 확인한다.

  1. 윈도우에서 시작 > 설정 > 앱선택적 기능을 클릭한다.
  2. OpenSSH 클라이언트가 목록에 있는지 확인한다.
  3. 목록에 없으면 ‘+‘ 기능 추가 아이콘을 클릭하여 OpenSSH 클라이언트를 추가한다.

OpenSSH 클라이언트 기능을 추가하면 C:\Windows\System32\OpenSSH 폴더를 자동으로 PATH 환경 변수에 추가하여 준다.

원격에 있는 시스템(예: 192.168.10.10)의 root 계정으로 접속하기 위해 다음의 ssh 명령어를 실행할 수 있다.

PS C:\Users\bitneer> ssh root@192.168.10.10
...

첫 접속이라면 접속을 계속할지를 물을 것이다. ‘yes‘를 입력하고 <Enter> 키를 누르면 $HOME/.ssh/known_hosts 파일에 호스트(192.168.10.10)를 추가해 줄 것이다. 호스트 추가 후 다시 위의 명령어를 실행하면 ‘암호’를 물을 것이고 root 계정의 암호를 입력하여 접속한다.

위의 예제에서 위험하게 root 계정을 사용하였다. 나의 경우 공유기(방화벽 역할) 안에 시스템이 있고 ssh 서버를 포트 포워딩으로 열어 두지 않았기 때문에 보안에는 문제가 없다. 참고로 ssh 서버에서 root로 로그인을 허용하려면 데비안 시스템의 경우 /etc/ssh/sshd_config 파일에 ‘PermitRootLogin yes‘를 추가하고 ssh 서버를 다시 시작해야 한다. 앞으로의 예제에서도 192.168.10.10 시스템의 root 계정으로 예를 들 것이다. 여러분에게 맞게 참작해서 보기 바란다.

SSH 사용을 위한 프로필 추가하기

settings.json 파일에 192.168.10.10 시스템의 root 계정으로 로그인하는 프로필을 다음과 같이 추가한다.

...
    },
    {
        "guid": "{12fec865-77d4-4c96-89ef-e1781e805c13}",
        "name": "192.168.10.10 - root",
        //"commandline": "C:/Program Files/Git/usr/bin/ssh root@192.168.10.10",
        "suppressApplicationTitle": true,
        "commandline": "ssh root@192.168.10.10",
        // Linux Icon
        "icon": "ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.scale-100.png",
        // Poswershell Icon
        //"icon": "ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png",
        // CMD Icon
        //"icon": "ms-appx:///ProfileIcons/{0caa0dad-35be-5f56-a8ff-afceeeaa6101}.png",
        "hidden": false
    }
...

라인 2의 Git Bash 프로필 항목의 끝에 쉼표(,)를 추가한다. 라인 16처럼 프로필의 마지막 항목이면 쉼표를 쓰지 않는다. 라인 4의 “guid” 속성에 파워쉘에서 ‘[guid]::NewGuid()‘ 명령어를 실행하여 나온 GUID 값을 복사하여 붙여준다. 라인 5의 “name” 속성에는 원하는 이름을 넣어 준다.

라인 8의 “commandline” 속성에는 ssh 명령어를 입력한다. 주석으로 처리한 라인 6에서 보듯이 Git Bash의 ssh를 사용할 수 있다. Windows의 OpenSSH 클라이언트의 경우 라인 7의 “suppressApplicationTitle” 속성을 true로 설정해야 에 “name” 속성으로 설정한 이름 ‘192.168.10.10 - root‘가 나온다. “suppressApplicationTitle”: true를 설정하지 않으면 “commandline”에서 지정한 ssh 프로그램의 이름인 ‘OpenSSH SSH client‘를 탭에 표시할 것이다.

라인 10의 “icon” 속성에 Windows 터미널에서 기본적으로 제공하는 Linux 아이콘으로 설정하였다. Git Bash 프로필에 했던 것처럼 파일 경로를 지정하여 여러분이 원하는 아이콘으로 설정할 수 있다. 마지막으로 라인 15에서 “hidden” 속성을 false로 하여 드롭다운 메뉴에 이 프로필이 나오게 한다. “hidden”은 마지막 속성이기 때문에 문장의 끝에 쉼표를 사용하지 않는 것에 주의한다.

암호를 입력하지 않고 SSH 사용하기

ssh 사용 시 매번 암호를 입력하는 것은 귀찮은 과정이다. 암호 없이 ssh를 사용하기 위해 다음과 같이 작업한다.

1. Windows 터미널을 실행한 후 다음과 같이 ssh-keygen 명령어를 실행하여 개인키(id_rsa)공개키(id_rsa.pub)를 만든다. 이미 키가 있다면 이 단계는 넘어간다.

PS C:\Users\bitneer> ssh-keygen -t rsa
...

무엇을 할지 물으면 모두 <Enter> 키를 눌러 넘어간다. 특히, 암호는 입력하지 않아야 한다. 위 명령어는 $HOME/.ssh 폴더에 id_rsa, id_rsa.pub 파일을 생성한다. 주의할 것은 ssh-keygen에 -f 옵션으로 id_rsa와 다른 이름으로 키를 생성하였다면 아래의 작업 후 ssh 명령어 실행 시 -i 옵션에 개인키 이름을 지정해야 암호를 묻지 않을 것이다. ssh 클라이언트는 디폴트로 id_rsa 이름만을 인식하기 때문이다.

2. 다음으로 접속하고자 하는 시스템(예: 192.168.10.10) 계정의 ~/.ssh 디렉토리 안에 공개키(id_rsa.pub)authorized_keys 파일 이름으로 만들어야 한다. linux의 OpenSSH는 이를 쉽게 하려고 ssh-copy-id 명령어를 제공한다. 그러나 윈도우의 ssh 클라이언트에는 ssh-copy-id 프로그램이 없다. 이 파일을 데비안에서 한 번 조사해 보았다.

# which ssh-copy-id
/usr/bin/ssh-copy-id
# dpkg -S /usr/bin/ssh-copy-id
openssh-client: /usr/bin/ssh-copy-id
# file /usr/bin/ssh-copy-id
/usr/bin/ssh-copy-id: POSIX shell script, ASCII text executable

라인 1에서 which 명령어로 ssh-copy-id의 경로를 확인한다. 라인 3에서 dpkg-S 옵션으로 ssh-copy-id 파일을 포함하고 있는 패키지를 확인한다. 라인 5에서 file 명령어로 ssh-copy-id 파일의 종류를 확인한다. 라인 6에서 보듯이 본쉘 스크립트임을 알 수 있다. 윈도우의 OpenSSH는 배치파일이나 파워쉘 스크립트로 ssh-copy-id를 포팅하지 않은 것으로 보인다.

2.1. Git Bash를 설치했다면 Git Bash 쉘에서 다음과 같이 ssh-copy-id 명령어를 실행한다.

$ ssh-copy-id -i $HOME/.ssh/id_rsa.pub root@192.168.10.10
...

‘$HOME’ 대신 물결표 문자(~)로 대치하여 ‘~/.ssh/id_rsa_pub’처럼 간단하게 할 수 있다. 실행 중에 암호를 물으면 192.168.10.10 시스템의 root 계정에 대한 암호를 입력한다.

2.2. Git Bash를 설치하지 않았다면 접속하고자 하는 시스템의 계정에 .ssh 디렉토리가 있는지에 따라 다음과 같이 한다.

2.2.1. 접속하고자 하는 계정에 ~/.ssh 디렉토리가 없는 경우 다음의 명령어를 실행하여 .ssh 디렉토리를 만든 후 공개 키를 authorized_keys 파일에 추가한다.

PS C:\Users\bitneer> cat $HOME/.ssh/id_rsa.pub | ssh root@192.168.10.10 "umask 077; mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"
...

실행 중에 암호를 물으면 192.168.10.10 시스템의 root 계정에 대한 암호를 입력한다.

2.2.2. 접속하고자 하는 계정에 ~/.ssh 디렉토리가 있는 경우 다음의 명령어를 실행하여 공개 키를 authorized_keys 파일에 추가한다.

PS C:\Users\bitneer> cat $HOME/.ssh/id_rsa.pub | ssh root@192.168.10.10 "umask 077; cat >> ~/.ssh/authorized_keys"
...

3. 암호 없이 ssh를 사용하는 것은 스크립트 파일 작성에 유용하다. 암호를 노출 시키지 않고 백업 스크립트 등을 작성할 수 있기 때문이다. 예를 들면 다음의 명령어 등을 시스템에 직접 접속하지 않고 실행할 수 있다.

PS C:\Users\bitneer> ssh root@192.168.10.10 "systemctl stop mariadb"
PS C:\Users\bitneer> ssh root@192.168.10.10 "shutdown -h now"
단축키 사용

다음은 Windows 터미널에서 유용하게 사용할 수 있는 단축키이다.

  • <Ctrl + Shift + D> : 현재 창의 프로필을 새 창으로 연다.
  • <Ctrl + Tab> : 탭 간에 전환한다.
  • <Alt + Enter> 또는 <F11> : 전체 화면으로 실행한다. 한 번 더 단축키를 누르면 원래 화면으로 돌아온다.
  • <Ctrl + Shift + C><Ctrl + Shift + V>로 복사와 붙여넣기를 하는 습관을 들인다.

자신이 추가한 프로필을 여는 단축키를 설정하고 싶다면 settings.json 파일에 다음과 같이 한다.

...
    "keybindings":
    [
        // Copy and paste are bound to Ctrl+Shift+C and Ctrl+Shift+V in your defaults.json.
        ...

        // 192.168.10.10 - root
        { "command": { "action": "newTab", "profile": "{12fec865-77d4-4c96-89ef-e1781e805c13}" }, "keys": "ctrl+shift+n" }
    ]
}

맨 마지막에 있는 “keybindings”에서 라인 8과 같이 단축키 설정을 추가할 수 있다. “profile” 속성의 값으로 GUID나 프로필의 이름("192.168.10.10 - root")을 설정할 수 있다. “keys” 속성에 원하는 단축키를 설정한다.

위 내용은 나의 관점에서 다루었다. 원하는 기능을 추가하고 싶거나 좀 더 개성 있게 꾸미고 싶다면 참고 자료의 페이지를 보기 바란다.

참고 자료