sudoコマンドに関する追加メモ
(2019/4/6)この記事の内容は古いため、「一般ユーザで管理者権限を使うsudoコマンドの設定と使い方, 環境変数」を参照。
複数のコマンド行を1回のsudoで実行したい場合
複数のコマンド行を1回のsudoで実行するには
- 複数のコマンド行を実行する記述をシェルへの(-c)オプションとしてsudoからシェルを実行
- 実行する内容をシェルスクリプトに記述したものをsudoで実行
などの方法がある。
「シェルを実行」するというのは
$ sudo sh -c '[コマンド行1...]; [コマンド2...]; [以下同様に続く]'
などのようにする(使用シェルは任意)のだが、特に複数のユーザで用いている場合にはシェルのsudoからの実行を許可することがふさわしくない場合もあり、/etc/sudoers(visudoコマンドで編集)の「[ユーザ/%グループ] [ホスト]=([動作権限]) [実行ファイルの場所...]」の行で、シェルの実行を許可しないポリシーで運用される場合もあるかもしれない。そうした場合には別の方法を用いる。
「実行する内容をシェルスクリプトに記述したものをsudoで実行」というのは、例えば
#! /bin/sh /path/to/command1 -opt1 /path/to/command2 /path/to/command3 -opt1 -opt2
のように一連の処理をシェルスクリプトにまとめたものをsudoで実行することになるのだが、管理者はこのスクリプトをsudoで実行できるように設定する必要があり、かつこのスクリプトは一般ユーザが書き込めないようにしないと中身を書き換えて色々なことができてしまう。また、スクリプト内で変数PATHを設定しておかないと
#! /bin/sh PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin command1 -opt1 command2 command3 -opt1 -opt2
コマンドと同名の実行ファイルやスクリプトを用意してその実行時にPATHを設定することでその(任意の)ファイルが動かせることになる。
決まった流れの処理の中で管理者権限が必要なときなどは上のように管理者のみが書き込めるスクリプトを作ってそれをsudoで実行できるようにするとsudoの実行記録(ファイル/var/log/sudo.log)もまとまって見やすくなるが、ユーザに実行を許可するコマンドが厳密に管理されている場合はどちらもできないので
#! /bin/sh sudo /path/to/command1 -opt1 sudo /path/to/command2 sudo /path/to/command3 -opt1 -opt2
のように複数のコマンド行を複数回のsudoで実行するシェルスクリプトを作成して自分の権限で実行というぐらいしかできない。
そもそも「複数のコマンド行を1回のsudoで実行」というのがセキュリティ的に推奨できないということなのかもしれない。
管理者権限で標準出力をファイルに書き出す
コマンドの出力を「>」でファイルに書き出す操作を管理者権限で行う場合にはシェルが役に立つ。
$ sudo sh -c 'echo test > test.txt'
しかし、これもシェルの実行が許可されていなければできない。
別のteeコマンドが許可されていれば
$ echo test | sudo tee test.txt > /dev/null
のようにファイルに書き出すことはできるが、どちらも任意の場所にファイルを書き出せるものなので、注意して使う必要がある。
root以外のユーザとしてコマンドを実行
sudoは、既定ではroot(管理者)ユーザとしてコマンドを実行するが、-uオプションを付けて任意のユーザとしてコマンドを実行することができる。
$ sudo -u [ユーザ名] [コマンド行]
visudoでのアクセス許可の設定としては「一般ユーザuserが別のユーザfooの権限で/path/to/command1と/path/to/command2を実行できるようにする」ものとすると
user ALL=(foo) /path/to/command1,/path/to/command2
となり、パスワード入力の省略の許可を追加すると(上の代わりに)
user ALL=(foo) NOPASSWD: /path/to/command1,/path/to/command2
のようになる。
関連記事: