(무려 3년 만의 포스팅.. 요즘엔 그냥 개인 노션에 정리만 하는 편...)

어쩌다보니 식당 한군데의 자잘한 일들을 봐주고 있다.
주로 네트워크, CCTV나 매장에서 메뉴판으로 쓰는 아이패드 관리 따위인데,,
어제는 매니저님에게 전화가 오더니 네트워크 어쩌구 하시더라.

이야기를 들어보니, 포스에서 주문을 넣으면 주방 등에 영수증으로 주문 내역이 출력되는데, 그 출력이 안되더란 이야기.
그래서 포스사 직원을 불렀는데 직원은 네트워크 문제일거라고 하셔서 나에게 도움 요청하신거였다.

내가 한건 아니지만,, 매장 구조상 한 곳으로 보인 랜선을 랜 커플러로 다시 다른 곳으로 보내서 연결이 주렁주렁된 터라 찔리는게 있어서 그러려니 하였고,, 그래도 현상이 이상해서 매장을 방문해봤다.

서론이 꽤나 길 것 같은데...

[토스 결제 시스템에 대한 배경 지식]

토스 플레이스는 위 사진과 같은 조합의 SW/장비들을 제공한다.
왼쪽은 포스 프로그램. 포스 프로그램이란게 늘 그렇듯 필수는 아니다. 있으면 매장 주문 관리 등이 조금 편해지는거고...
윈도우, 맥, 아이패드, 갤럭시 모든 플랫폼을 지원하는게 특이한 포인트 + 보통 사용 수수료를 받는데 토스 포스는 무료로 사용할 수 있다.
토스 포스 프로그램에 대해서도 써볼려면 글이 따로 하나 나올 것 같아서 하략...

그 다음은 토스 프론트. 주로 결제 단말기로 많이 사용하며 간단하게 메뉴를 표시하거나 사용자 입장에서 키오스크 주문기처럼 사용할 수도 있다. 안드로이드 기기임. 영수증 프린터 기능은 없기 때문에 유무선으로 다른 장비를 연결해줘야 한다. 보통 정말 결제만 되는 카드 단말기를 하나 백업으로 구비하고, 그 단말기가 영수증 프린터를 겸하기 때문에 거기다 연결하는 경우가 많은 것 같다.

그 다음은 터미널인데, 이번에 문제 생기면서 직원이 임시로 갖다줘서 처음 봤다. 프론트를 고객 쪽에 향하게 하고, 터미널은 안쪽 직원이 금액 입력, 영수증 출력 등의 용도로 사용하는 느낌인 듯. 생긴걸 보니 결제 단말기로써의 역할도 할 것 같다.

[토스 포스와 영수증 프린터]

토스 포스는 한 매장에서 동시에 여러개 실행할 수 있는데, 매장 현황(테이블 정보, 주문 내역) 등은 공유하지만 연결되는 결제 단말기나 프린터 정보는 공유되지 않는다.
다만, 한쪽에서 주문했을 프린터가 연결된 다른 기기가 켜져있다면, 그 기기가 주문 정보를 받아서 대신 인쇄를 해준다. 그래서 여러 기기에 걸쳐 프린터를 연결해두면 안됨. (이걸 모른 채로 자꾸 지운 프린터로 인쇄가 되어서 한참을 헤맸음ㅠ)

실행 중인 토스 포스에서 영수증 프린터로 인쇄 요청을 보내는 방식이기 때문에, 포스가 실행되는 장비 기준으로 시리얼/USB 연결된 프린터나, 블루투스, 와이파이 프린터로 인쇄시킬 수 있고, 토스 프론트와 연결하고 나면 토스 프론트에 유선 연결된 프린터로 인쇄시키는 것도 가능하다.
또한 A 프린터는 영수증만, B 프린터는 주방에 주문 내역을, C 프린터는 다른 곳에서 특정 주문만을 출력하는 등 프린터별로 인쇄 종류를 나눌 수 있다.

