UbuntuでClaude Codeがsudoを使えるように設定する('a terminal is required' の解決)
Claude Code CLI が apt や systemctl のような root コマンドを実行しようとして出る 'sudo: a terminal is required' エラーを、NOPASSWD なしで timestamp_timeout + !tty_tickets を使って安全に解決する。
Claude Code CLI で apt install・systemctl のような root コマンドを実行すると sudo: a terminal is required to read the password エラーが出る。NOPASSWD なしで安全に解決する設定。
TL;DR
# /etc/sudoers (sudo visudo) — Defaults 섹션에 추가
Defaults timestamp_timeout=60 # 비밀번호 입력 후 60분 캐시
Defaults !tty_tickets # 모든 tty에서 credential 공유 (이게 핵심)
# 실행: 먼저 credential 캐시 후 Claude Code 기동
sudo -v && claude --dangerously-skip-permissionsClaude Code で sudo whoami → root が出れば成功。60分経過したら sudo -v で更新する。
なぜこの方式か
Claude Code の bash セッションは interactive terminal ではないので、パスワードを入力できない — これが sudo をブロックする原因だ。
一番簡単な回避策は yohan ALL=(ALL) NOPASSWD: ALL だが、使ってはいけない。 アカウントが奪取されると、攻撃者が即座に root を得る(この設定でサーバーが乗っ取られた事例は多い)。代わりにパスワード認証は維持し、credential キャッシュ で利便性だけを確保する。
核心は !tty_tickets だ。デフォルトでは credential が tty ごとに分離されるので、ターミナルで sudo -v をしても Claude Code の bash セッションには適用されない。!tty_tickets で tty 間の共有をオンにすると、ターミナルでキャッシュした credential を Claude Code が引き継げる。
セキュリティ比較
| 方式 | 攻撃者に侵入されたら | 時間制限 |
|---|---|---|
NOPASSWD: ALL | 即座に root を奪取 | なし (永久) |
timestamp_timeout + !tty_tickets | パスワードが必要 | 60分後に満了 |
キャッシュされた60分以内に侵入されると危険なのは確かだ。しかし「ドアを常に開けておくこと」と「少し開けて閉じること」の違いだ。より保守的にするなら timestamp_timeout=15 に減らす。
学んだこと
sudo: a terminal is requiredの原因は sudo の設定ではなく 非対話シェル だ — credential を先にキャッシュすることで解決する。!tty_ticketsが本当のスイッチだ。これがないとsudo -vをしても Claude Code セッションには効かない。- 利便性(NOPASSWD)とセキュリティは二者択一ではない。キャッシュ + 満了で両方とれる。