防止 scp 覆盖现有文件?

防止 scp 覆盖现有文件?

我已经在谷歌上搜索了一段时间了,问题不在于我相信我的用户“做正确的事”,并让他们使用 rsync 和各种选项来避免覆盖文件。我实际上需要以某种方式让 scp 不覆盖现有文件...rsync 不是一个选项,因为会有人使用 scp...所以我需要处理这个问题。

我认为可以修改 sshd 代码,因此有一个潜在的途径来解决这个问题。

除此之外,还有其他人破解过这个坚果吗?做了什么?包装纸?

答案1

这是一个简单的 shell 函数(bashksh93),它环绕scp.scp如果系统上存在目标文件,它将拒绝执行真实文件。

function scp
{
    typeset argv="$@"
    typeset target="${argv[-1]}"

    if [[ -e "$target" ]]; then
        echo 'Target file exists, refusing to overwrite' >&2
        return 1
    fi

    command scp "$@"
}

该函数从最后一个命令行参数中挑选出目标,然后检查它是否对应于现有的文件名。如果是,它将拒绝运行scp,显示诊断消息,并返回非零退出状态。

如果没有与目标相对应的现有文件名,它将继续并scp使用原始命令行调用实际文件名。

没有尝试区分一个方向的传输或另一个方向的传输。因此,如果user@hostname:file当前目录中存在与 -type 格式对应的文件名,它将失败。

如果文件中有受保护文件名列表(这应该是绝对路径名列表,每行一个,对应于 GNU coreutils 实用程序返回的每个文件的真实路径realpath):

function scp
{
    typeset argv="$@"
    typeset target="${argv[-1]}"

    if grep -q -F -x "$( realpath "$target" )" protected_files.txt; then
        echo 'Target filename is protected, refusing to overwrite' >&2
        return 1
    fi

    command scp "$@"
}

相关内容