在不暴露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更改。
答案 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
以检查它是否在您实际运行整个事件之前产生了所需的输出。请报告这是否适合您!