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
我是 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