sudo
パスワードなしで実行するように設定しましたが、これを試みてもssh 'sudo Foo'
エラーメッセージが表示されますsudo: sorry, you must have a tty to run sudo
。
なぜこれが起こるのですか?どうすれば解決できますか?
ベストアンサー1
/etc/sudoers
ファイル(または埋め込みファイル)に次のものが含まれている可能性があります。
Defaults requiretty
... sudo
TTYが必要です。私たちが知っているように、Red Hatシステム(RHEL、Fedora ...)sudoers
には基本ファイルにTTYが必要です。これは実質的なセキュリティ上の利点を提供せず、安全に排除することができます。
Red Hatはこの問題を認めました。そして今後のバージョンでは削除される予定です。
サーバー構成を変更できない場合は、この誤った構成の回避策として、または-t
オプション-tt
を使用してssh
リモート側で疑似端末を作成できますが、いくつかの副作用があることに注意してください。
-tt
対話型で使用するためのものです。raw
リモート端末と対話するためにローカル端末をモードに設定します。これは、ssh
I / Oがターミナルから入るかターミナルに行かないと、副作用が発生することを意味します。たとえば、すべての入力はエコーされ、特殊な終端子(^?
、、、 )は出力時に特殊な処理を^C
引き起こし^U
、sはsLF
に変換されます。CRLF
この回答このバイナリが変更されたのはなぜですか?詳細については。
影響を最小限に抑えるには、次のように呼び出すことができます。
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
これにより、< <(cat)
ローカル端末がモードに設定されるのを防ぐことができます(存在する場合)raw
。これが発生するまで、入力用のコンテンツを使用してstty raw -echo
リモート端末の回線規則を設定します-tt
。
リモートコマンドの出力は端末に送信されるため、バッファリング(多くのアプリケーションでは回線ベース)と帯域幅効率がオンになっているTCP_NODELAY
ため、依然として影響します。また、IPQoSをに相対的に設定-tt
してください。次の方法で両方の問題を解決できます。ssh
lowdelay
throughput
ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)
また、これはリモートコマンドがstdinでファイルの終わりを検出できず、リモートコマンドのstdoutとstderrが単一のストリームにマージされることを意味します。
したがって、これは最終的にあまり良い解決策ではありません。
リモートホストから擬似端末を作成する方法がある場合(たとえばexpect
、、、、...zsh
を使用)、それを使用して接続する疑似端末を作成することをお勧めします(I / O用ではありません)。使用しないでください。socat
perl
IO::Pty
sudo
ssh
-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に似ていると仮定します)。