lrzsz๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์์ /์ ์กํ ์ ์๋๋ก ZModem์ ์ง์ํฉ๋๊น? ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฝ๋๊น?
xterm.js์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ข ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
xterm.js๋ฅผ ์ฌ์ฉํ์ฌ bash(์ ์ฒด ๊ธฐ๋ฅ bash)์ ์ฐ๊ฒฐํ๊ณ ์ฌ์ฉ์๊ฐ bash์ ์ํธ ์์ฉํ๋๋ก ํฉ๋๋ค. ์ง์ ์ฌ์ฉ์๊ฐ rz/sz๋ฅผ ์ฌ์ฉํ์ฌ ์น ํฐ๋ฏธ๋์ ํตํด ํ์ผ์ ์ ๋ก๋/๋ค์ด๋ก๋ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
SecureCRT/Xshell์ ์ฌ์ฉํ์ฌ ๋จธ์ ์ ์
ธ์ ์ฐ๊ฒฐํ๋ฉด rz
/ sz
๋ช
๋ น์ผ๋ก ํ์ผ์ ์
๋ก๋/๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค. zterm.js๋ฅผ ์ฌ์ฉํ์ฌ ๋จธ์ ์ ์
ธ์ ์ฐ๊ฒฐํ๊ณ rz
/ sz
๋ช
๋ น์ผ๋ก ํ์ผ์ ์
๋ก๋/๋ค์ด๋ก๋ํ๊ณ ์ถ์ต๋๋ค.
Zmodem์ PTY ์์คํ
์ ๊ธฐ๋ณธ ์ง๋ ฌ ํ์ ์ถ์ํ์ ํ๋กํ ์ฝ ๊ธฐ๋ฅ์
๋๋ค. ์ด๊ฒ์ ์ด๋ฏธ xterm.js์ zssh
์ ๊ฐ์ ๋๊ตฌ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. xterm.js ์์ฒด๋ PTY์ ๋ง์คํฐ IO๋ฅผ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํฉ๋๋ค. ์ค์ ๋ก๋ xterm.js ์๋ฒ ๋ถ๋ถ์ด ํธ์คํ
๋๋ ์์คํ
์์ ์๋ํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ SecureCRT์ ๊ฐ์ ๋์ผํ ์์คํ ์์ ์๋ํ๋ ํฐ๋ฏธ๋ ์๋ฎฌ๋ ์ดํฐ์ ์๋นํ ๋ค๋ฆ ๋๋ค.
๋ฐ๋ผ์ ์ง๋ฌธ์ - ํฐ๋ฏธ๋์ ํตํด ํ์ผ์ ์ด๋ค ์์คํ ์์ ์ด๋ค ์์คํ ์ผ๋ก ์ด๋ํ์๊ฒ ์ต๋๊น? (๋ก์ปฌ ๋จธ์ ์๋ xterm.js์ ์๋ฒ ๋ถ๋ถ์ ๋ํ ํฐ๋ฏธ๋ ์ฑ๋์ด ์์์ ๊ธฐ์ตํ์ญ์์ค).
| local machine |
| +----------------------------+ |
| | browser | |
| | +-------------------+ | | +---------------------------+ +------------------------+
| | | | | | | proxy | | |
| | | web terminal >-----------------------> server part of xterm.js >----------| romote machine terminal|
| | | | | | +---------------------------+ +------------------------+
| | | | | |
| | +-------------------+ | |
| +----------------------------+ |
+-----------------------------------+
๋ก์ปฌ ์ปดํจํฐ์์ ์๊ฒฉ ์ปดํจํฐ๋ก ํ์ผ์ ์ด๋ํ๊ณ ์ถ์ต๋๋ค. ์๊ฒฉ ์์คํ ์ ์ธ๋ถ IP๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ ์์คํ ์์ ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๋ก์ปฌ ์์คํ ์๋ xterm.js์ ์๋ฒ ๋ถ๋ถ์ ๋ํ ํฐ๋ฏธ๋ ์ฑ๋์ด ์์ต๋๋ค.
์ด์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
ํ๋ก์์์ zssh(zmodem ์ง์ ํฌํจ), sftp ๋๋ scp๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ๊ฐ ๊ตฌํํ์ง ์๋ ํ ๋ธ๋ผ์ฐ์ ์ ์น ํฐ๋ฏธ๋์์ ์๊ฒฉ ์์คํ ์ผ๋ก ์ง์ ํ์ผ์ ์ ๋ก๋/๋ค์ด๋ก๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ชจ๋ ํ๋กํ ์ฝ ์ค ํ๋๋ฅผ ๊ทธ๋ฐ ์์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง(XModem JS ๊ตฌํ์ด ์์) ๋ธ๋ผ์ฐ์ ์ ํ์ผ ์์คํ ์ก์ธ์ค๊ฐ ๋งค์ฐ ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ์ฉ์ฑ์ ์๋ฌธ์ ์ ๊ธฐํฉ๋๋ค. ์ด๋ ค์ด ๋ถ๋ถ์ ํฐ ํ์ผ์ ๋ํด ๋ธ๋ผ์ฐ์ ์ ๋ค์ด๋ก๋ ์ํธ ์์ฉ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค(๋ฐ์ดํฐ๊ฐ ์น ์์ผ์ ํตํด ๋ธ๋ผ์ฐ์ ์ ์ง์ ๋์ฐฉํ๊ธฐ ๋๋ฌธ์ JS๋ ์ ์ฅํ ์ ์์ ๋๊น์ง ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํด์ผ ํฉ๋๋ค).
๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ rz/sz ๊ธฐ๋ฅ์ผ๋ก ์๋ฒ ๋ถ๋ถ์ ๊ฐ์ ํ๊ณ ์ด๋ฅผ ๋ธ๋ผ์ฐ์ ์ ํฌ๋ช ํ๊ฒ ๋งคํํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๋ธ๋ผ์ฐ์ ์ FS ์ ํ์ ์ฐํํ์ง๋ง ๋ชจ๋ ํ๋กํ ์ฝ์ 'rz\r' ์ด๊ธฐํ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ํฐ๋ฏธ๋ ์คํธ๋ฆผ์ ๋ค๋ฅธ ํ์๋ฅผ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค.
์ ๋ JavaScript์์ ZMODEM ๊ตฌํ ์์ ์ ํ๊ณ ์์ผ๋ฉฐ xterm.js๋ฅผ ํตํด ์๋ฐฉํฅ์ผ๋ก ํ์ผ์ ์ ์กํ๋๋ก ํ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ค์ ๋ก ํ์ผ์ ๋ฐ์ ๋ ์ ์ฒด ํ์ผ์ ๋ฒํผ๋งํด์ผ ํฉ๋๋ค. :(๊ทธ๊ฒ์ด ์ ์ผํ ๋จ์ ์ด์ง๋ง, ๋งค์ฐ ํฐ ํ์ผ์ ๋ณด๋ด์ง ์๋ ํ ๋์์ง ์์ต๋๋ค. ์
๋ก๋๋ FileReader๋ฅผ ํตํด ์ํํ ์ ์์ผ๋ฉฐ ๋ค์ด๋ก๋๋ <a>
์์์ "๋ค์ด๋ก๋" ์์ฑ์ ํตํด ๋ฐ์ํฉ๋๋ค.
์์ง ํ ์คํธํ๊ณ ๋ฌธ์ํํ๊ณ ์์ง๋ง ZMODEM ํตํฉ์ด xterm.js์ ๊ด์ฌ์ ๊ฐ์ง ๋งํ ๊ธฐ๋ฅ์ ๋๊น?
@FGasper Nice :) ๋ ธ๋์ ์คํธ๋ฆผ API๋ก ๊ตฌํํ๋ค๋ฉด ๋ค์ด๋ก๋ ๋งํฌ๋ฅผ ํตํด ํด๋น ํ์ผ์ ๋ธ๋ผ์ฐ์ ๋์ ์ ํ๋ก์ํ๋ ์๋ฒ ์ธก ํ์ฅ์ผ๋ก ํฐ ํ์ผ์ ์ ์ฉํ ์๋ ์์ต๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด๋ ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์์ผ๋ฏ๋ก ์ด๋์๋ ์๋ํด์ผ ํฉ๋๋ค. (๋๋ฌด๋ฅผ ๋๋๋ฆฐ๋ค.)
@FGasper๋ ๊น๋ํ๊ฒ ๋ค๋ฆฌ๋ค์ ๐!
๋ธ๋ผ์ฐ์ ์์ ์๋ํ๋ค๋ฉด zmodem ์ ๋์จ์ ํ์คํ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก zmodem์ ์ฌ์ฉํ๋ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์ ๋๊น?
ํฐ๋ฏธ๋ ์ธ์ ๋ด์์ ๋ด ์ํฌ์คํ ์ด์ ์ผ๋ก/์์ ํ์ผ ์ ์ก์ ์ํํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๊ฒ์ ๋น์ ์ด scp/sftp ๋๋ ๊ทธ๋ ์ง ์์ ๊ฒ์ ํ ํ์๊ฐ ์๋๋ก ํฉ๋๋ค.
iTerm2์ ๊ฒฝ์ฐ์ ์ ์ฌํฉ๋๋ค.
https://github.com/mmastrac/iterm2-zmodem
@parisk X/Y/Z-MODEM ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ชฝ์์ ์ง์ ํ์ผ์ ์ ์กํ๊ธฐ ์ํด ํฐ๋ฏธ๋ ์ฐ๊ฒฐ์ "๋จ์ฉ"ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋จ์ผ ํฐ๋ฏธ๋ ์ธ์
์ ํตํด์๋ง ์๋ฒ๋ฅผ ์ค์ผ์คํธ๋ ์ด์
ํ๋ ค๋ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. POSIX ์์คํ
์ ๊ฒฝ์ฐ ์ด๋ฅผ ์ํํ๊ธฐ ์ํ rz
/ sz
๋๊ตฌ๊ฐ ์์ต๋๋ค.
xterm.js์ ๊ฒฝ์ฐ ์๋ฒฝํ ์ ๋์จ์ด๋ฉฐ ์ ํ๋ ํ๊ฒฝ์ ์๋ฒ ๊ด๋ฆฌ์์๊ฒ xterm.js์ ์ ์ฉ์ฑ์ ๋์ผ ๊ฒ์ ๋๋ค. :+1:
์ฃผ์: XMODEM๊ณผ YMODEM์ ๋ชจ๋ ์๋๋ฐฉ์๊ฒ ํ์ผ ์ ์ก ์ค๋น๊ฐ ๋์๋ค๋ "ํ๋กฌํธ"๋ฅผ ํ์ํ์ง ์๋๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. (ํจ์ฌ ๋ ๊ฐ๋จํ๊ธฐ ๋๋ฌธ์ ๋ถํํฉ๋๋ค!)
ZMODEM์ ๋ณธ์ง์ ์ผ๋ก ๊ฐ์ํ ์ ์๋ "๋ง๋ฒ์ ๋ฌธ์์ด"์ ๋ณด๋ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์์๊ฒ "ZMODEM์ด ๊ฐ์ง๋์์ต๋๋ค. ํ์ผ ์ ์ก์ ๊ณ์ํ์๊ฒ ์ต๋๊น?โ ์ด ์์ ์์ ๊ตฌํ์ ์ ์กํ ํ์ผ์ ์ ๊ณตํ๊ฑฐ๋ ๋ณด๋ธ ์ฌ๋์ด ์ ๊ณตํ๋ ํ์ผ์ ์๋ฝ/๊ฑด๋๋ฐ๊ธฐ ์ํ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
xterm.js์ ๊ฒฝ์ฐ ํ์ผ์ ํฐ๋ฏธ๋์ ๋์ด๋ค ๋๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ํ์ผ์ด ํ์ฌ ํฐ๋ฏธ๋ ์
ธ ๊ฒฝ๋ก์ ์ ์ฅ๋๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ xterm.js๊ฐ ์๊ฒฉ ์ ์์ฒด๋ฅผ ์ ์ดํ๊ฑฐ๋ ์ ์ด๋ ํ์ฌ ์์
๋๋ ํ ๋ฆฌ๋ฅผ ์ด๋ ์์ ์์๋ ์ก์ ์ ์๋ค๋ฉด ๋ฌ์ฑํ๊ธฐ๊ฐ ๋งค์ฐ ๊น๋ค๋กญ์ต๋๋ค. ๊ฑฐ๊พธ๋ก๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ls
๋ชฉ๋ก์ด ์๊ฒฉ ํ์ผ์ ์ฐธ์กฐํ๋ ๊ฒ์ผ๋ก ๋ฐ๊ฒฌ๋ ์ ์๋ค๋ฉด ํฐ๋ฏธ๋์์ ๋์ด์ ๋๊ธฐ๊ฐ ๊น๋ํ ๊ฒ์
๋๋ค. ๊ธ์ ๊ทธ๋ฅ ๊ฟ์ ๊พธ๊ณ ์๋ค :์ํฌ:
Zmodem ์ธ์
์ด ์์๋๋ฉด rz
๋๋๊ทธ/๋๋กญ์ด ๊ฐ๋ฅํ์ง ์์ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์์ง๋ง ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1) ์ฝ์์ rz
๋ฅผ ์
๋ ฅํฉ๋๋ค.
2) ํ์ผ์ ๋์ด๋ค ๋์ต๋๋ค.
3) ์ ์ก์ ์์ํฉ๋๋ค.
์ง๋ฌธ: xterm.js๊ฐ ์ฌ์ ํ IE ์ง์์ ์ด๋ป๊ฒ ์ค์ ๋์ด ์์ต๋๊น?
https://github.com/sourcelair/xterm.js/pull/938 ๋ก ์ธํด v3์์ ๋ ์ด์ IE๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก ๊ฐ๋ฐ์๋ ์ด์จ๋ ์ค๋จํด์ผ ํฉ๋๋ค.
์ฌ๋ฌ๋ถ๊ป ๋ฐ๋ชจ๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
๋๋ ๋ด ์์ ์ ํฐ๋ฏธ๋ ์๋ฒ์ ๋ํด ํ ์คํธํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
^^ ์ ๊ฐ ์ฌ๊ธฐ์ ๋์น๊ฒ ์๋์? npm install
์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค...
felipe@Macintosh-4 18:00:56 ~/code/p5-Net-WebSocket/demo
> sudo npm install
npm ERR! install Couldn't read dependencies
npm ERR! Darwin 16.7.0
npm ERR! argv "/opt/local/bin/node" "/opt/local/bin/npm" "install"
npm ERR! node v8.3.0
npm ERR! npm v2.15.12
npm ERR! path /Users/felipe/package.json
npm ERR! code ENOPACKAGEJSON
npm ERR! errno -2
npm ERR! syscall open
npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'
npm ERR! package.json This is most likely not a problem with npm itself.
npm ERR! package.json npm can't find a package.json file in your current directory.
npm ERR! Please include the following file with any support request:
npm ERR! /Users/felipe/code/p5-Net-WebSocket/demo/npm-debug.log
git clone ...
๋ฅผ ์์ด๋ฒ๋ ธ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ์ sudo
์
๋๊น?
@FGasper
npm ERR! package.json ENOENT: no such file or directory, open '/Users/felipe/package.json'
repo ๋๋ ํ ๋ฆฌ๊ฐ ์๋ ํ ๋๋ ํ ๋ฆฌ์์ npm install
ํ๊ณ ์์ต๋๋ค.
๋ฌธ์์ด์ด ์๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋๋ก node-pty๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ZMODEM์ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ด์ง๋ง ๋ฐ๋ชจ์์๋ ๋ชจ๋ ๊ฒ์ด UTF-8์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ํนํ, ๋ญ๊ฐ 0x8a๋ฅผ UTF-8๋ก ๋ณํํ๋ ๊ฒ ๊ฐ์ต๋๋ค \ufffd
์ด๊ฒ์ ์ข ๋ ๋ณต์กํ ์ ์์ต๋๋ค. ๋น ๋ฅธ ์์ ์ ์ํด node-pty์ ์ธ์ฝ๋๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ๋ฌธ์์ด ์ ํ์ 'binary'๋ก ์ค์ ํ ์ ์์ง๋ง xterm.js๋ก์ websocket ์ ์ก์ ์์น ์๋ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ ์ ์ฒด ์ฒด์ธ node-pty <---> websocket <---> xterm.js
์ ์ฆ์ JS ๋ฌธ์์ด๋ก ๋์ฝ๋ฉ๋๋ UTF-8 ๋ฐ์ดํธ์ ์์กดํฉ๋๋ค. ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ํ๋ฆ์ ์ป์ผ๋ ค๋ฉด ๋ ํฐ ํจ์น๊ฐ ํ์ํ ์ ์์ต๋๋ค.
binary
๋ฌธ์์ด ์ ํ ์ค์ ์ ์ด๋์ ์์ต๋๊น? (๋๋ node-pty์์ ๊ทธ๋ฐ ๊ฒ์ ๋ณผ ์ ์์ต๋๊น?)
๋ด๊ฐ ๋งํ ์ ์๋ ํ, ๋ฐ์ดํฐ๋ app.js
๋๋ฌํ ๋ ์ด๋ฏธ ์์๋์์ผ๋ฏ๋ก ๋์์ ๋ณ๊ฒฝ์ node-pty์ ์์ด์ผ ํฉ๋๋ค.
ZMODEM์ ๋ชจ๋ ์์ ๋นํธ ๋ฌธ์๋ฅผ 7๋นํธ๋ก ์ด์ค์ผ์ดํ ์ฒ๋ฆฌํ๋ ์ธ์ฝ๋ฉ์ ์ค๋ช ํ์ง๋ง ์ค์ ๋ก ๊ตฌํ๋ ์ ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Forsberg๋ ๋ชจ๋ ๋ผ์ธ์ด 8๋นํธ๋ก ์์ ํด์ง๋ฉด ํ์ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ ๊ฒ์ ๋๋ค. :)
ctor ์ต์
์์ {encoding: 'binary'}
๋๋ ์ฆ์ .setEncoding('binary')
์๋ํ ์ ์์ต๋๋ค.
๊ฐ์ฅ ์ต๊ทผ์ node-pty๊ฐ UTF8 ๋ชจ๋๋ฅผ ์ค์ ํ๊ฑฐ๋ ์ค์ ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค...
if (info[8]->ToBoolean()->Value()) {
#if defined(IUTF8)
term->c_iflag |= IUTF8;
#endif
}
https://github.com/Tyriar/node-pty/blob/master/src/unix/pty.cc
ํ โฆ xterm.js๊ฐ ๊ฐ์ ธ์ค๋ node-pty(0.4.1)๋ ๊ฝค ์ค๋๋ ๊ฒ์ ๋๋คโฆ ์๋ง๋ ๊ฐ์ฅ ์ต๊ทผ ๋ฒ์ ์๋ ํด๋น ํ๋๊ทธ๊ฐ ํฌํจ๋ ๊ฒ์ ๋๋ค.
.setEncoding('binary')
ํธ์ถํ๋ ๊ฒ์ ์๋ํ์ง ์์ต๋๋ค ... ๊ทธ๋ฆฌ๊ณ encoding:"binary"
๋ฅผ pty.spawn()์ ์ ๋ฌํ์ง๋ ์์ต๋๋ค.
termios์ IUTF8์ ๋ค๋ฅธ ์ผ์ ํฉ๋๋ค. pty ์ฅ์น์์ ๋ค์ค ๋ฐ์ดํธ UTF8 ๋ฌธ์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค(์ค ๋๋น ๋ฐ ์ง์ฐ๊ธฐ).
ํ ์๋ง๋ ์ด๋ ค์ด ๋ฐฉ๋ฒ์ผ ๊ฒ์
๋๋ค. ์ธ์ฝ๋๋ฅผ ์ ๊ฑฐํด ๋ณด์ญ์์ค.
delete ptyObj._socket._readableState.decoder;
delete ptyObj._socket._readableState.encoding;
์ด๊ฒ์ ๋ฌธ์์ด ๋์ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค(๋๋ถ๋ถ xterm.js๋ก ๋ถ๋ฆฌ๋ ๊ฐ๋ฅ์ฑ์ด ๋์).
์๊ฒ ์ต๋๋ค. node-pty 0.6.4๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ ์ธ์ฝ๋ฉ์ null
์ค์ ํ์ฌ ์ป์์ต๋๋ค. ( _readableState
ํ์ํ์ง ์์์ต๋๋ค.) ์ฌ์ ํ ์ ์ธ์
์ ์ฒซ ๋ฒ์งธ ๋ผ์ธ์ ํ
์คํธ๋ก ๋ณด๋ด์ง๋ง ๊ทธ ์ดํ์ ๋ชจ๋ ๊ฒ์ ๋ฐ์ด๋๋ฆฌ์
๋๋ค. ์ ๋ง ๋ฉ์ง๋๋ค.
์ฌ์ ํ ์ ์ธ์ ์ ์ฒซ ๋ฒ์งธ ์ค์ ํ ์คํธ๋ก ๋ณด๋ ๋๋ค...
{encoding: null}
๋ก ์์ฑ์์ ์ ์ฉํด๋?
์, {encoding: null}
ํ๋๋ผ๋ ์ฒซ ๋ฒ์งธ ์ค์ ํ
์คํธ ํ๋ ์์ผ๋ก ์ ์ก๋ฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์๋ํ๊ธฐ์ ํฉ๋ฆฌ์ ์ธ ์ํ๋ผ๊ณ ์๊ฐํ๋ ์ํ๋ก ์ด๊ฒ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
1) https://github.com/FGasper/xterm.js.git์ ์๊ฒฉ์ผ๋ก ์ค์ ํฉ๋๋ค.
2) ํด๋น repo์ zmodem
์ง์ ์ ํ์ธํฉ๋๋ค.
3) git submodule init; git submodule update
4) npm install
(์๋ ์ฐธ์กฐ)
5) npm start
, ๋ธ๋ผ์ฐ์ ์์ localhost:3000
๋ฅผ ๋ก๋ํฉ๋๋ค. (ํฌ๋กฌ์ ๋ด๊ฐ ํ
์คํธ ํ ๊ฒ์
๋๋ค.)
6) lrzsz
์ค์น๋ ์ปดํจํฐ์ ssh.
7) rz
๋ฅผ ์
๋ ฅํ๊ณ ์ํฌ์คํ
์ด์
์์ ์๊ฒฉ์ผ๋ก ํ๋ ์ด์์ ํ์ผ์ ๋ณด๋
๋๋ค.
8) sz <filename1> <filename2> โฆ
๋ ํ์ผ์ ์ผ๊ด์ ์ผ๋ก ์ํฌ์คํ
์ด์
์ผ๋ก ๋ณด๋
๋๋ค.
(UI๋ ์ต์ํ์ ๋์์ธ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ "์ค์ " ๋ฐฐํฌ๊ฐ ๋ ๋ค๋ฌ์ด์ง ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.)
4๋จ๊ณ์ ๊ด๋ จํ์ฌ: ๋ฐฉ๊ธ ๋ด ์ํฌ์คํ
์ด์
์์ ํ
์คํธํ์ ๋ node-gyp
ํจํค์ง์ ๊ถํ ๋ฌธ์ ๋ฅผ ์์ ํด์ผ ํ์ต๋๋ค.
๋ฉ์ง๋ค. ๋งค๋ ฅ์ฒ๋ผ ์๋ํ๋ค(Firefox์์ ํ ์คํธ ํ์ผ๋ก ํ ์คํธ).
๋ช ๊ฐ์ง ์ค๋ช :
rz
์ค๋จ๋์ง ์์ต๋๋ค.rz/sz
ํฐ๋ฏธ๋์ ์ด์ํ ์ํ ๋ฒํธ๋ฅผ ์ธ์ํฉ๋๋ค.@jerch
1) ์, ์ค์๋ก ์ด๊ธฐํ ์ํ์ค๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด "ZMODEM ์ธ์ ์์" ํ๋กฌํํธ์ ๋ชฉ์ ์ ๋๋ค. ์ฌ์ฉ์๋ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ ํ ๋ค๋ก ๋ฌผ๋ฌ๋ ์ ์์ต๋๋ค.
2) ์ง๊ธ ๊ณ ์ณ์ผ ํฉ๋๋ค.
3) ์ ํ๋ฆฌ์ผ์ด์
์ ๋ธ๋ผ์ฐ์ ์ FileReader API์ ๋๊ธฐํํ์ฌ progress
์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค. Chrome์ progress
์ฝํ
์ธ ๋ฅผ ์ ๊ณตํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ Firefox๋ ์ค์ ๋ก ํด๋น ์ด๋ฒคํธ์์ ํ์ผ ๋ด์ฉ์ ์ ๊ณตํ์ง ์์ต๋๋ค. Chrome์์ ์ ์ ํ๊ฒ ํฐ ํ์ผ์ ๋ณด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
4) ์ธ์
์์ ์ ์ด์ํ ๋ฌธ์๋ ZMODEM ์์ ์ด๊ธฐํ ์ํ์ค์ ์ธ์ ๊ฐ๋ฅํ ๋ถ๋ถ์
๋๋ค. **
+ ASCII CAN + B01
+ 10์ง์ ๋ฌธ์ + CR + 0x8a + XON. ๋๋ ๊ทธ๋ค์ด ํ๋ฉด์ ๊ฐ๋ ๊ฒ์ด ์ถํ๋ค๋ ๊ฒ์ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ด๊ฐ ์ฌ์ฉํ ZMODEM์ ์ ํตํ ํฐ๋ฏธ๋์์ ๊ฝค ํ์ค์ ์
๋๋ค. ํด๋น ๋ฌธ์๋ฅผ ์ญ์ ํ๊ธฐ์ ์ถฉ๋ถํ BS ๋ฌธ์๋ฅผ ํฐ๋ฏธ๋์ ๋ณด๋ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น?
๋ํ ์งํ ์ค์ธ ์ ์ก์ ์ทจ์ํ๊ธฐ ์ํด ์ปจํธ๋กค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
๋ํ ์งํ ์ค์ธ ์ ์ก์ ์ทจ์ํ๊ธฐ ์ํด ์ปจํธ๋กค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๋๋ ์ฌ์ ํ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค.
์ฌ์์์ ์ด๊ฒ์ด ๋์์ด ๋ ๊น์?
A ZFIN, ZABORT, or TIMEOUT terminates the session; a ZSKIP terminates the processing of
this file.
์ ์ฌ์ ์ผ๋ก. ์ฌ์์ด ํญ์ ๊ฐ์ฅ ์ ์ฉํ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, ZSINIT ๋ค์์ ์ ์ก๋๋ Attn ์ํ์ค๋ฅผ ์ธ๊ธํฉ๋๋ค. ์ฌ์์ ๊ทธ๊ฒ์ด ๋ฐ์ ์๊ฐ ๋ฐ์ดํฐ ์ ์ก์ ์ผ์ ์ค์งํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ธ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง ์ค์ ๋ก Attn์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ต๋๋ค. ESC8 ์ต์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก: ์ค์ ๋ก lrzsz
์์ ๊ตฌํ๋์ง ์์ผ๋ฉฐ ์ด๊ฒ์ด ์ฌ์ค์์ ์ฐธ์กฐ ๊ตฌํ์ด๊ธฐ ๋๋ฌธ์ ESC8์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ termios IEXTEN ํ๋๊ทธ๋ก ํด๋น ๋ฌธ์ ๋ฅผ ํ๋ฅญํ๊ฒ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋๋ฌ์ด ์ผ์
๋๋ค.
๋๋ ์ง๊ธ ๋ค๋ฅธ ํ๋ก์ ํธ์ ์๊ฐ์ด ์กฐ๊ธ ์ด๋ฐํ์ง๋ง ๋ค์ ์ฃผ์ ๋์์ค๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค.
xterm ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค๊ธฐ ์ํด ์ด๊ฒ์ ๋ชจ์์ ๋ํด 2์ผํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ฉด: UI๋ฅผ ์ ํ ์ถ๊ฐํ์ง ์๊ณ ๋ ธ๋ ์คํธ๋ฆผ๊ณผ ์ ์ฌํ ์ด๋ฒคํธ๋ฅผ ํตํด ๋์คํจ์นํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ฐ์ ๊ฒ
term.on('transfer', (transfer) => {
// accept or reject the transfer
transfer.accept();
// listen for progress
transfer.on('progress', ...);
// data chunks arrive
transfer.on('data', ...);
// transfer has finished
transfer.once('end', ...);
// cancel transfer
transfer.abort();
});
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋น์๋ ํ๋ฌ๊ทธ์ธ ์์ ์์ฒด UI๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
@mofux ์ด๊ฒ์ด ๋ด๊ฐ ์ํ๋ ๋ฐฉ์์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ชจ์ ๋ฃ์ UI ๊ตฌ์ฑ ์์๋ ์ปจํธ๋กค์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
@FGasper ์ํ์ด ๐
API๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ฉด(https://github.com/tsl0922/ttyd/issues/37) ttyd์ ๋ํ ZModem ์ง์์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ์์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
https://www.npmjs.com/package/zmodem.js
zmodem.js์ ALPHA ๋ฆด๋ฆฌ์ค๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฌ๊ธฐ์์ xterm.js์ฉ ํ๋ฌ๊ทธ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ง๋ง zmodem.js๋ฅผ ๋ณด๊ณ ์ถ์ ์ฌ๋์ ์ธ์ ๋ ์ง ๊ทธ๋ ๊ฒ ํ๊ณ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๋ ค์ฃผ์ญ์์ค.
์ฐธ๊ณ ๋ก ZMODEM ์ ๋์จ์ด ์ด์ ๋ณํฉ๋์์ต๋๋ค.
win7 ์์คํ
$ npm run start-zmodem
> [email protected] start-zmodem E:\test\xterm\xterm.js
> node demo/zmodem/app
App listening to http://127.0.0.1:3100
ํ์ผ ํ์๊ธฐ๋ฅผ ์ด ์ ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
xterm ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค๊ธฐ ์ํด ์ด๊ฒ์ ๋ชจ์์ ๋ํด 2์ผํธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ฉด: UI๋ฅผ ์ ํ ์ถ๊ฐํ์ง ์๊ณ ๋ ธ๋ ์คํธ๋ฆผ๊ณผ ์ ์ฌํ ์ด๋ฒคํธ๋ฅผ ํตํด ๋์คํจ์นํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ฐ์ ๊ฒ
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์๋น์๋ ํ๋ฌ๊ทธ์ธ ์์ ์์ฒด UI๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.