0

シェルスクリプトに要件があります。この位置情報はテキスト ファイルから取得します。常に有効です。

/opt/sasuapps/senny/publish/gbl/SANDHYA/drop1

ディレクトリが空かどうかを確認する必要があります。ディレクトリが空でない場合は、その場所にあるファイルとディレクトリを削除する必要があります。

セキュリティチェックの一環として、ファイルから取得したドロップ先(/opt/sasuapps/senny/publish/gbl/SANDHYA/drop1)が以下のいずれかで始まっているか確認したいと思います。

/mnt/senny_publish/gbl
/mnt/senny/publish/gbl
/opt/sasuapps/senny/publish/gbl

はいの場合は、先に進んで削除してください。他には何もしないでください。

指定された場所をこれらの固定文字列と比較するにはどうすればよいですか?

4

4 に答える 4

3

これは、bash およびその他の Posix スタイルのシェルで動作します。つまり、/bin/sh が bash でないシステムでは問題ありません。

check () {
  [ "x$1" = x ] && return 1
  for pf in /mnt/senny_publish/gbl              \
            /mnt/senny/publish/gbl              \
            /opt/sasuapps/senny/publish/gbl; do
      suf="${1#$pf}"
      [ x"$pf$suf" = x"$1" ] && return 0
  done
  return 1
}

testcheck () {
  echo -n "$1" :
  if check "$1"; then
      echo OK
  else
      echo BAD
  fi
}

testcheck /how/now
testcheck /not/this
testcheck /mnt/senny_publish/gbl
testcheck /mnt/senny/publish/gbl
testcheck /opt/sasuapps/senny/publish/gbl
testcheck /mnt/senny_publish/gbl/a/b
testcheck /mnt/senny/publish/gbl/a/b
testcheck /opt/sasuapps/senny/publish/gbl/a/b

そう...

/how/now :BAD
/not/this :BAD
/mnt/senny_publish/gbl :OK
/mnt/senny/publish/gbl :OK
/opt/sasuapps/senny/publish/gbl :OK
/mnt/senny_publish/gbl/a/b :OK
/mnt/senny/publish/gbl/a/b :OK
/opt/sasuapps/senny/publish/gbl/a/b :OK

およびその他の外部プログラムを回避することによりgrep、fork および exec を回避して完全にシェル内で実行を維持し、XSS 攻撃に対する追加の保護も提供します。それでも、メタ文字を早い段階でフィルタリングすることをお勧めします。

于 2009-11-10T04:47:03.580 に答える
2

シェル スクリプトに bash を使用しているとします。

if [ -n "$(echo $LOCATION|grep -lE '/mnt/senny_publish/gbl|/mnt/senny/publish/gbl|/opt/sasuapps/senny/publish/gbl')" ]
then
    # Contains one of these paths
else
    # Does not contain one of these paths
fi

調べるパスのリストが長い場合は、それらを一時ファイルに 1 行に 1 つずつダンプして使用できます。grep -lEf tempFileWithPaths.txt

于 2009-11-10T04:24:33.907 に答える
2

を使用するcaseと、よりクリーンになります。

case $d in
/mnt/foo/gbl/*|/mnt/bar/publish/gbl/*|/opt/sasu/bar/publish/gbl/*)
    rm -fr "$d"
esac

..日常使いに。これは POSIX 準拠で高速です。

関数にしたい場合は、次のようにします。

# prefixed_by "$locn" "$safe_pfx" '/dir/list'
prefixed_by() {
    [ -n "$1" ] || return
    local i f=$1; shift
    for i; do
        i=${i%/}
        case $f in
        "$i/"*) return 0
        esac
    done
    return 1
}

したがって、リストにスペースやワイルドカード文字が含まれていないことがわかっている場合 (つまり、文字列リテラルを使用してスクリプトで直接設定されている場合)、次のようにすることができます。

readonly safe_list='/mnt/foo/gbl /mnt/bar/publish/gbl /opt/sasu/bar/publish/gbl'

..初期化中、およびその後:

prefixed_by "$d" $safe_list && rm -fr "$d"

POSIX で指定されていない関数で使用localしましたが、ほとんどの最新のシェルにはあります。残りはすべて POSIX に準拠しているため、状況に合わせて変更できます。

caseBASH では、forループで使用する必要はありません[[。つまり、どのパターン マッチを使用するだけでかまいません。

[[ $f = "$i"/* ]] && return

また、単語の分割もファイル名の展開も実行しません。ただし、または"$i"のようなワイルドカード文字がワイルドカードとして使用されないようにするために、を引用符で囲む必要あります。*?

于 2012-06-25T07:22:03.247 に答える
0

sedコマンドを使用する

于 2009-11-10T04:41:02.877 に答える