Shell 使用ssh查找命令

Shell 使用ssh查找命令,shell,Shell,下面的示例显示了我如何需要文件搜索和输出类型,该类型在本地查找中运行良好 > find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print $2 "\t" $1}' | awk -F'/' '{print $NF}' monitor_2012-10-26_22h00m.11.29.135.Friday.sql.gz 119601 test_2

下面的示例显示了我如何需要文件搜索和输出类型,该类型在本地查找中运行良好

> find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print $2 "\t" $1}' | awk -F'/' '{print $NF}'

monitor_2012-10-26_22h00m.11.29.135.Friday.sql.gz   119601
test_2012-10-26_22h00m.10.135.Friday.sql.gz 530
status_2012-10-26_22h00m.1.29.135.Friday.sql.gz 944
ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914
但是我需要在许多服务器上打印相同的命令。所以我计划这样执行

>ssh root@192.168.87.80 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print $2 "\t" $1}' | awk -F'/' '{print $NF}'"
ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914
当然,这会给出一个空白输出。有没有办法在shell中解析这样一个搜索字符串并通过ssh获得我想要的输出

ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914

谢谢

看起来您的ssh命令有很多引号和双引号,这可能是问题的根源(没有双关语)。我建议您创建一个shell脚本来运行所需的find命令,并在每台服务器上放置它的副本。之后,只需使用ssh来执行shell脚本,而不是尝试传入复杂的命令

ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914
编辑: 我想我误解了;如果我错了,请纠正我。您是否正在寻找一种方法来创建一个循环,该循环将在一系列IP地址上运行该命令?如果是这样,这里有一个建议-创建如下shell脚本:

#!/bin/bash
for ((C=0; C<255; C++)) ; do
  for ((D=0; D<255; D++)) ; do
    IP="192.168.$C.$D"
    ssh root@$IP "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"
  done
done
ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914
#/bin/bash

对于((C=0;C每台服务器??必须是749台服务器-您的选择对勤劳的人很有用..我的方法对懒鹅很有用;)只需试着点击一下;)

ssh root@192.168.47.203 "find /DBBACKMEUP/ -not -name "localhost*" -type f -name "*2012-10-26*" -exec du -b {} \; | awk '{print "\$"2 \"\\t\" "\$"1}' | awk -F'/' '{print "\$"NF}'"

Tel_Avaya_Log_2012-10-26_22h00m.105.23.Friday.sql.gz    2119
test_2012-10-26_22h00m.10.25.Friday.sql.gz  529
OBD_2012-10-26_22h00m.103.2.203.Friday.sql.gz   914

那正是我所做的事。但IPs在我的情况下会有所不同,因为它从不同的网关获取数据。因此,我已经将调用循环的IP作为一个函数。