web-dev-qa-db-ja.com

sudo:ttyが存在せず、askpassプログラムが指定されていません

リモートボックスでSudoを使用してリモートバイナリを実行しようとする場合:

ssh remotehost "Sudo ./binary"

このエラーが表示されます:

Sudo:ttyが存在せず、askpassプログラムが指定されていません

これを回避するにはどうすればよいですか?

EDITこれは間違いなく、そのように提案された質問の複製ではありません。そこの答えは完全に無関係です。実際、sudoersファイルに対するこれらの変更はすでにリモートホストに適用されています。

66
Drew Noakes

簡単な方法は、-tを指定することです:

ssh -t remotehost "Sudo ./binary"

Manページから:

擬似tty割り当てを強制します。これは、リモートマシン上で任意の画面ベースのプログラムを実行するために使用できます。メニューサービスを実装する場合。複数の-tオプションは、sshにローカルttyがない場合でも、ttyの割り当てを強制します。

これがなぜ機能するのかを正確に説明することはできません。より良い方法があるかもしれません。もしそうなら私はそれについて聞きたいです:)

@psusiは、以下のコメントでこれが機能する理由を説明しています。

73
Drew Noakes

質問:

これを回避するにはどうすればよいですか?

Sudo: no tty present and no askpass program specified

別の回答

別の方法として、試してください:

Sudo -S ./binary

これにより、標準入力stdinからパスワードを読み取るようにSudoに指示します。

これが役立つシナリオ

Chroot環境では、これらの他の回答が正しく機能しない可能性があります...おそらく:

  1. / etc/shadowと/ etc/passwdの競合により、ユーザーはパスワードを入力できません。
  2. Chrootされた環境では、tty1へのアクセスは少しグリッチになり、ctrl-alt f2-tty2へのアクセスは実行できません。これは、chrootされていない環境のttyであるためです。

例:chroot環境を使用してLinuxまたはブートローダーを手動でインストール/修復する、(ArchlinuxやArch-chrootなど)。

24
elika kohen

パスワードを読み取る端末/アプリケーションを定義する必要があります。 2つのバリアントがあります。

  1. export Sudo_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers(デフォルトはvisiblepw)
5
user282246

Sudoがrootパスワードを要求しようとしており、疑似ttyが割り当てられていないため、失敗します。

ルートとしてログインするか、/etc/sudoers(またはSudo visudo)で次のルールを設定する必要があります。

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

次に、ユーザーがadminグループ(またはwheel)に属していることを確認します。

2
kenorb

私の場合、sudoersでrootとして使用したいコマンドを指定していなかったため、このエラーを受け取りました。

何かのようなもの

/etc/sudoers.d/myuser

myuser ALL=(root) NOPASSWD: \
    /bin/ls -la

私のために働いた

2
GarouDan

また、/ etc/sudoers.dに「Sudo_shutdown」などのファイルを作成して、コンテンツを含めることもできます。

# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

これにより、admグループ内のユーザーはパスワードなしでシャットダウンできます。

1
Peter