토스 터미널이 아니라면 인쇄는 ESC/POS 프로토콜로 인쇄 요청을 보내게 된다.

이 매장에서는 토스 프론트에 유선 연결된 결제 단말기 하나, ESC/POS 유선 이더넷 영수증 프린터 3대, 그리고 ESC/POS WiFi 프린터 1대를 사용 중이다.

세우테크 SLK-TS400W, 와이파이 영수증 프린터

[문제 상황]

다시 매장으로 돌아와서, 영수증 프린터 한대의 파손과 다른 프린터가 모두 작동을 하지 않아서 토스 플레이스 대리점 직원을 부른 상황.
직원 입장에선 토스 프론트와 직접 연결된 결제 단말기는 인쇄가 되고, 네트워크로 연결된 영수증 프린터가 작동하지 않으니 네트워크 탓을 할 수 밖에 없었을터다.

나도 현상이 너무 이상해서 이런저런 테스트를 해봤는데, 아무리 봐도 네트워크 문제는 아니였다.
그러다 내가 ESC/POS 프로토콜로 프린터에 직접 명령을 전송할 경우 인쇄가 잘 되는걸 발견하였다!!!

임시로 가져오신 토스 터미널 2대는 인쇄가 잘 되었다. 토스 터미널은 ESC/POS 프로토콜이 아니라 별도 방식을 사용하는 듯.

대리점에서 오신 분도 계속 네트워크만 의심하시다가, 내가 테스트한걸 보시더니 토스 포스 앱의 문제임을 99% 확신하시고 영상을 찍어가셨다. 토스 포스 앱이 갑자기 문제 생겼으리라곤 누가 의심했을까...
다른 매장에선 별도로 안된다는 리폿이 없어서 더 네트워크만 의심했던건데, 왜 다른 매장 리폿이 없었는지는 의문이다. 그냥 그러려니 하고 쓰거나... 토스 포스를 그만큼 안쓰거나....??

(수정) 다음날 대리점 직원으로부터 전달받았는데 다른 매장은 잘 된다고 한다... 저 매장도 전체 기기에서 프린터를 삭제하고 다시 등록하니 또 인쇄가 되기도 하는걸 발견....

대리점 직원분도 예전과 다르게 최근에는 매장에 설치해주러 갔을 때 프린터 연결이 잘 안되어서 힘들었는데, 포스 프로그램 탓이었던 것인가?! 하면서 한탄하시더라..ㅠㅠ 그건 아마 다른 문제일 것 같긴 하지만 그냥 그러려니 했다.

여튼 당장 할 수 있는게 없으니 둘 다 퇴근.

 

[해결 과정]

집에 가는 길에 문득 토스 포스에서 인쇄 요청을 어떻게 잘 못 보내는지 궁금해졌다.
위에서 얘기했듯, 포스 프로그램을 별도로 실행시키면 매장 영업에 큰 영향 없이 이런저런 테스트를 할 수 있다.
로컬에 소켓 서버를 열고, 뭐라고 오는지 받아봤다.

테스트 출력을 누르면 '테스트 프린트' 라고만 출력이 되는데, 그 요청을 받아봤다.
ESC/POS 프로토콜은 검색해봤음. ESC 는 0x1B 를, GS 는 0x1D 를 의미한다.
요청 받은 패킷을 해석하면 아래와 같다.

1B 52 0D
	ESC R n: Select international characters
    	n 13: Korea
1D 21 11
	GS ! n: Select character size
    	0 <= n <= 255
C5 D7 BD BA C6 AE 20 C7 C1 B8 B0 C6 AE 0A
	'테스트 프린트\n'
1B 21 00
	ESC ! n: Batch specify print mode
1D 21 00
	GS ! n: Select character size
1B 61 00
	ESC a n: Position alignment
    	00 or 48: left
        01 or 49: center
        02 or 50: right
1D 42 00
	GS B n: Specify/cancel white/black inverted printing

