目次
エラーの概要
自動化スクリプトやリモート実行環境(例: Ansible、CI/CD ツール、cron)で sudo
を使うと、以下のエラーが出ることがあります。
sudo: no tty present and no askpass program specified
これは、sudo
が パスワード入力を求めたが、TTY(端末)が存在せず、パスワード入力用のプログラム(askpass)が指定されていない ために発生します。
主な原因
/etc/sudoers
でパスワード入力が必要になっている- 実行環境が TTY を持たない自動化環境(cron, CI/CD, バッチ処理など)
SUDO_ASKPASS
が設定されていないため、GUI パスワード入力プログラムを利用できない
解決方法
1. パスワード不要で sudo を実行できるようにする(推奨)
自動化スクリプトでよく使われる方法です。visudo
で /etc/sudoers
を編集し、対象ユーザーに NOPASSWD オプションを付与します。
sudo visudo
以下のように追記:
deploy ALL=(ALL) NOPASSWD:ALL
これで deploy
ユーザーは sudo 実行時にパスワードを要求されなくなります。
2. 特定コマンドだけパスワードなしにする
セキュリティリスクを減らすため、全コマンドではなく特定のコマンドだけ NOPASSWD
を付与する方法もあります。
deploy ALL=(ALL) NOPASSWD:/bin/systemctl restart nginx
これで deploy
ユーザーは systemctl restart nginx
を sudo で実行できるようになります。
3. SSH 経由で強制的に TTY を割り当てる
一時的に解決する方法として、SSH 経由で -t
オプションを付けます。
ssh -t user@server "sudo command"
ただし、自動化スクリプトでの利用には向きません。
4. askpass プログラムを利用する
GUI 環境であれば ssh-askpass
をインストールし、環境変数 SUDO_ASKPASS
を設定することで回避可能です。
例:
export SUDO_ASKPASS=/usr/bin/ssh-askpass
sudo -A command
しかし、サーバ運用では一般的に NOPASSWD を設定する方法 が選ばれます。
まとめ
- エラー原因は「TTY がない環境で sudo がパスワード入力を要求した」こと
- 解決策の基本は
/etc/sudoers
で NOPASSWD を設定すること - セキュリティを考慮し、全コマンドではなく 特定のコマンドだけ許可するのがベストプラクティス
- 一時的には
ssh -t
やSUDO_ASKPASS
も利用可能
よくあるエラーと解決方法まとめ
あわせて読みたい


【完全版】sudoエラー大全|よくある原因と解決方法まとめ
Linux でシステム管理を行う際、sudo コマンドは欠かせない存在です。通常は root 権限を安全に利用するための仕組みですが、環境や設定によってさまざまなエラーが発生…