parent.sh
とという名前の2つのスクリプトがあるとしますchild.sh
。スクリプトには行がparent.sh
含まれ、スクリプトには。bash child.sh
child.sh
echo "This is the child script"
これで、ユーザーが実行したら、parent.sh
単にchild.sh
スクリプトを呼び出して終了する必要があります。ただし、ユーザーがchild.sh
スクリプトを実行すると、前述のようにいくつかのエラーが発生するはずですonly parent.sh can execute the child.sh script
。
スクリプトを実行するこの動作を達成する方法はありますか?これはほんの一例です。ユーザーは実行できますが、only
スクリプトによって実行する必要があるスクリプトがたくさんありますparent
。
これは、ユーザーが誤って誤ったスクリプトを実行しないようにするためです。私はユーザーの権限を奪いたくありませんread/write
。
私の要件を簡単に言うと:
bash parent.sh -> execute bash child.sh -> execute something by child.sh
答え1
これを達成する1つの方法は次のとおりです。
$ cat parent.sh
#!/bin/sh
echo parent.sh running
./child.sh
$ cat other.sh
#!/bin/sh
echo other.sh running
./child.sh
$ cat child.sh
#!/bin/sh
parent="$(ps -o comm= -p $PPID)"
if [ "$parent" != parent.sh ]; then
echo this script should be directly executed by parent.sh, not by $parent
exit 1
fi
echo "child.sh proceeding"
$ ./parent.sh
parent.sh running
child.sh proceeding
$ ./other.sh
other.sh running
this script should be directly executed by parent.sh, not by other.sh
これは、直系の親プロセスが予想されるプロセスであることを確認します。プロセス階層のより深い可視性が必要な場合は、親関係を上げるようにスクリプトを調整する必要があります。
別のアプローチは、カスタム変数をエクスポートし、子プロセスに設定されていることを確認することです。
プロセス名を偽造したり変数を設定したりする簡単な方法があるため、どちらの方法も実際には安全ではありません。