sudo: no tty present and no askpass program specified の対処法

  • URLをコピーしました!
目次

エラーの概要

自動化スクリプトやリモート実行環境(例: 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/sudoersNOPASSWD を設定すること
  • セキュリティを考慮し、全コマンドではなく 特定のコマンドだけ許可するのがベストプラクティス
  • 一時的には ssh -tSUDO_ASKPASS も利用可能
よくあるエラーと解決方法まとめ
目次