使用bash sshpass + openshh在FOR循环中运行命令

问题描述 投票:0回答:1

我试图检查位于列表中几台服务器上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 quotes
1个回答
0
投票

您只需要引用需要在远程主机上运行的命令,而不是整个本地命令行。

((有关循环访问文件各行的正确方法,请参见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
© www.soinside.com 2019 - 2024. All rights reserved.