仮想端末なしでsudoを実行する
仮想端末と繋がっていないsudoの実行は無効化されている
macOSではデフォルトで仮想端末と繋がっていない状態でのsudo
の実行が無効化されている。
$ sudo visudo
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
これはクラッキング目的での侵入者にsudo
を実行されないためにある。
Linuxディストリビューションはデフォルトでこの設定がなくsudo
が実行可能になっている。
SSH経由の場合はオプションを追加する
SSH経由でログインした状態であれば仮想端末があるためsudo
は実行できる。
$ ssh hostname
> sudo uname
Password:
Darwin
ssh
コマンドに直接sudo
コマンドを渡す場合仮想端末が割り当てられないためエラーになる。
$ ssh hostname sudo uname
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
sudo: a password is required
メッセージの通りsudo
に-S
オプションを付けるとパスワードの入力を受け付けるが、入力した文字が画面上に表示される状態になってしまう。
$ ssh hostname sudo -S uname
Password:password
Darwin
ssh
に-t
オプションを付けると強制的に仮想端末が割り当てられる。
$ ssh -t hostname sudo uname
Password:
Darwin
Connection to hostname closed.
特定のユーザーのみ有効にする
設定をコメントアウトすることで全てのユーザーで仮想端末なしのsudo
を許可することができるがリスクが高いため特定のユーザーのみ有効にする。
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
+Defaults:root !requiretty
特定のコマンドのみ有効にする
コマンド別に有効にすることもできる。
Defaults requiretty
+Defaults!/path/to/command !requiretty