0A 0A 0A 0A 0A 0A
	'\n\n\n\n\n\n'
1D 56 31
	GS V: Cut paper
    
(아래 4개 중복)
1B 21 00
1D 21 00
1B 61 00
1D 42 00
(----------)
1B 40
	ESC @: Initialize printer

 

소켓을 제대로 못 열거나, 실수로 프린터 주소를 하드 코딩 해뒀거나.. 따위를 의심했는데 그런건 아니였다.
그저 소켓 연결 수립 직후 보내야하는 Initialize printer 패킷 (0x1B 0x40)을, 가장 먼저 보내지 않고 가장 늦게 보내고 있었다...ㅡㅡ;;

그래서 매장에 따로 오드로이드(라즈베리파이 같은거) 한대 꽂아두고, 파이썬 서버를 띄워서 1B 40 으로 시작하지 않는 인쇄 요청은 내가 붙여서 다시 프린터로 보내도록 간단하게 프로그램을 짜두고, 토스 포스 프린터 설정을 다 바꾸었다.

그러니 정상 작동!

코드는 오래 쓸게 아니니 대충 작성해서 돌렸다.

import socket
import binascii
import traceback
import os

PORT = int(os.environ.get('PORT', '9100'))
TARGET = '192.168.20.' + os.environ.get('TARGET', '250')

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('0.0.0.0', PORT))
sock.listen(10)

while True:
	conn, client_addr = sock.accept()
	print('connection from', client_addr)
	
	proxy = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	is_first = True

	try:
		proxy.connect((TARGET, 9100))
		while True:
			data = conn.recv(1024)
			
			if data:
				if is_first:
					is_first = False			
					if data[:2] != b'\x1b\x40':
						proxy.send(b'\x1b\x40')
				
				# print('received', binascii.hexlify(data, ' ').upper())
				proxy.send(data)
			else:
				# print('no more data from', client_addr)
				break
	except:
		traceback.print_exc()
	finally:
		try:
			conn.close()
			proxy.close()
		except: pass

 

[추가 문제]

인쇄가 잘 되어서 싱글벙글하고 있었는데,, 어느순간 또 먹통이 되는 문제가 발생..
토스 터미널은 여전히 잘 되고... 토스 포스 프로그램을 완전히 종료하고 나면 또 잘 된다.
영상을 올리고 싶은데... 매장명이 노출되는데 영상 편집은 귀찮으니 생략....

매장 직원들에게 물어보니 예전부터 자주 그랬다고.... 직원들은 맺힌게 많았는지 포스 안 만들던 회사가 만드니 너무 불안정하다고 아예 시스템을 갈아버렸으면 좋겠다고 얘기하시더라.... (하지만... 토스 프론트가 예쁜걸.... 매장 주문 내역을 가져갈 수 있는 API 같은 것도 전혀 없어서... 바꿔야 한다는 의견도 프론트 예쁘다 원툴로 버텼는걸....)

그동안 안되는게 네트워크 문제일 줄 알았는데 전부 토스 문제였다니... 허허....

안될 때는 프린터로 소켓 연결 수립 조차 안한다. 이건 내가 어떻게 할 수 없으니 GG...
그냥 안되면 포스 앱을 한번 종료했다가 다시 실행해달라고만 전해뒀다.


방문하셨던 담당자분에겐 이 문제를 전달해드렸는데... 이게 과연 토스 포스 개발팀에게 전달이 될지.. 되면 언제 수정이 될지...
토스 포스 앱 자체는 업데이트가 되게 잦던데, 금방 해결되길 바라본다.

문제를 파악하고 해결하는 과정이 나름 재밌기도 했고,
누군가는 또 오작동이 자기 매장의 문제일거라 생각하고 고통받고 있을 것 같아서,, 혹시나 하는 마음에 짧게 남겨 보았음.


