๐Ÿš ShellKit (libc + pysh)

June 27, 2025 ยท View on GitHub

echo๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ์…ธ์—์„œ ์‹œ์Šคํ…œ ์ฝœ๊นŒ์ง€ Python์œผ๋กœ ๋‹จ๊ณ„๋ณ„ ์ถ”์ .

Python Version PyPI version License: MIT Platform Languages CI

English | ็ฎ€ไฝ“ไธญๆ–‡ | ๆ—ฅๆœฌ่ชž | ํ•œ๊ตญ์–ด


๐Ÿ“– ๊ฐœ์š”

ShellKit์€ Unix ์Šคํƒ€์ผ์˜ ๊ต์œก์šฉ ํ„ฐ๋ฏธ๋„ ํˆดํ‚ท์œผ๋กœ, ๋‘ ๊ฐœ์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • Libc: Python ์œผ๋กœ ๊ตฌํ˜„ํ•œ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜. syscall, write, printf ๋“ฑ์„ ํฌํ•จํ•˜๋ฉฐ, ์œ ์ € ๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ชจ๋“œ๋กœ์˜ ํ๋ฆ„์„ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • Pysh: Libc ์œ„์— ๊ตฌ์ถ•๋œ ๋Œ€ํ™”ํ˜• ์…ธ. ๋‚ด๋ถ€ ๋ช…๋ น์–ด, REPL, ๊ณ„์ธต๊ฐ„ ์ถ”์  ๊ธฐ๋Šฅ๊ณผ ๋‹ค๊ตญ์–ด ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์™€ ํ„ฐ๋ฏธ๋„ ๋งˆ๋‹ˆ์•„๋ฅผ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

macOS ์™€ Linux ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, Arm64 ๋ฐ x86_64 ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

โœจ ๊ธฐ๋Šฅ

Pysh

  • ๐Ÿง  ๋‚ด์žฅ ๋ช…๋ น์–ด (cd, echo, pwd, env ๋“ฑ)
  • ๐Ÿงต ๋‹ค๊ตญ์–ด ์ง€์› (์˜/์ค‘/์ผ/ํ•œ ๋งค๋‰ด์–ผ ์ œ๊ณต)
  • ๐Ÿ” ๊ณ„์ธต ๊ฐ„ ํŠธ๋ ˆ์ด์‹ฑ (๋ช…๋ น ํŒŒ์‹ฑ โ†’ libc ํ•จ์ˆ˜ โ†’ C syscall)
  • ๐Ÿงฉ ์กฐํ•ฉ ๊ฐ€๋Šฅํ•œ REPL ์‹คํ–‰ ๋ชจ๋ธ
  • ๐Ÿ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜ ๋ช…๋ น ๋“ฑ๋ก ์‹œ์Šคํ…œ

Libc

  • ๐Ÿ–จ๏ธ ์ปค์Šคํ…€ printf ์—”์ง„ (%s, %d, %f ๋ฐ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค ์ง€์›)
  • ๐Ÿ“œ Python โ†” C syscall ๋ธŒ๋ฆฟ์ง€ (syscall/syslib.so ์‚ฌ์šฉ)
  • ๐Ÿงช pytest ํ…Œ์ŠคํŠธ ํฌํ•จ, ํ•ต์‹ฌ ํ•จ์ˆ˜ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ ์ œ๊ณต

๐Ÿ“ฆ ์„ค์น˜ ๋ฐฉ๋ฒ•

Python 3.10 ์ด์ƒ ํ•„์š”

pip๋กœ ์„ค์น˜:

pip install shellkit

์„ค์น˜ ํ›„ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰:

pysh

๐Ÿš€ ์‚ฌ์šฉ๋ฒ•

pysh [์˜ต์…˜๋“ค]

๋ช…๋ น์ค„ ์˜ต์…˜

์˜ต์…˜์„ค๋ช…
--command๋‹จ์ผ ๋ช…๋ น ์‹คํ–‰
--no-banner์‹œ์ž‘ ๋ฐฐ๋„ˆ ์ถœ๋ ฅ ์ƒ๋žต
--no-reminderํœด์‹ ์•Œ๋ฆผ ๋น„ํ™œ์„ฑํ™”
--quiet์กฐ์šฉํ•œ ๋ชจ๋“œ (์ตœ์†Œ ์ถœ๋ ฅ)
--safe์•ˆ์ „ ๋ชจ๋“œ (rm -rf / ๋“ฑ์˜ ์œ„ํ—˜ ๋ช…๋ น ์ฐจ๋‹จ)
--debug์…ธ ๋ช…๋ น ๋””๋ฒ„๊น… ์ •๋ณด ํ‘œ์‹œ
--trace-echoecho, printf์˜ libc ํ˜ธ์ถœ ๊ฒฝ๋กœ ์ถ”์ 

๋„์›€๋ง ๋ณด๊ธฐ:

pysh --help

๐Ÿ“š ์˜ˆ์ œ ๋ฐ ํŠœํ† ๋ฆฌ์–ผ

ShellKit์˜ ์‹ค์ œ ๋™์ž‘์„ ๋ณด๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ํฌ๊ด„์ ์ธ ์˜ˆ์ œ๋“ค์„ ํ™•์ธํ•ด๋ณด์„ธ์š”:

โ†’ ์˜ˆ์ œ ๋ฐ ๋ฐ๋ชจ - ๊ธฐ๋ณธ๋ถ€ํ„ฐ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊นŒ์ง€, ์‹ค์ œ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜

๋‹ค๊ตญ์–ด ๋ฐ๋ชจ, ๋””๋ฒ„๊น… ํŠœํ† ๋ฆฌ์–ผ, ๊ณ ๊ธ‰ printf ํฌ๋งคํŒ…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค!

๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ (์ผ๋ถ€)


shellkit/
โ”œโ”€โ”€ native/         # C๋กœ ์ž‘์„ฑ๋œ syscall ๊ตฌํ˜„
โ”œโ”€โ”€ shellkit/       # ๋ฉ”์ธ ํŒจํ‚ค์ง€
โ”‚   โ”œโ”€โ”€ syscall/    # Python์—์„œ ํ˜ธ์ถœํ•˜๋Š” ctypes ๊ธฐ๋ฐ˜ ๋ž˜ํผ
โ”‚   โ”œโ”€โ”€ libc/       # ์ปค์Šคํ…€ libc (printf, write, exit ๋“ฑ)
โ”‚   โ”œโ”€โ”€ shell/      # ํ•ต์‹ฌ ์—”์ง„, ๋‚ด์žฅ ๋ช…๋ น์–ด, REPL ์‹คํ–‰๊ธฐ
โ”‚   โ”œโ”€โ”€ inspector/  # ๋””๋ฒ„๊ทธ ๋ฐ ํŠธ๋ ˆ์ด์‹ฑ ๋„๊ตฌ
โ”‚   โ””โ”€โ”€ i18n/       # ๋‹ค๊ตญ์–ด ์ง€์› ๋ฐ ๋ฒˆ์—ญ ๋ชจ๋“ˆ
โ”œโ”€โ”€ benchmarks/     # ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ
โ”œโ”€โ”€ examples/       # ์‚ฌ์šฉ ์˜ˆ์ œ ๋ฐ ๋ฐ๋ชจ ๋กœ๊ทธ
โ””โ”€โ”€ tests/          # ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ

๐Ÿงฉ ์ง€์› ํ”Œ๋žซํผ (syslib.so)

ํ”Œ๋žซํผ์ง€์› ์—ฌ๋ถ€์„ค๋ช…
Linux x86_64โœ… ์ง€์›rax = 1 + syscall ๋ฐฉ์‹
Linux ARM64โœ… ์ง€์›x8 = 64 + svc #0 ๋ฐฉ์‹
macOS Intel (x86)โœ… ์ง€์›rax = 0x2000004 + syscall ๋ฐฉ์‹
macOS ARM64 (M1/M2/M3)โœ… ์ง€์›syscall(SYS_write, ...) ๋ฐฉ์‹์œผ๋กœ ๋ž˜ํ•‘ ์ฒ˜๋ฆฌ
WindowsโŒ ๋ฏธ์ง€์›Windows๋Š” syscall() ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†์Œ

๐Ÿงญ ๋กœ๋“œ๋งต

ShellKit ์€ ์ด๋ฏธ ์•ˆ์ •์ ์ด๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ง€๋งŒ, ์•ž์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ณ„ํšํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๐Ÿ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ: ์‚ฌ์šฉ์ž ์ •์˜ ๋‚ด์žฅ ๋ช…๋ น์–ด, ๋ณ„์นญ, ํ•จ์ˆ˜ ๋“ฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›
  • ๐Ÿง  ๋”ฅ์”ฝํ‚น ๋ชจ๋“œ: eBPF ๋‚˜ ์ €์ˆ˜์ค€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”์ ์„ ์œ„ํ•œ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ
  • ๐Ÿงณ ์˜๊ตฌ ํ”„๋กœํ•„ ์ €์žฅ: ํ™˜๊ฒฝ ๋ณ€์ˆ˜, ์…ธ ํžˆ์Šคํ† ๋ฆฌ, ์ปค์Šคํ…€ ์„ค์ • ๋“ฑ์„ ์ €์žฅ
  • ๐Ÿงช ๋” ๋งŽ์€ ๋‚ด์žฅ ๋ช…๋ น์–ด: ls, cat, grep ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€
  • ๐Ÿ’ก ๋ฉ€ํ‹ฐ๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰: ์—ฌ๋Ÿฌ ์ค„์˜ ๋ช…๋ น์–ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ ๋ธ”๋ก์„ ํ•œ ๋ฒˆ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ

์ด ๊ธฐ๋Šฅ๋“ค์ด ํฅ๋ฏธ๋กญ๋‹ค๋ฉด, ๋””์Šค์ปค์…˜์„ ์—ด์–ด๋ณด์‹œ๊ฑฐ๋‚˜ PR ์„ ๋ณด๋‚ด์ฃผ์„ธ์š”.
์•„์ด๋””์–ด๋“  ์ฝ”๋“œ๋“ , ๋ชจ๋“  ํ˜•ํƒœ์˜ ๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

๐Ÿ’ฌ ๊ด€์‹ฌ์„ ๊ธฐ์—ฌ๋กœ ์ „ํ™˜ํ•˜์„ธ์š” โ€” ShellKit ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ชฉ์†Œ๋ฆฌ์™€ ํ•จ๊ป˜ ์„ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ณ€๊ฒฝ ๋‚ด์—ญ

์ž์„ธํ•œ ๋‚ด์šฉ์€ CHANGELOG.md ์ฐธ๊ณ .

๐Ÿ“œ ๋ผ์ด์„ ์Šค

MIT ๋ผ์ด์„ ์Šค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๐Ÿค ๊ฐ์‚ฌ์˜ ๋ง

๊ณ ์ „ Unix Shell ์˜ ์ฒ ํ•™์— ์˜๊ฐ์„ ๋ฐ›์•„ ๊ฐœ๋ฐœ.
๋ชจ๋“  ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค๊ณผ ํ„ฐ๋ฏธ๋„ ์• ํ˜ธ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.