2012-03-28 23 views
-3

可能重複:
XML editing inside a Perl script系統(perl的-pi -e)的XML編輯

可有人請幫助我。我正在瘋狂地看着這一行。我正在嘗試使用perl -pi -e編輯XML文件。

system("ssh -t <HOST> \"sudo su - root -c 'perl -pi -e 's/xmlNamespaceAware=\"false\">/xmlNamespaceAware=\"false\"><Alias>$virtualhost1<\/Alias>/g' /home/harrikr/Scripts/TcServerScripts/data.xml'\""); 

這將無法正常工作我試過所有類型的組合。

+0

「_I我試圖用perl -pi -e來編輯一個XML文件。」好的,但是編輯該文件的目標是什麼?你有什麼錯誤嗎? – sidyll 2012-03-28 18:10:09

+2

定義「不起作用」。並且請告訴我,問題在於你試圖訪問的服務器有一些明智的安全性,而且你不能sudo root。 – 2012-03-28 18:10:41

+0

我收到抱怨操作員的錯誤消息。 運算符在Untitled.pl第7行附近找到的字符,在「」ssh -t harrikr \ @ \「sudo su - root -c perl -pi -e's {xmlNamespaceAware =」false「 在Untitled.pl第7行,在「false」附近>} {xmlNamespaceAware =「」 (在運行之前丟失了運算符?)在運算符期望的Untitled.pl第7行附近,「>> {xmlNamespaceAware =」false「 – Badboy 2012-03-28 18:31:54

回答

3

你已經問過這個問題了,答案是你所有的引用都混在一起。這裏是你擁有的一切:

"ssh -t <HOST> \"sudo su - root -c 'perl -pi -e '...' ...'\"" 

讓我們以位在單引號內,並與廢話替換它們:

"ssh -t <HOST> \"sudo su - root -c 'AAA'...'BBB'\"" 

它看起來對我來說,perl是不會讓程序,你認爲這是因爲你過早地關閉了報價。不要試圖在一個字符串中指定的一切,建立起來這樣的轉義更容易神交:

my $perl = q(perl -pi -e \\'...\\'); 
my $command = qq(sudo su - root -c '$perl'); 

爲什麼你想這樣做在一個大的系統調用?我現在談談我自己的工作中需要這種事情的情況,但我也知道我用Net::SSH::Perl::ProxiedIPC解決了這個問題。它處理所有這些愚蠢的細節。

而且,正如您對同一問題的上一個答案指出的那樣,這些sudosu調用真的很可怕。

+0

謝謝,我一定錯過了最後一個答案,但這非常有幫助。我認爲Net :: SSH :: Perl :: ProxiedIPC將對我必須完成的工作非常有幫助。再次感謝!!! – Badboy 2012-03-28 18:39:48

0

從裏到外構建它。

use String::ShellQuote qw(shell_quote); 

my $host   = 'HOST'; 
my $path_to_xml = '/home/harrikr/Scripts/TcServerScripts/data.xml'; 
my $virtualhost1 = 'VIRTUALHOST1'; 

my $perl_prog = <<'__EOI__'; 
    BEGIN { my $vh = shift(@ARGV); } 
    s/xmlNamespaceAware="false">\K/<Alias>\Q$vh\E</Alias>/g; 
__EOI__ 

my $perl_cmd = sprintf q{perl -i -pe%s %s %s}, 
    shell_quote($perl_prog), 
    shell_quote($virtualhost1), 
    shell_quote($path_to_xml); 

my $su_cmd = sprintf q{sudo su - -c%s}, 
    shell_quote($perl_cmd); 

my $ssh_cmd = sprintf q{ssh -t %s %s}, 
    shell_quote($host), 
    shell_quote($su_cmd); 

system($ssh_cmd); 

您可能注意到我通過使用\ K regex原子縮短了您的Perl程序。這需要5.10,所以隨時恢復這一變化。


成爲root似乎是不必要的。由於正在編輯的文件似乎屬於harrikr,爲什麼不簡單地ssh作爲那個人?我認爲這也意味着-t變得不必要。

use String::ShellQuote qw(shell_quote); 

my $host   = '[email protected]'; 
my $path_to_xml = '/home/harrikr/Scripts/TcServerScripts/data.xml'; 
my $virtualhost1 = 'VIRTUALHOST1'; 

my $perl_prog = <<'__EOI__'; 
    BEGIN { my $vh = shift(@ARGV); } 
    s/xmlNamespaceAware="false">\K/<Alias>\Q$vh\E</Alias>/g; 
__EOI__ 

my $perl_cmd = sprintf q{perl -i -pe%s %s %s}, 
    shell_quote($perl_prog), 
    shell_quote($virtualhost1), 
    shell_quote($path_to_xml); 

my $ssh_cmd = sprintf q{ssh %s %s}, 
    shell_quote($host), 
    shell_quote($perl_cmd); 

system($ssh_cmd); 
+0

由root擁有的文件,但測試用例文件歸harrikr – Badboy 2012-03-28 21:27:15

+0

@ user1272415所有,Net :: SSH :: Perl :: ProxiedIPC有三個限制會影響到你。據我所知,ProxiedIPC不提供一種方法讓你執行su和/或sudo(沒有脫殼,這會使你回到原來的問題),ProxiedIPC不允許你通過命令行Perl的選項,ProxiedIPC不允許你傳遞參數給Perl腳本。 – ikegami 2012-03-28 21:31:41

+0

艾克我拿走了那段代碼並輸入了我的名字,並且ssh到遠程服務器,但沒有修改data.xml。我沒有看到你定義shell_quote($ host)的位置。$ host – Badboy 2012-03-28 22:02:13