2014-07-24 46 views
2

我設計了一個程序,它遍歷我所有應用程序中不同Solaris(Unix)框中的每個日誌文件,並查找某個錯誤。所以,我設計了這樣的程序:Perl grep在ssh2-> exec中找不到任何東西

my $ssh2 = Net::SSH2->new(); 
$ssh2->connect($host) or die "Unable to connect Host [email protected] \n"; 
$ssh2->auth_keyboard($user,$pass) or die "Unable to login [email protected] \n"; 

$chan1 = $ssh2->channel(); 
$chan1->exec("find /apps/appName/loc/Logs/server/ -type f | xargs grep \"CVS Call\" "); 
while(<$chan1>) { 
    print $_ . "\n"; 
} 

如果我要grep一個字(只是'CVS'),它的工作原理。然而,第二個我添加一個空格或一個點它沒有找到任何東西。我嘗試用[[:space:]]或[:space:]替換空格,但仍不顯示任何結果。我知道日誌文件包含此錯誤的事實。

我也試過:

$chan1->exec("find /apps/appName/loc/Logs/server/ -type f -exec grep 'CVS Call' '{}' \\; -print"); 

我得到這個命令相同的結果,作品找到只有一個字,只要我添加第二個字,它不顯示任何結果。

有沒有人有任何想法,爲什麼當我在grep搜索中添加一個空格時,它找不到任何東西。

回答

1

該問題可能與需要引用的幾個級別有關。手工操作是非常困難的。

如果你是在Linux/Unix下,你可以使用Net::OpenSSH這會爲您做報價:

my $ssh = Net::OpenSSH->new($host, user => $user, password => $password); 
my @lines = $ssh->capture('find', $logs_dir, 
          '-type', 'f', 
          '-exec', 'grep', '-q', $string, '{}', ';', 
          '-print'); 

for (@lines) { 
    ... 
} 
相關問題