我试图检查位于列表中几台服务器上ZIP文件中非常规文件夹深度中某些文件的存在,最终以bash脚本运行它。
我能够在特定的服务器(IP)上运行命令并获得输出,尝试使用服务器列表txt文件时问题开始了。
for HOST in $(cat serversList.txt)
do
"sshpass -p '*******' ssh osboxes@$HOST -o StrictHostKeyChecking=no find /home/osboxes/Desktop/script -mindepth 1 -maxdepth 7 -iname '*.zip'" -exec "unzip -l {} \; | grep '\.zip\|filename*' >$(hostname)_out.t**strong text**xt 2>$(hostname)_error.txt"
done
我相信我没有正确使用单引号/双引号(不确定为什么尝试直接在IP上运行时使用“而不使用')。
[我只是不太熟悉bash,不知道如何聚合表达式以使它们与命令相关(例如使用括号,我知道这不适用于for循环)。
基本上,我希望输出和错误连同运行它的计算机的主机名一起发送到文件。目前我遇到错误-
bash: sshpass -p '*******' ssh [email protected] -o StrictHostKeyChecking=no find /home/osboxes/Desktop/script -mindepth 1 -maxdepth 7 -iname '*.zip': No such file or directory.
在我看来,不必提取ZIP即可在其中搜索,我只是不确定如何纠正它。
这里的提示将不胜感激:)
您只需要引用需要在远程主机上运行的命令,而不是整个本地命令行。
((有关循环访问文件各行的正确方法,请参见Bash FAQ 001。]
while IFS= read -r host; do
sshpass -p '*******' \
ssh osboxes@"$host" -o StrictHostKeyChecking=no \
'find /home/osboxes/Desktop/script
-mindepth 1
-maxdepth 7
-iname "*.zip"
-exec "unzip -l {} \; |
grep "\.zip\|filename*" >"$(hostname)"_out.txt 2>"$(hostname)"_error.txt'
done < serversList.txt