web-dev-qa-db-ja.com

パスワードなしでSudoを実行できるのに、Sudoを実行するためにttyが必要なのはなぜですか?

パスワードなしで実行するようにSudoを構成しましたが、ssh 'Sudo Foo'、まだエラーメッセージが表示されますSudo: sorry, you must have a tty to run Sudo

なぜこれが発生し、どうすれば回避できますか?

229
merlin2011

デフォルトでは、SudoはTTYを要求するように構成されています。つまり、Sudoはログインシェルから実行する必要があります。 SSH呼び出しに-tスイッチを追加することで、この要件を無効にすることができます。

ssh -t someserver Sudo somecommand

-tは、疑似ttyの割り当てを強制します。

これをグローバルに実行する場合は、/etc/sudoersを変更して!requirettyを指定します。これは、ユーザーごと、グループごと、または包括的なレベルで実行できます。

30
JRFerguson

使用 -tフラグをsshに設定すると、tty割り当てが強制されます。

$ ssh luci tty
not a tty
$ ssh luci -t tty
/dev/ttys003
$
18
Kyle Jones

私はDockerとCentos 7を使用してこの問題に遭遇しました。

yum install -y Sudo

sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers

https://hub.docker.com/r/liubin/fluentd-agent/~/dockerfile でこのハックを見つけました

11
Martin Tapp

興味深い代替手段は、FreeIPAまたはIdMを実行してユーザーとsudoerルールを一元管理することです。その後、Sudoルールを作成してオプションを割り当てることができます

!必須

ルールで。その後、コマンドは期待どおりに実行されます。また、単一の構成セットからすべてのサーバーとユーザーを管理できるという利点もあります。

1
strtluge

同じ問題がありました。私の場合、解決策は2行でした

myscript=$(cat ssh_test.sh)
ssh -t user@Host "$myscript"

説明:

  • 実行するコマンド(Sudoコマンドを含む)をスクリプトに配置します。 「ssh_test.sh」。

  • スクリプト全体を「myscript」という変数に読み込みます。

  • -tを1つだけ使用してsshを呼び出し、コマンドの代わりに変数を指定します。

これ以前は、stdinからの読み取りとヒアドキュメントの使用の組み合わせを使用して問題が発生しました

0
Gerry Hickman