【问题标题】:BASH - Safe check before running "rm -fr $FOLDER"BASH - 运行“rm -fr $FOLDER”之前的安全检查
【发布时间】:2017-02-09 03:27:47
【问题描述】:

我有一个脚本,它确实需要一个特定文件夹上的 rm -fr

我想让它尽可能安全。我在下面开始了这个脚本,但我想知道是否还有什么我错过的。

folder=""

if [[ ! -d "$folder" ]]; then
  echo "Error: is not a folder"
elif [[ "$folder" == "/" ]]; then
  echo "Error: folder points to root"
elif [[ "$folder" == "../"* ]]; then
  echo "Error: folder start with ../"
elif [[ "$folder" == *"/.."* ]]; then
  echo "Error: folder contains /.."
elif [[ "$folder" == *"/*"* ]]; then
  echo "Error: folder ends with /*"
else
  rm -fr "$folder"
fi

更新:添加了对“/”的检查

【问题讨论】:

  • 也可以检查/
  • 感谢我更新了代码!
  • 是否所有文件夹都位于给定用户下..eg ~/home/jsmith ?
  • 在我拥有的脚本中,该文件夹应位于 /tmp 而不是用户的主文件夹中。但是,如果您有任何要添加的内容涵盖所有情况,请随时分享。
  • 嗯,你可以有一个可重用的“黑名单”机制,再加上一个逐案白名单检查。只需检查它们的路径是否位于特定目录中,这是一个非常简单的白名单方法的良好起点。您的可重用脚本/函数可以接受一个参数来进行检查,只需要调用者提供一个目录名称。

标签: bash rm


【解决方案1】:

如果您想尽可能安全,您也许可以...

确保首先完成任何 globbing :

shopt -s nullglob
declare -a folders=(folder_or_glob)

遍历数组的每个元素,一次一个,并在规范路径上操作。

for f in "${folders[@]-}"
do
  [[ $f ]] || continue
  candidate="$(realpath -e -s "$f")" || continue
  ok_to_delete "$candidate" || continue
  rm -rf "$candidate"
done

使用函数ok_to_delete进行测试:

ok_to_delete()
{
  [[ -d $1 ]] || continue     # Is directory
  [[ $1 != / ]] || continue   # Not root
  [[ "${1%/*}" ]] || continue # At least two levels deep
  (... add any test you want ...)
}

这里有一点冗余(例如不是 root + 2 级深度),但这只是为了给你一些想法。

【讨论】:

    【解决方案2】:

    我不想检查文件夹的路径名,而是检查该文件夹中的内容、文件的大小/用户/时间戳/密钥/扩展名等,或者您最关心的任何内容。这对你来说更安全,这只是我的两分钱。

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多