본문 바로가기

프로그래밍/기타

Windows Termial 에서 접속 메뉴 설정하는법

Windows Terminal 에 대해서는 여러 좋은 글들이 있어서 이게 무엇이며 이게 왜 만들어졌는지..에 대한 내용은 생략하겠다. 바로 본론으로 들어가서 Windows Terminal에서 Tab을 추가할때 특정 서버로 접속하는 메뉴 생성에 대해 얘기하겠다. 현재 내가 사용중인 Windows Terminal 새 탭 메뉴는 다음과 같다.

 

현재 사용중인 Windows Terminal의 새 탭 메뉴

 

위의 그림에서 빨간색 박스 쳐져 있는 부분은 Windows Terminal이 기본적으로 만든것이 아닌 내가 추가한 메뉴이다. Docker가 설치되어 있는 Vagrant 가상머신을 기동하는 메뉴인 Docker Vagrant 기동, Docker가 설치되어 있는 Vagrant 가상머신에 ssh 로 접속하는 Docker SSH 접속,  Docker가 설치되어 있는 Vagrant 가상머신을 종료하는 메뉴인 Docker Vagrant 종료 이렇게 3개를 추가했다. 이 글에서는 이렇게 사용자 용도에 맞게 메뉴를 추가하는 방법에 대해 글을 쓰고자 한다.

 

Windows Terminal을 사용중이거나 또는 관심이 있는 개발자라면 아마 settings.json 에 대해 알 것이다. 이 settings.json 파일은 Windows Terminal에 대해 설정하는 내용이 들어있는 파일로 그 내부 구조는 json 형태를 띄고 있다. 위의 그림에서 설정 메뉴를 클릭하면 메모장으로 settings.json을 열어주어서 Windows Terminal 에 대한 설정을 할 수 있도록 해준다. 개인적으로 지금은 적응이 되었지만 Windows Terminal 에 대해 적응하기 전에는 이 부분이 맘에 들지 않았다. 기존 terminal 프로그램들을 보면 사용자 친화적인 ui 화면을 제공해주기 때문에 설정에 어려움이 없었지만 이렇게 제공되는 방법은 settings.json 을 구성하는 json의 구조와 의미를 이해하지 못하면 설정이 쉽지 않기 때문이다. 다행히 이 부분에 대해서는 MS 측에서 문서로 잘 정리되어 있는데다가 Google에서 검색해보면 관련 설정에 대한 내용이 얼추 나오기 때문에 설사 Google 검색에서 원하는 결과가 나오지 않더라도 MS 문서를 보면 찾을수 있는 부분이기 때문에 오히려 개발자에게는 친화적일수는 있다. 그러나 개발자가 아닌 사람이 이 Windows Terminal을 이용한다면 이 부분은 사용자 친화적이지는 않을수 있다. 개인적은 느낌을 설명하느라 얘기가 길어졌는데 이 글에서 할려는 것도 settings.json의 구조를 이해하지 않으면 어려울수 있다. 그러나 모든 구조를 다 이해할 필요는 없다. 자기가 자주 쓰는 부분에 대해서만 알아두면 되는거라서..

 

settings.json 파일의 내용을 보면 이 탭 추가 메뉴를 설정하는 부분이 있다. profiles.list 항목을 보면 다음과 같이 되어 있다.

 

"list":
[
  {
    // Make changes here to the powershell.exe profile.
    "guid": "{guid값}",
    "name": "Windows PowerShell",
    "commandline": "powershell.exe",
    "hidden": false
  },
  {
    // Make changes here to the cmd.exe profile.
    "guid": "{guid값}",
    "name": "명령 프롬프트",
    "commandline": "cmd.exe",
    "hidden": false
  },
  {
    "guid": "{guid값}",
    "hidden": false,
    "name": "Azure Cloud Shell",
    "source": "Windows.Terminal.Azure"
  }
]          

 

