Bash for 远程服务器上的循环

Bash for loop on remote server

我是 bash 的新手,我正在尝试创建一个脚本来检查恶意文件。特别是那些使用全局 PHP 变量来隐藏内容的。下面是此类文件的示例行:

$GLOBALS['qahtm46']($zadoh31) < 12) { $GLOBALS['wlcrh95']($i34, $gxfej87);

我需要远程检查并获取结果,这是我目前连接和获取其他信息的方式:

eval=$(ssh -q -t -o GSSAPIAuthentication=yes user@$webs "/usr/bin/ssuu $domain" << EOF
grep -l -r --include=*.php -PHn "(eval\(.*\);)" .
exit
EOF
)

当我 echo $eval 时,它会打印任何匹配项的文件名。太棒了!

每当我 运行 直接在服务器上执行以下命令时:

for x in $(find public_html -type f -name '*.php' | xargs grep -ol 'GLOBALS'); do grep -o 'GLOBALS' $x | wc -l | tr '\n' ' ' ; echo $x; printf "\n"; sleep 1; done
exit
EOF
)

我得到正确的输出:

1 public_html/update.php
363 public_html/sites/all/themes/corporate_blue/images/proxy2.php
363 public_html/sites/all/themes/corporate_blue/images/proxy.php
2 public_html/sites/all/modules/views/views.api.php
2 public_html/sites/all/modules/imce/tpl/imce-page.tpl.php
1 public_html/sites/all/modules/ckeditor/includes/filemanager.config.php
4 public_html/modules/simpletest/drupal_web_test_case.php

然而,当我 运行 使用我通常的方法时,我没有得到任何输出,如果我输出到一个文件,该文件被创建但没有写入任何内容:

globals=$(ssh -q -t -o GSSAPIAuthentication=yes user@$webs "/usr/bin/ssuu $domain" << EOF
for x in $(find public_html -type f -name '*.php' | xargs grep -ol 'GLOBALS'); do grep -o 'GLOBALS' $x | wc -l | tr '\n' ' ' ; echo $x; printf "\n"; sleep 1; done
exit
EOF
)

有人能看出问题所在吗?

当你运行这个:

ssh server << EOF
for x in $(find ...); ...
EOF

here-document 的内容在将脚本传递到服务器之前由本地 shell 评估。 要在服务器上对其进行评估,请双引号 EOF:

ssh server << "EOF"
for x in $(find ...); ...
EOF