(추가 수정) 프린터로 요청 자체를 보내지 않는 문제 때문에 사용을 거의 못하셨다고 한다.
그래서 오늘은 토스 터미널 요청을 역분석해서, 터미널로 등록 → ESC/POS 프린터로 전송하도록 수정하였다.

토스 터미널은 :14555 포트에 http 서버가 띄워져 있으며, 토스 포스 앱은 3개의 엔드포인트를 요청한다.
- GET /: 404 반환됨
- GET /sn: { "serialNumber": "..." } 반환. 아무 값이나 뱉어도 무관함
- POST /print: 인쇄 요청, { "data": "base64 encoded..", "count": 1 }

헤더로도 몇가지 오지만 일단 무시.

base64 인코딩 된 문자열은 ESC/POS 명령어셋과 거의 동일하지만, 지원 인코딩 셋이 좀 다르다.
코드 상으론 좀 더 다양하게 지원하는 것 같긴 한데, 일단 ESC R n 에서 n = 0x0D Korean 표준을 따르지 않고, 0x0F 를 사용, 이는 GB18030 셋으로 인코딩 된다. 중국어 코드 집합인데,, 한국어도 잘 됨.

조금 귀찮지만 GB18030 을 디코딩한 후, cp949 에 없는 캐릭터셋은 대충 ? 로 치환해준 뒤, cp949 로 보내면 된다.

이를 위해 ESC/POS 명령어셋 파싱이 필요한데, 일단 내가 확인한 바로는 아래 명령어셋만 사용함.
- ESC @, ESC R, ESC !, ESC a, ESC E
- GS !, GS B, GS V

추가로 따로 포트번호가 없기 때문에 여러 대의 프린터랑 연결하기가 어렵다.
서버에 IP 를 여러개 할당한 후, 요청의 Host 헤더를 보고 적절한 프린터로 연결되도록 수정함.
도메인 주소는 토스 포스 앱에서 올바른 주소로 인정해주지 않는다...ㅎㅎ;;

조금 더 코드가 길어졌지만... 일단 이렇게라도 잘 되길 바라며....

(작성 중...)

보통 메일 서버를 직접 구축하는 짓은 하지 말라고들 한다.
스팸/바이러스 메일을 걸러내는 작업, 내 메일이 스팸처리가 되지 않게 하기 위한 작업, 메일을 중단 없이 수신할 수 있도록 지원 등등...
물론 직접 구축하는 작업이 아무나 할 수 있는게 아니기도 하고.

그래서 개인 도메인을 이용한 메일을 사용하기 위해선 유/무료의 기업용 서비스를 이용하거나 메일건 같은 서비스를 이용한다.
무료는 거의 없어지는 추세에 다음 스마트워크나 메일건 정도 남아있지만 제약들이 좀 불편했고, 유료도 서비스 자체나 과금 정책 등도 마음에 안드는 구석들이 하나씩 있어서 어떻게 하면 좋을까 고민하던 중, 어느정도 손이 가지만 타협할만한 방법이 있는 것 같아서 사용 및 설정을 해보았다.

일반 메일 서버 구축을 하듯이 Postfix + Dovecot 을 설정하지만, 실제 외부와 통신은 AWS SES를 거쳐서 진행하는 방식으로 구성을 하였다.
참고로 이미 이런 형태로 제공하는 가이드 등이 존재하지만, 다양한 계정으로의 수신을 지원하지 않아서 그 부분 등을 고려하여 세팅을 진행하였다.


AWS SES

AWS Simple Email Service 라고, 메일의 송수신을 지원하는 서비스이다.
다만 일반적인 메일 서비스처럼 지원을 하는건 아니고 송/수신이 조금씩 다르다.

일반적인 메일 서비스처럼 바로 사용할 수 있는건 아니지만(그런 목적으론 유료의 AWS WorkMail이 있다)
송신 기준으로 메일 전송에 필요한 각종 서버 설정을 하지 않고 AWS의 신뢰도에 기댈 수 있고, 수신 기준으로도 AWS가 일단 안정적으로 받아주고 시작하는게 좋아보여서 사용하기로 하였다. (바이러스 검사나 스팸 체크도 해주지만 내가 후처리를 따로 해줘야 한다.)