list 항목은 배열 구조를 가지고 있는데 각 배열의 요소가 가지고 있는 속성은 guid, name, hidden, commandline(또는 source) 이다. guid 에는 우리가 흔히 아는 그 GUID를 생성해서 넣어주면 된다. 별도의 GUID 생성 프로그램을 만들거나 구할 필요 없이 여기에서 GUID를 생성할 수 있다. name 에는 메뉴 이름을 적어주면 된다. commandline에는 그 메뉴를 클릭했을때 실행해야 할 명령어 라인을 입력해주면 된다. hidden 은 메뉴가 외부로 노출이 되는 여부를 지정하는 것으로 false로 해야 외부에 메뉴가 노출이 된다.

 

이러한 속성의 의미를 알고 내가 만든 메뉴에 대한 설명을 하겠다. 먼저 내가 만든 Docker가 설치되어 있는 Vagrant 가상머신의 위치는 D:\VagrantBox_Share\box\centos_docker 폴더에 있다. 그래서 이 폴더에 들어가서 vagrant up 명령을 실행해야 가상머신이 구동된다. 그래서 CMD 창에서 Docker가 설치되어 있는 가상머신을 기동시킬려면 다음의 과정을 거쳐야 한다.

 

  1. d:
  2. cd VagrantBox_Share\box\centos_docker
  3. vagrant up

 

이렇게 3개의 명령이 순차적으로 이뤄져야 한다. 그러면 이럴때 어떻게 구성해야 하나. 먼저 1번과 2번은 하나로 합칠수가 있다. 다음과 같이 cd 명령을 주면 된다.

 

cd /d D:\VagrantBox_Share\box\centos_docker\

cd 명령을 줄때 /d 옵션을 주면 드라이브도 바꾸면서 디렉토리를 이동할 수 있다. 그러면 1번과 2번은 위와 같이 해서 합칠수 있고 이렇게 cd 명령을 내린뒤 vagrant up 명령어를 실행시키도록 해야 한다. 이럴땐 2개의 명령어를 &&로 연결해서 순차적으로 실행시키게 할 수 있다.

 

cd /d D:\VagrantBox_Share\box\centos_docker\ && vagrant up

 

이렇게 명령어를 주면 먼저 cd 명령어를 실행한 뒤 vagrant up 명령어를 실행시키게 된다. 전체적인 명령어 라인을 만들었기 때문에 이제 이것을 Windows Commmand Prompt 프로그램인 cmd.exe 에 전달해주면 된다. 다음과 같이 말이다.

 

cmd.exe /C "cd /d D:/VagrantBox_Share/box/centos_docker/ && vagrant up"

 

cmd.exe에 /C 옵션을 주어서 명령어 라인을 전달해주고 있다. /C 옵션은 전달받은 명령어 라인을 실행한뒤 자동으로 창이 닫히게끔 해주는 옵션이다. 만약 전달받은 명령어 라인을 실행한뒤에도 계속 창이 남아있기를 바란다면 /C 대신 /K 옵션을 주면 된다. 그리고 명령어 라인 중간에 공백이 있기 때문에 명령어 부분을 따옴표로 감싸서 공백도 명령어 라인의 일부임을 인식시켜줘야 한다. 그러다보니 이 과정에서 문제가 생기는데 바로 Windows 에서 디렉토리 구분자로 사용되는 \(역슬래쉬)이다. 이게 문자열에서는 escape 문자로 인식되기 때문에 이것을 역슬래쉬 자체로 인식시킬려면 \\ 이렇게 역슬래쉬를 두번 써줘야 escape 문자가 아닌 역슬래쉬로 인식하게 된다. 그러나 이보다 더 간단한 방법은 디렉토리 구분자를 \가 아닌 /를 써주면 된다. /를 unix나 linux 에서 사용되는 디렉토리 구분자로 생각하는 사람들이 많은데 Windows 에서도 /를 디렉토리 구분자로 사용할 수 있다. /를 사용하면 \를 사용할때 escape 문자부분에 대한 고려를 하지 않아도 된다. 이렇게 만들어진 최종 명령어 라인을 commandline 속성에 넣어주면 된다.

 

