linux - 当用户想要删除 shell 中的特定文件时给出警告提示

标签 linux bash shell

我必须制作一个基本的 bash 脚本来关注特定的文件,如果我决定删除这个文件,应该会出现一个警告以确认删除。该脚本应该接受一个参数(删除时要检查的文件)我怎样才能做到这一点?我不明白如何检查用户是否真的在脚本运行时尝试删除文件。

任何提示将不胜感激

最佳答案

这是一个非常糟糕的主意。这种机制很容易被有意或无意地规避(运行 >file 而不是 <file 将删除其内容,就像 rm file 一样-- 而且,因为 rm 将保留其他硬链接(hard link),但 >file 将清除与 inode 关联的数据,无论可能有多少链接)。如果这样做会妨碍您保留良好的备份、部署自动快照或利用适当的文件权限,那么弊大于利。

请注意,所讨论的白名单是特定于 shell 的——如果您将一个文件添加到一个 shell 实例的白名单中,则它不一定包含在另一个 shell 实例中。另请注意,该实现是概念验证;它不会捕获标记为保留的文件的父目录的递归删除。

# Put this in your ~/.bashrc

declare -A whitelisted_files

# If our default readlink isn't the GNU one, but we have GNU readlink installed
# as "greadlink", use it.
if command -v greadlink >/dev/null 2>&1; then
  readlink() { greadlink "$@"; }
fi

whitelist_file() {
  local arg
  for arg; do
    whitelisted_files["$(readlink -m -- "$arg")"]=1
  done
}

rm() {
  local arg sigil_seen=0 confirm
  for arg; do
    if (( sigil_seen == 0 )); then
      [[ $arg = -- ]] && { sigil_seen=1; continue; }
      [[ $arg = -* ]] && continue
    fi
    if [[ ${whitelisted_files["$(readlink -m -- "$arg")"]} ]]; then
      read -p "File $arg is whitelisted; really remove?" confirm
      [[ $confirm = [Yy]* ]] || return 1
    fi
  done
  command rm "$@"
}

此后:

touch preserve_me
whitelist_file preserve_me
rm preserve_me

...将提供提示:

File preserve_me is whitelisted; really remove?

关于linux - 当用户想要删除 shell 中的特定文件时给出警告提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49342440/

相关文章:

Bash 在双换行符上拆分文件

php - 用于删除整个目录中起始字符和结束字符之间的所有文本的 Shell 脚本或命令

Ubuntu 中的 JAVA_HOME

linux - 我需要帮助在 Unix 中编写一个简单的脚本

c - 如何编译c代码?

bash - 有没有办法使用 bash 将目录中所有文件的所有制表符更改为空格?

php - 如何使用 Web 文件管理器浏览服务器文件夹

linux - bash -x 或 set -x

linux - "find a command in a path"是什么意思?

arrays - Bash 映射两个数组