사용 방식 / 비용

먼저 송신은 초당, 일당 전송 제한이 있으며
AWS API를 이용하여 전송(월 62,000건 무료 후 과금)을 하거나, AWS IAM 사용자를 이용한 SMTP로 전송이 가능하며,
1000건당 $0.1 및 용량 기준으로 GB당 $0.12 가 과급된다.

후자의 SMTP 방식을 이용하면 일반 메일 클라이언트에 등록해서 사용할 수 있긴 한데, IAM을 사용하기 때문에 사용자 아이디/비밀번호를 내가 설정할 수도 없고 권한 부여도 까다롭다.

수신은 정한 규칙에 따라 AWS 람다를 실행하거나, S3에 저장하거나, SNS 토픽을 발행하는 등의 방식으로 이루어진다.
이 또한 1000건당 $0.1 (1000건 무로) / 256KB 1 chunk 기준으로 chunk 1000건당 $0.09 과금된다.
작성일 기준으로 한국 리전은 수신을 지원하지 않아 us-east-1 에서 사용하였음.

AWS SES 설정

AWS 에서 메일 송신을 위해선
1. 도메인 혹은 메일 주소 인증
2. 도메인의 경우 DKIM 등 설정
3. 외부로 메일 전송을 위한 Sandbox 해제 요청
작업을 해야하고,

수신을 위해선 MX레코드 설정이 필요하다.
이런 부분은 다른 사람들이 쓴 글이나 AWS 가이드에도 설명이 잘 되어있으니 생략.

이 후 Rule set 설정, Lambda, S3, SNS 등 설정은 분량 관계상 별도 포스팅으로. (작성 후 링크 예정)


Postfix

SMTP 프로토콜을 이용하여 메일을 수발신 할때 사용하는 프로그램. MTA (Mail Transfer Agent) 의 한 종류이다.
예전엔 sendmail 이 사용되었으나 요즘엔 Postfix를 가장 많이 사용한다.

Postfix 기능들

이 프로그램이 하는 역할이 겉으로 보기엔 단순 메일 수발신이지만 자세히 보면 좀 다양하다. 적절히 필요한 것만 취하면 됨.

1. 서버 내에서 내/외부로 메일 전송시 처리
    -> 안 써서 필요없음

2. 외부 클라이언트에서 서버를 통하여 메일 전송 (SMTP Submission)
    -> AWS의 SMTP를 사용해도 되는데, 메일 주소(사용자)별 인증을 쓰고 싶어서 이용.

3. 외부 클라이언트로 전송할때 사용자 인증 / 메일 검증 등
    -> 인증은 Postfix 자체적으로 할 수 있게 설정도 가능한데, 후술할 Dovecot과 연결하여 Dovecot의 인증을 사용하는 방법도 가능하다. 다 따로 구현하면 관리가 번거로워지니 이 방법을 사용할 예정.

4. 내 도메인으로 전송된 메일을 수신
    -> 나의 경우 수신을 AWS가 해주기 때문에 불필요한 기능이지만, 발송 과정에서 Postfix를 사용하고 있고 내 도메인으로 전송하는 경우가 발생할 수 있기 때문에 적절한 설정을 해줘야한다. (예시로 a@naver.com 에서 b@naver.com 으로 메일을 보내는 경우.)
        기본적으론 서버 내 해당하는 경로에 메일 원문을 저장하게 되어 있지만, 난 Dovecot 으로 전송하도록 설정할 예정

