我已经在谷歌上搜索了一段时间了,问题不在于我相信我的用户“做正确的事”,并让他们使用 rsync 和各种选项来避免覆盖文件。我实际上需要以某种方式让 scp 不覆盖现有文件...rsync 不是一个选项,因为会有人使用 scp...所以我需要处理这个问题。
我认为可以修改 sshd 代码,因此有一个潜在的途径来解决这个问题。
除此之外,还有其他人破解过这个坚果吗?做了什么?包装纸?
答案1
这是一个简单的 shell 函数(bash
和ksh93
),它环绕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 "$@"
}