私が知る限り、このrequiretty
オプションはPTYでsudoを使用することを許可しません。
私の仮想マシンsudoers
:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
Defaults passwd_tries=3
Defaults badpass_message="WRONG PASSWORD T_T"
Defaults log_input, log_output, iolog_dir="/var/log/sudo"
Defaults requiretty
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d`
SSHを介してシステムに接続すると、tty
プログラムが出力されます/dev/pts/0
。
ただし、SSHセッションではパスワードを使用してsudoを実行できます。このrequiretty
オプションはSSHまたはPTYから独立していますか? SSHセッションでsudoを使用する方法は?
ベストアンサー1
あなたの理解が間違っています。擬似TTYは、「実際の」TTYとまったく同じと見なされます。
tty
印刷されると、/dev/pts/0
セッションに有効なTTYがあることを示します。
ただし、SSHプリファレンスを使用して仮想マシンに接続して実行するコマンドを指定すると、状況が異なります。
$ ssh VM-user@VM-hostname "hostname; tty"
VM-hostname
not a tty
そしてそれsudo
オプションが拒否された場合ですrequiretty
。
TTY の要件により、SSH は、パスワードの要求時に他の多くの Unix プログラムが実行するように、標準入力を介してパスワードプロンプトへの応答をパイプしようとすることを拒否できます。
また、次のことができます。
sudo -u some-user data_producing_command 2> error-log-file | data_consuming_command
パイプされるデータdata_consuming_command
やerror-log-file
。data_consuming_command
some-user
つまり、 set の場合、次のコンテキストでは使用requiretty
できません。sudo
ssh VM-user@VM-host sudo something
TTY 割り当てを強制しないと、失敗した SSH を介したリモートコマンドはssh -tt VM-user@VM-host sudo something
成功します。- crontabコマンドまたはcrontabを介して実行されるスクリプト
at
またはbatch
コマンド - スクリプトは次のように実行されます。
nohup
- ユーザーセッションに関連付けられていない他のデーモンを介して
cgi-bin
実行されるスクリプト
requiretty
パスワードを設定して要求すると、パスワードsudo
がどのように実行されるかは、概念上、次のスクリプトとほぼ同じです。
printf "[sudo] password for $USER: " > /dev/tty # display prompt
TTYSETTINGS=$(stty -F /dev/tty --save) # save current TTY settings
stty -F /dev/tty -echo -echoe # prevent displaying the password
read PASSWORD < /dev/tty
stty -F /dev/tty $TTYSETTINGS # restore TTY settings
# now check if $PASSWORD is correct...
/dev/tty
セッションにTTYがある場合は、常にセッション内の実際のTTYデバイスのエイリアスとして機能する「魔法の」デバイスです。まさにこれをするために存在します。すべてのスクリプトまたはプログラムがパイプまたは他の入力/出力リダイレクトを「エスケープ」できるようにし、必要に応じてユーザーと直接対話できるようにします。
requiretty
設定されていて使用できない場合/dev/tty
(つまり、プロセスに接続されている実際のTTYがない場合)は、パスワード認証の失敗として扱われます。