lftp:如何递归设置权限;首先是按目录而不是按文件

时间:2012-12-13 12:23:34

标签: ftp file-permissions shared-hosting batch-processing lftp

在不暴露SSH访问的共享主机上保护Drupal或WordPress安装时(糟糕的情况,fwiw)lftp似乎是批量设置目录和文件权限的正确方法。 find命令声称你可以重定向它的输出,所以一个应该能够运行一个find,grep exclude只能匹配以“/”结尾的行,这意味着一个目录,然后将这些匹配的权限设置为755并执行反向在文件匹配并设置为644,然后微调特定文件,如settings.php等。

lftp prompt> find . | grep "/$" | xargs chmod -v 755 

无法正常工作,我确信无法以正确的顺序和格式链接这些命令。

如何让它发挥作用?

更新:“不工作”我的意思是上面的命令没有输出到控制台,也没有产生lftp错误日志。它不是在本地运行这些命令,fwiw。我将减少命令作为演示:

find . | grep "/$"

将获取“find”的输出并返回匹配,此处为目录,按字符串匹配的性质:

./daily/
./ffmpeg-installer/
./hourly/
./includes/
./includes/database/
./includes/database/mysql/
./and_so_forth_on_down

这很酷,因为我希望执行chmod(和lftp的内部命令,支持因ftp服务器而异)所以我扩展命令如下:

find . | grep "/$" | xargs echo

哪个输出 - 什么都没有。也没有错误输出。从grep到xargs的管道没有发生。

我的目标是形成相当于:

chmod 755 ./daily/
chmod 755 ./ffmpeg-installer/

在lftp中,chmod命令正在执行ftp-server-permissions更改,本地perms更改。

1 个答案:

答案 0 :(得分:2)

要解释为什么这不能按预期工作,请继续阅读 - 要解决给定问题,请向下滚动。

答案可以在lftp的联机帮助页中找到,其中说明了

“[s] ome命令允许将其输出(cat,ls,...)重定向到文件或通过管道重定向到外部命令。”

因此,当您在lftp中支持重定向的命令上使用这样的管道时,您将其输出路由到本地工具,这最终会导致{ {1}}尝试更改本地计算机上文件/目录的权限,如果当前目录中的目录布局不一致,则很可能会失败 - 这是可能是你遇到的问题。

chmod + grep管道确实有效,我刚刚测试了以下内容:

xargs

我的猜测是,它似乎不适合你,因为你没有指定最大深度来查找和管道中的网络连接+缓冲阻碍了。当我在包含许多文件/子文件夹的目录上尝试相同时,完成和打印需要很长时间。在没有输出的情况下,命令真的完成了吗?

但是,你要做的事情是不可能的。正如我所说,管道的右侧使用外部命令(即使存在相同名称的内置),如手册所述,所以< / p>

lftp> find -d 2 | grep "/$"
./
./applications/
./lost+found/
./netinfo/
./packages/
./security/
./systems/
lftp> find -d 2 | grep "/$" | xargs echo
./ ./applications/ ./lost+found/ ./netinfo/ ./packages/ ./security/ ./systems/

lftp> chmod 644 foobar

等效。 是的,lftp> echo "foobar" | xargs chmod 644 是内置的,但在客户端的管道中使用它执行内置 - 手册页清楚地说明了这一点,您可以自己轻松测试。尝试以下命令并检查其输出:

chmod

解决方案

就您的问题的解决方案而言,您可以尝试以下方面:

lftp> echo foo | uname -a
lftp> echo foo | ls -al
lftp> echo foo | chmod --help
lftp> chmod --help

这将登录到您的服务器,#!/bin/bash server="ftp.foo.bar" root_folder="/my/path" { { lftp "${server}" <<EOF cd "${root_folder}" find | grep "/$" quit EOF } | awk '{ printf "chmod 755 \"%s\"\n", $0 }' { lftp "${server}" <<EOF cd "${root_folder}" find | grep -v "/$" quit EOF } | awk '{ printf "chmod 644 \"%s\"\n", $0 }' } | lftp "${server}" 到您希望以递归方式开始更改权限的文件夹,使用cd查找所有目录,注销,将此文件列表导入{{ 1}}围绕它构建find + grep命令,重复文件的整个过程,然后将整个命令列表传递到新的awk调用中,以实际运行生成的chmod命令。 / p>

您还必须将您的凭据添加到lftp调用中,并且您可能想要注释掉最终的chmod以检查它是否在您实际运行整个事件之前产生了所需的输出。请报告这是否适合您!