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

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

sudoパスワードなしで実行するように設定しましたが、これを試みてもssh 'sudo Foo'エラーメッセージが表示されますsudo: sorry, you must have a tty to run sudo

なぜこれが起こるのですか?どうすれば解決できますか?

ベストアンサー1

/etc/sudoersファイル(または埋め込みファイル)に次のものが含まれている可能性があります。

Defaults requiretty

... sudoTTYが必要です。私たちが知っているように、Red Hatシステム(RHEL、Fedora ...)sudoersには基本ファイルにTTYが必要です。これは実質的なセキュリティ上の利点を提供せず、安全に排除することができます。

Red Hatはこの問題を認めました。そして今後のバージョンでは削除される予定です。

サーバー構成を変更できない場合は、この誤った構成の回避策として、または-tオプション-ttを使用してsshリモート側で疑似端末を作成できますが、いくつかの副作用があることに注意してください。

-tt対話型で使用するためのものです。rawリモート端末と対話するためにローカル端末をモードに設定します。これは、sshI / Oがターミナルから入るかターミナルに行かないと、副作用が発生することを意味します。たとえば、すべての入力はエコーされ、特殊な終端子(^?、、、 )は出力時に特殊な処理を^C引き起こし^U、sはsLFに変換されます。CRLFこの回答このバイナリが変更されたのはなぜですか?詳細については。

影響を最小限に抑えるには、次のように呼び出すことができます。

ssh -tt host 'stty raw -echo; sudo ...' < <(cat)

これにより、< <(cat)ローカル端末がモードに設定されるのを防ぐことができます(存在する場合)raw。これが発生するまで、入力用のコンテンツを使用してstty raw -echoリモート端末の回線規則を設定します-tt

リモートコマンドの出力は端末に送信されるため、バッファリング(多くのアプリケーションでは回線ベース)と帯域幅効率がオンになっているTCP_NODELAYため、依然として影響します。また、IPQoSをに相対的に設定-ttしてください。次の方法で両方の問題を解決できます。sshlowdelaythroughput

ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)

また、これはリモートコマンドがstdinでファイルの終わりを検出できず、リモートコマンドのstdoutとstderrが単一のストリームにマージされることを意味します。

したがって、これは最終的にあまり良い解決策ではありません。

リモートホストから擬似端末を作成する方法がある場合(たとえばexpect、、、、...zshを使用)、それを使用して接続する疑似端末を作成することをお勧めします(I / O用ではありません)。使用しないでください。socatperlIO::Ptysudossh-t

たとえば、次のようにしますexpect

ssh host 'expect -c "spawn -noecho sh -c {
     exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
 exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'

または以下を使用してくださいscript(実装がから来たと仮定しますutil-linux)。

ssh host 'SHELL=/bin/sh script -qec "
              sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
            " /dev/null 3<&0 4>&1 5>&2'

(どちらもリモートユーザーのログインシェルがBourneに似ていると仮定します)。

おすすめ記事