仮想端末と繋がっていない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