为 find -execdir 清理 $PATH

Sanitize $PATH for find -execdir

find -execdir-exec 更推荐,手册中说后者存在不可避免的安全问题,并在 bugs 部分中列出。

man find-execdir:

If you use this option, you must ensure that your $PATH environment variable does not reference .; otherwise, an attacker can run any commands they like by leaving an appropriately- named file in a directory in which you will run -execdir. The same applies to having entries in $PATH which are empty or which are not absolute directory names.

bash 脚本中,如何遵守手册的 "must" 并从 $PATH 中删除所有相关或空元素?

您可以使用以下 bash 功能清理 PATH

sanitize_PATH()
{
    local new_path=""
    local dir
    while read -r -d: dir
    do
        if [[ $dir == /* ]]
        then
            new_path="$new_path:$dir"
        else
            echo "dropping from PATH: '$dir'"
        fi
    done <<< "$PATH:"
    PATH="${new_path#:}"
    echo PATH="$PATH"
}

测试:

$ PATH=/usr/local/bin:/usr/bin:/bin       sanitize_PATH
PATH=/usr/local/bin:/usr/bin:/bin

$ PATH=:/usr/local/bin:/usr/bin:/bin      sanitize_PATH
dropping from PATH: ''
PATH=/usr/local/bin:/usr/bin:/bin

$ PATH=/usr/local/bin:/usr/bin:/bin:      sanitize_PATH
dropping from PATH: ''
PATH=/usr/local/bin:/usr/bin:/bin

$ PATH=/usr/local/bin:/usr/bin:/bin:      sanitize_PATH
dropping from PATH: ''
PATH=/usr/local/bin:/usr/bin:/bin

$ PATH=.:bin:/usr/local/bin:/usr/bin:/bin sanitize_PATH
dropping from PATH: '.'
dropping from PATH: 'bin'
PATH=/usr/local/bin:/usr/bin:/bin

$ PATH=/usr/local/bin::/usr/bin:/bin      sanitize_PATH
dropping from PATH: ''
PATH=/usr/local/bin:/usr/bin:/bin