์ฝ˜ํ…์ธ ๋กœ ์ด๋™

ADK์šฉ Bash ๋„๊ตฌ

ADK์—์„œ ์ง€์›Python v1.27.0

ExecuteBashTool์„ ์‚ฌ์šฉํ•˜๋ฉด ADK ์—์ด์ „ํŠธ๊ฐ€ ๋กœ์ปฌ ์ž‘์—… ๊ณต๊ฐ„ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ Bash ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—…, ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ๋˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ํ™˜๊ฒฝ๊ณผ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” Python ADK์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜

Bash ๋„๊ตฌ๋Š” ํ•ต์‹ฌ ์—์ด์ „ํŠธ ๊ฐœ๋ฐœ ํ‚คํŠธ(ADK)์— ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ํ†ตํ•ฉ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด ๋ฉ”์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

pip install google-adk

์—์ด์ „ํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

POSIX ์ „์šฉ

ExecuteBashTool์€ ํ˜„์žฌ Linux ๋˜๋Š” macOS์™€ ๊ฐ™์€ POSIX ์‹œ์Šคํ…œ์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. Windows ์‹œ์Šคํ…œ์—์„œ ์ด ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Bash ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ExecuteBashTool์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์—์ด์ „ํŠธ์˜ tools ๋ชฉ๋ก์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— my_workspace_path๊ฐ€ ์œ ํšจํ•œ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ ๋ฌธ์ž์—ด๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

from google.adk.tools.bash_tool import ExecuteBashTool, BashToolPolicy

policy = BashToolPolicy(
    allowed_command_prefixes=("ls", "cat", "grep"),
    timeout_seconds=30,
    max_memory_bytes=1024 * 1024 * 512,   # 512MB
    max_file_size_bytes=1024 * 1024 * 10, # 10MB
    max_child_processes=5
)

tool = ExecuteBashTool(workspace=my_workspace_path, policy=policy)

๋ณด์•ˆ ๋ฐ ์‹คํ–‰ ๋ณดํ˜ธ ์กฐ์น˜

์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์ธ ์œ„ํ—˜์„ ๋™๋ฐ˜ํ•˜๋ฏ€๋กœ, ExecuteBashTool์—๋Š” ์ƒ์„ฑ๋œ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ์ ์šฉ๋˜๋Š” ์—ฌ๋Ÿฌ ํ•„์ˆ˜ ๋ฐ ์„ ํƒ์  ๋ณด์•ˆ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ •์ฑ…์€ ๋ชจ๋“  ๋ช…๋ น ํ—ˆ์šฉ

๊ธฐ๋ณธ์ ์œผ๋กœ BashToolPolicy๋Š” allowed_command_prefixes=("*",)๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ช…๋ น์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ์ •์ฑ…์„ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ํ—ˆ์šฉ๋˜๋Š” ๋ช…๋ น์„ ๋ช…์‹œ์ ์œผ๋กœ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# ๋ณด์•ˆ ๊ตฌํ˜„ ์˜ˆ์‹œ
from google.adk.tools.bash_tool import BashToolPolicy

strict_policy = BashToolPolicy(
    allowed_command_prefixes=("ls ", "cat ", "pwd")
)

๋‚ด์žฅ ๋ณดํ˜ธ ๊ธฐ๋Šฅ

  1. ์‚ฌ์šฉ์ž ํ™•์ธ: ๋„๊ตฌ๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•ญ์ƒ ์‚ฌ์šฉ์ž ํ™•์ธ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  adk_request_confirmation ํ๋ฆ„์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ช…๋ น์„ ์Šน์ธํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ช…๋ น ๊ฒ€์ฆ: allowed_command_prefixes๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ช…๋ น์„ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•˜๊ณ  blocked_operators๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฌธ์ž์—ด ํŒจํ„ด์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ธˆ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ๋ฆฌ์†Œ์Šค ์ œํ•œ: ํฌํฌ ๋ด„(fork bomb)์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ๊ฐˆ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด OS ์ˆ˜์ค€์˜ ์ œํ•œ์ธ setrlimit์ด ์ ์šฉ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„, ํŒŒ์ผ ํฌ๊ธฐ ๋ฐ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.
  4. ์ฝ”์–ด ๋คํ”„ ๋น„ํ™œ์„ฑํ™”: ๋ฏผ๊ฐํ•œ ๋ฉ”๋ชจ๋ฆฌ ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ์ฝ”์–ด ๋คํ”„๊ฐ€ ์—„๊ฒฉํ•˜๊ฒŒ ๋น„ํ™œ์„ฑํ™”(RLIMIT_CORE๊ฐ€ 0์œผ๋กœ ์„ค์ •)๋ฉ๋‹ˆ๋‹ค.
  5. ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ์ข…๋ฃŒ: ๋ช…๋ น์ด timeout_seconds๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๋„๊ตฌ๋Š” ์ „์ฒด ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน์— SIGKILL์„ ๋ฐœ์†กํ•˜์—ฌ ๊ณ ์•„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚จ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ

๋„๊ตฌ ์ด๋ฆ„ ํด๋ž˜์Šค ์ด๋ฆ„ ์„ค๋ช…
execute_bash ExecuteBashTool ์ž‘์—… ๊ณต๊ฐ„ ๋‚ด์—์„œ Bash ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. POSIX ์ „์šฉ