シェルスクリプトが存在するフォルダ以外の場所でシェルスクリプトが呼び出されるのをブロックする方法


2

ユーザーが現在シェルスクリプトディレクトリでない場合は、シェルスクリプトを停止します。たとえば、私はフォルダにいます ~/ そしてシェルスクリプトを呼び出す ~/shell/script.shシェルスクリプトが出力するはずです You are not allowed to call this shell script from another folder other than its directory。しかし、私がそのフォルダにいるなら ~/shell そして電話 ./script.sh 実行は許可されています。

なぜあなたは何を気にかけますか $PWD は何ですか?問題がある場合は、スクリプト内のディレクトリを変更できます。 cd "$(dirname "$0")"

これは非常にローカルで攻撃的で危険なスクリプトなので、スクリプトを実行しているときは、ユーザーにもっと注意を払ってもらいたいです。


関連する質問

  1. bashスクリプトがシェルまたは他のスクリプト/アプリケーションから呼び出されたかどうかを確認してください。
  2. 実行ファイルは端末から直接呼び出された場合は起動しますが、シェルスクリプトから呼び出された場合は動作しません

3
あなた自身の質問はすでに第2段落でこれに答えます - あなたは比較することができます $PWD
grawity

2段落目からのコメントです この削除された質問
Cyrus


スクリプトを自分のディレクトリに変更するだけでいいのではないでしょうか。それからあなたがどこからそれを呼ぶかは問題ではない: cd "$(dirname "$(realpath "$0")")"
glenn jackman

を確保する必要があるからです $0 フォーム上の現在のファイルfileを含みます ./shell.sh後でシェルスクリプトで説明するように、私は使っています find . 現在のフォルダのファイルを一覧表示するには "$path" != "$0" 私が適用しているこの処理リストから私自身のシェルスクリプトを除外する方法 sed .
user

回答:


1

実行するスクリプトへのフルパスを取得することができます。 realpath 暗黙のカレントディレクトリを解決する man realpath 詳しくは -P オプションは便利です):

mydir=$(dirname $(realpath $0))
[[ $PWD != $mydir ]] && { echo "Not in the right directory!"; exit 1; }
echo "OK, proceed..."

0

@grawityありがとう、私はこれを書きました:

# Call the main function, as when running from the command line the `$0` variable is 
# not empty.
#
# Importing functions from a shell script
# https://stackoverflow.com/questions/12815774/importing-functions-from-a-shell-script
if ! [[ -z "$0" ]]
then
    # Reliable way for a bash script to get the full path to itself?
    # http://stackoverflow.com/questions/4774054/reliable-way-for-a-bash-script-to-get
    pushd `dirname $0` > /dev/null
    SCRIPT_FOLDER_PATH=`pwd`
    popd > /dev/null

    if[[ "$SCRIPT_FOLDER_PATH" == "$(pwd)" || "$SCRIPT_FOLDER_PATH" == "$(dirname "$0")" ]]
    then
        main "$@"
    else
        printf "You cannot run this from the folder: \n'$(pwd)'\n"
        printf "\nPlease, run this script from its folder on: \n'$SCRIPT_FOLDER_PATH'\n"
    fi
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.