탭 생성 메뉴를 보면 앞에 아이콘을 붙일수 있는데 별도로 지정하지 않으면 아무런 아이콘이 붙지 않기 때문에 메뉴 자체가 밋밋해보인다. 그래서 인터넷에서 자신이 원하는 아이콘을 검색해서 이를 구한뒤 icon 속성에 넣어주면 된다. 추천하는 위치는 settings.json 파일이 있는 폴더에 하위 폴더(ex: icon)을 만들어서 관리하는 것이다. settins.json 파일이 저장되어 있는 위치는 다음과 같다.

 

C:/Users/계정명/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/

 

만약 Windows Terminal을 새로 설치하려 할 경우 LocalState 밑에 있는 내용들을 백업한뒤 Windows Terminal을 설치한 뒤 백업해놓은 LocalState를 원래대로 복구해주면 된다

 

지금까지 설명한 내용을 가지고 Docker Vagrant 기동 메뉴를 구성한 메뉴 구성 내용은 아래와 같다. 이것을 list 항목의 배열 안에 넣어주면 된다.

 

{
  "guid": "{guid값}",
  "hidden": false,
  "name": "Docker Vagrant 기동",
  "icon": "C:/Users/계정명/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/icon/docker.png",
  "commandline": "cmd.exe /C \"cd /d D:/VagrantBox_Share/box/centos_docker/ && vagrant up\""
}

 

Docker Vagrant 종료 메뉴는 Docker Vagrant 기동 메뉴에서 사용했던 명령어인 vagrant up 대신 vagrant halt로 바꾸고 새로 guid 값을 따와서 guid 항목에 넣어준거 말고는 차이가 없기 때문에 별도의 설명은 하지 않겠다. 지금부터는 Docker SSH 접속 메뉴에 대해 설명하겠다

 

Windows 10 부터 OpsnSSH 클라이언트가 제공되기 때문에 OpenSSH 클라이언트를 설치해줘야 한다(이에 대한 설치 방법은 여기를 보면 된다) 이렇게 OpenSSH 클라이언트를 설치한뒤 openssh 클라이언트로 접속하면 된다. 아래는 OpenSSH 클라이언트로 Vagrant 가상머신에 접속하는 명령어이다.

 

ssh vagrant@127.0.0.1 -p2222 -i D:/VagrantBox_Share/box/centos_docker/.vagrant/machines/centos7-docker/virtualbox/private_key

 

Vagrant 가상머신은 내부적으로 vagrant 란 계정을 가지고 있기 때문에 vagrant@127.0.0.1 로 접속 문자열을 만들었고 ssh 통신포트를 2222번을 사용하게끔 했기 때문에 -p 옵션을 주어서 2222번 포트와 접속하도록 했다. Vagrant 가상머신은 가상머신을 만드는 시점에 ssh private key를 만들기땜에 -i 옵션을 주어서 private key 위치를 지정했다.(private key가 위치한 곳을 알아내는 방법은 여기를 참조하면 된다) 이렇게 해서 만들어진 메뉴 구성 내용은 아래와 같다. 이 방법을 이용해서 기타 여러 ssh 서버에 접속하는 메뉴들을 만들수 있다.

 

{
  "guid": "{guid값}",
  "hidden": false,
  "name": "Docker Vagrant 기동",
  "icon": "C:/Users/계정명/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/icon/docker.png",
  "commandline": "ssh vagrant@127.0.0.1 -p2222 -i D:/VagrantBox_Share/box/centos_docker/.vagrant/machines/centos7-docker/virtualbox/private_key"
}

 

지금까지 Windows Terminal에서 탭 메뉴를 만드는 방법에 대해 설명했다. 특정 command 명령을 실행하거나 또는 특정 서버를 ssh 클라이언트를 이용해서 접속하는 방법을 잘 활용하면 Windows Terminal을 아주 유용하게 사용할 수 있을꺼라 생각한다