はじめに
スクリプトを実行する前に権限をchmodコマンドで変更したりすると思いますが、
rootユーザやsudoで実行権限のないファイルを実行することができない理由について
疑問に思ったこと、勘違いしていたことをまとめます。
実行するシェルスクリプトについて
下記の簡単なシェルスクリプトを用意しました。
[tom@ubuntu:~/Qiita/sh] $ ls -l test.sh
-rw-r--r-- 1 tom tom 56 9月 16 12:50 test.sh
[tom@ubuntu:~/Qiita/sh] $ cat test.sh
#!/bin/bash
echo "Hello!"
echo "My name is $(whoami)"
スクリプトを実行してみる
現在実行権限がないため、そのまま実行しようとすると下記のようになります。
tom@ubuntu:~/Qiita/sh$ ./test.sh
bash: ./test.sh: 許可がありません
また現在実行権限は誰にも与えられていないため、
sudoでの実行やrootユーザでも実行することはできません。
tom@ubuntu:~/Qiita/sh$ sudo ./test.sh
sudo: ./test.sh: コマンドが見つかりません
tom@ubuntu:~/Qiita/sh$ sudo su
root@ubuntu:/home/tom/Qiita/sh#
root@ubuntu:/home/tom/Qiita/sh# ./test.sh
bash: ./test.sh:許可がありません
rootユーザで実行できない理由
ファイルの実行時にはLinuxカーネルがパーミッションの確認を行うため、
rootであっても無視できないルールが適用されているようです。
これは実行権限のないファイルを実行することにより、
セキュリティリスクを高める可能性があることやシステム全体に不安定な動作を引き起こす可能性があるためです。
そのため、実行権限がないファイルについてはrootであっても実行することはできません。
sudoで実行できない理由
sudoコマンドはプロセスの実行ユーザをrootに変更するものです。
上記の通りカーネルが実行権限を確認するため、
実行権限のないファイルはsudoを使っても実行することはできません。
エラーメッセージが異なる理由
先ほどのエラーメッセージですが、
sudoでの実行とrootでの実行でエラーメッセージが異なっています。
tom@ubuntu:~/Qiita/sh$ sudo ./test.sh
sudo: ./test.sh: コマンドが見つかりません
tom@ubuntu:~/Qiita/sh$ sudo su
root@ubuntu:/home/tom/Qiita/sh#
root@ubuntu:/home/tom/Qiita/sh# ./test.sh
bash: ./test.sh:許可がありません
これはsudoが『コマンドを実行する』ためのツールだからです。
実行権限のないファイルは『コマンドとして扱う』ことができないため、
sudoは実行権限のないファイルを『コマンドとして存在しない』と認識し、
『コマンドが見つかりません』と表示します。
それに対し、rootはそのままの理由で『許可がありません』と表示します。
まとめ
パーミッションはカーネルで制御されているため、
たとえrootであっても実行権限のないファイルを直接実行することはできません。
実行する場合はシェルを通しての実行したり
chmodコマンドで実行権限を与えることで実行できるようになります。
あまり気にすることではありませんが気になったので調べてみたお話でした。
以上です。
最後までお読みいただきありがとうございました。