5. 메일 수신시 사용자 존재 여부 확인 / alias (다른 주소로 수신하는 기능)
    -> 메일 수신자에 따라 실질적으로 어떤 계정이 해당 메일을 받을지 결정하는 기능..
        support@도메인 으로 전송하면 CS팀에 속한 직원이 모두 해당 메일을 받는다거나.. 하는 목적으로 사용된다.
        난 내 도메인으로 오는 전체 메일을 내가 사용할 한두개 계정으로 받기 위해 사용할건데, 메일 수신을 Postfix만 하는게 아니라서 Postfix 와 Lambda 양쪽에 동일하게 작동하도록 구성해주어야 한다.

6. 다른 서버가 전송하는 메일을 다른 서버로 릴레이
    -> 보안 상의 이유 등으로 보통 비활성화

 

Postfix 설정

분량 관계상 포스팅을 분리하여 작성 (작성 후 링크 예정)


Dovecot

메일 박스를 관리하며 POP3, IMAP 등 프로토콜을 지원하여 다른 프로그램에서 메일을 받아갈 수 있도록 지원한다.
SMTP Submission 기능도 지원하는 것 같긴 하던데, 어차피 Postfix도 필요할 것 같아서 사용하지 않았음.

MTA(Postfix)가 메일을 수신해서 폴더에 저장하면 Dovecot이 알아서 그걸 읽는 방법도 있고,
MTA가 다시 Dovecot으로 LDA(Local Delivery Agent)나 LMTP(SMTP 개량 프로토콜)를 통해 보내줄 수도 있다.
예전엔 LDA를 썼었는데 최근엔 설정 편의성과 성능 때문에 LMTP를 더 많이 쓴다고 한다.

나의 경우 역시 Postfix - LMTP -> Dovecot 로 설정을 하였고,
AWS SES에서 수신한 메일도 AWS SES -> S3 -> SNS -> Lambda - LMTP -> Dovecot 으로 구성을 하였다.
보통 Lambda에서 Dovecot의 메일박스로 파일을 바로 전송시키는 방법을 사용하는데, 이러면 폴더 구조 같은걸 내가 신경 써줘야해서 난 수신자/alias 구분만 Lambda에서 하고 LMTP로 Dovecot에 떠넘겼음.

Dovecot 설정

역시 분량 관계상 포스팅 분리하여 작성 (작성 후 링크 예정)


사용 포트 / TLS

Dovecot 에서 사용할 POP3 와 IMAP 은 TLS 암호화가 추가된 버전인 POP3S(995/tcp), IMAPS(993/tcp) 만 사용할 예정이다.
내부 메일 전달을 위한 LMTP는 Postfix만 쓸거면 unix socket으로 해도 되지만, Lambda에서 사용해야 하니 적당히 임의로 2525/tcp 포트도 추가로 사용.

사용자가 메일 전송을 위해 Postfix에 접속할 때는 SMTPS(tcp/465) 대신 SMTP + STARTTLS 을 사용할거고, 25/tcp 가 OUTBOUND로 차단되는 경우가 많기 때문에, 587/tcp 포트를 사용한다.

즉 587, 993, 995 3개 포트는 모두 열려있어야 하며, 2525 포트는 내부에서 사용할 수 있게만 열려있으면 된다.

TLS 연결을 위해 인증서를 발급받아야 하는데, Let's encrypt(certbot) 을 이용한 웹서버용 인증서를 그대로 사용할 수 있다.
이 인증서의 발급 방법은 생략.
발급된 경로만 잘 확인하여 후에 설정할 때 적절한 경로를 넣어주면 된다.

이 후 발급된 인증서를 Dovecot / Postfix 각각 설정에 적절히 넣어주면 된다.


전체 구성도

아직 시작도 안했지만 벌써부터 복잡한, 전체 구성도는 아래와 같다.

DB와 메일 서버는 동일 서버여도 되지만 난 분리되어 있기 때문에 이미지상 분리해뒀다.

이미지에서 볼 수 있다시피 Lambda가 DB와 EC2 서버에 각각 접근해야 하는데, DB는 당연하고 LMTP도 Public 오픈을 권장하지 않기 때문에 Lambda를 private subnet에 넣고 동일 VPC 네트워크 내에 사설망을 이용하도록 구성하였음.


나중에 사용자 인증을 LDAP 으로 사용한다거나.. 등도 고민 중인데..... 갈길이 멀다.....ㅠ

iDRAC 에 접속하면 Virtual Console 이라고,, 간단하게 말해서 원격으로 서버 콘솔에 접근할 수 있다.
일종의 원격제어...
서버가 죽어도 서버실에 갈 필요 없이 왠만한 복구는 다 할 수 있게 해주는 한줄기 빛같은 존재

Java Web Start 라고, 웹브라우저에서 바로 자바를 실행할 수 있게 만들어진 프레임워크를 사용하는데, 요즘에 보안때문에 그런게 될일은 당근 없고, 그냥 viewer.jnlp 파일이 다운받아지는걸 자바로 실행해주면 된다.

평소엔 쓸 일이 없으니 봉인해두다가, 오늘 쓸일이 있어서 열어봤는데

안된다...ㅠㅠㅠ

검색해보니 Java Web Start 가 Java 9에서 deprecated 되었고, Java 11에서 삭제되었다고 함.
웹에서 실행해줄 뿐이지 어쨋든 자바니까, 직접 실행할 수 있는 방법을 찾아봤다.

우선 jnlp 파일을 열어보면 연결에 필요한 인자값들과 OS와 아키텍쳐에 따른 java 파일 링크가 걸려있다.
avctKVM.jar 파일과 연결하려는 시스템에 맞는 lib 파일들을 받는다.

그리고 구버전 JRE를 구한다. 설치할 필요는 없으니 오라클 홈페이지에서 tar.gz 버전으로 다운로드 받으면 됨.
1.7.0_80 (7u80) 버전이 된다길래 난 이걸로 했음.
bin, lib 등이 있는 폴더를(Mac버전 기준 Home) jre 라는 이름으로 바꿔서 가져온다.

정리하면,
┣ avctKVM.jar
┣ lib/
┃    ┣avctKVMIOMac64.jar
┣    ┗avctVMAPI_DLLMac64.jar
┣ jre/
    ┣ bin/...
┗    ┗ lib/...
이런느낌의 디렉토리 구성이 되도록..

이 후 viewer.jnlp 파일의 인자를 참고하여 다음과 같이 명령어를 실행하면 된다.
- viewer.jnlp 에는 일회용 ID/PW가 있는데, 그걸 써도 되지만 원래 계정을 입력해도 접속이 잘 됨.
- 없어도 되는 인자도 있겠지만 난 그냥 다 넣어줌.
- vmprivilege는 참고한 글에서 넣어줬길래 그냥 넣어줌.

./jre/bin/java -cp avctKVM.jar \
	-Djava.library.path=./lib com.avocent.idrac.kvm.Main \
	ip=SERVER_HOST \
	vm=1 \
	user=USER_ID \
	passwd=USER_PW \
	kmport=9595 \
	vport=9595 \
	apcp=1 \
	reconnect=1 \
	chat=1 \
	F1=1 \
	custom=0 \
	scaling=15 \
	minwinheight=100 \
	minwinwidth=100 \
	videoborder=0 \
	version=2 \
	vmprivilege=true

아, java 를 인터넷에서 받았다고 실행을 안해줄텐데, 파인더에서 option+열기로 먼저 실행해주거나,,, 여러가지 방법으로 허용해주면 됨.
난 걍 개인 정보 보호 - 개발자 도구 옵션에서 터미널을 추가했음

이러면 원래 쓰던거처럼 연결이 잘 됨.
다만 맥 기준,
한번이라도 한글인 상태로 타이핑을 하면 키 입력이 이상하게 들어가서 재접속을 해야하고
macOS 보안 옵션 문제인지 전체 키스트로크를 받을 수 없다고 오류가 난다. 이건 설정에서 직접 허용해주면 될 것 같기도 함.

 

+ Recent posts