2

在不公开 SSH 访问(糟糕的情况,fwiw)的共享主机上保护 Drupal 或 WordPress 安装时,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 更改。

4

1 回答 1

2

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

答案可以在手册页中找到lftp,其中指出

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

因此,当您在支持重定向 in 的命令上使用这样的管道时lftp,您会将其输出通过管道传输到本地工具,这最终将导致chmod尝试更改本地计算机上文件/目录的权限,并且如果您在本地当前目录中没有巧合的目录布局,很可能会失败 - 这可能是您遇到的问题。

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

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}"

这将登录到您的服务器,cds 到您要递归开始更改权限的文件夹,用于find + grep查找所有目录,注销,将此文件列表通过管道导入awk以围绕它构建chmod命令,重复文件的整个过程,然后管道整个命令列表到一个新的lftp调用中以实际运行生成的chmod命令。

您还必须将您的凭据添加到调用中,并且您可能希望在实际运行整个过程之前lftp注释掉 final以检查它是否产生所需的输出。| lftp "${server}"如果这对您有用,请报告!

于 2013-04-08T19:28:55.077 回答