mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-05-04 00:35:58 +00:00
fix: path_append must not clobber login shell PATH
Seeding PATH in the env before bash -l caused /etc/profile to skip its default PATH setup, breaking standard commands. Move path_append to an inline export so the login shell establishes a proper base PATH first. Add regression test: ls still works when path_append is set. Made-with: Cursor
This commit is contained in:
parent
be6063a142
commit
28e0a76b80
@ -96,6 +96,9 @@ class ExecTool(Tool):
|
|||||||
|
|
||||||
env = self._build_env()
|
env = self._build_env()
|
||||||
|
|
||||||
|
if self.path_append:
|
||||||
|
command = f'export PATH="$PATH:{self.path_append}"; {command}'
|
||||||
|
|
||||||
bash = shutil.which("bash") or "/bin/bash"
|
bash = shutil.which("bash") or "/bin/bash"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -164,15 +167,11 @@ class ExecTool(Tool):
|
|||||||
secrets in env vars from leaking to LLM-generated commands.
|
secrets in env vars from leaking to LLM-generated commands.
|
||||||
"""
|
"""
|
||||||
home = os.environ.get("HOME", "/tmp")
|
home = os.environ.get("HOME", "/tmp")
|
||||||
env: dict[str, str] = {
|
return {
|
||||||
"HOME": home,
|
"HOME": home,
|
||||||
"LANG": os.environ.get("LANG", "C.UTF-8"),
|
"LANG": os.environ.get("LANG", "C.UTF-8"),
|
||||||
"TERM": os.environ.get("TERM", "dumb"),
|
"TERM": os.environ.get("TERM", "dumb"),
|
||||||
}
|
}
|
||||||
if self.path_append:
|
|
||||||
# Seed PATH so the login shell can append to it.
|
|
||||||
env["PATH"] = self.path_append
|
|
||||||
return env
|
|
||||||
|
|
||||||
def _guard_command(self, command: str, cwd: str) -> str | None:
|
def _guard_command(self, command: str, cwd: str) -> str | None:
|
||||||
"""Best-effort safety guard for potentially destructive commands."""
|
"""Best-effort safety guard for potentially destructive commands."""
|
||||||
|
|||||||
@ -28,3 +28,11 @@ async def test_exec_path_append():
|
|||||||
tool = ExecTool(path_append="/opt/custom/bin")
|
tool = ExecTool(path_append="/opt/custom/bin")
|
||||||
result = await tool.execute(command="echo $PATH")
|
result = await tool.execute(command="echo $PATH")
|
||||||
assert "/opt/custom/bin" in result
|
assert "/opt/custom/bin" in result
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_exec_path_append_preserves_system_path():
|
||||||
|
"""pathAppend must not clobber standard system paths."""
|
||||||
|
tool = ExecTool(path_append="/opt/custom/bin")
|
||||||
|
result = await tool.execute(command="ls /")
|
||||||
|
assert "Exit code: 0" in result
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user