2012-03-28 5 views
-3

Mögliche Duplizieren:
XML editing inside a Perl scriptSystem (perl -pi -e) für XML-Bearbeitung

Kann mir bitte jemand helfen. Ich bin dabei, verrückt zu werden, wenn ich diese eine Zeile betrachte. Ich versuche, den Perl -pi -e zu verwenden, um eine XML-Datei zu bearbeiten.

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'\""); 

Dies wird nicht funktionieren Ich habe alle Arten von Kombinationen ausprobiert.

+0

"_ Ich versuche, das Perl -pi -e zu verwenden, um eine XML-Datei zu bearbeiten._" Ok, aber was ist das Ziel, wenn Sie diese Datei bearbeiten? Haben Sie einen Fehler? – sidyll

+2

define "wird nicht funktionieren". Und bitte sagen Sie mir, das Problem ist, dass der Server, auf den Sie zugreifen wollen, eine gewisse Ähnlichkeit mit vernünftiger Sicherheit hat, und Sie können das nicht so root machen. –

+0

Ich bekomme Fehlermeldungen beschweren sich über die Betreiber. Bareword gefunden, wo Operator erwartet bei Untitled.pl Zeile 7, in der Nähe von "" ssh-t harrikr \ @ \ "sudo su - root -c Perl -pi-e s {xmlNamespaceAware =" false " Zeichenfolge gefunden, wo Betreiber erwartet Untitled.pl Zeile 7, in der Nähe von "false">} {xmlNamespaceAware = "" Bareword gefunden, wo Operator erwartet bei Untitle.pl Zeile 7, in der Nähe von "">} {xmlNamespaceAware = "false" (Fehlender Operator vor false?) – Badboy

Antwort

3

Sie haben diese Frage bereits gestellt, und die Antwort war, dass Sie die Zitate alle durcheinander haben. Hier ist, was Sie haben:

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

Lassen Sie uns die Bits innerhalb der einfachen Anführungszeichen nehmen und ersetzen sie durch Unsinn:

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

Es sieht für mich wie perl ist nicht das Programm in Gang bringen denken Sie, dass es bekommen, weil Sie die Anführungszeichen vorzeitig schließen. Statt alles in einem String angeben, zu versuchen, baut sie auf, so dass die entweichende leichter grok:

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

Warum sind Sie dies in einem großen Systemaufruf zu versuchen zu tun? Ich habe jetzt über Situationen aus meiner eigenen Arbeit, wo solche Dinge notwendig waren, aber ich weiß auch, dass ich es mit Net::SSH::Perl::ProxiedIPC gelöst habe. Es behandelt all diese doof Details.

Und wie die vorherige Antwort auf Ihre gleiche Frage darauf hinweist, sind diese sudo und su Invokationen wirklich beängstigend.

+0

Danke, ich muss die letzte Antwort verpasst haben, aber das war sehr hilfreich. Ich denke Net :: SSH :: Perl :: ProxiedIPC wird sehr hilfreich dabei sein. Danke noch einmal!!! – Badboy

0

Bauen Sie es von innen nach außen.

Sie können feststellen, dass ich Ihr Perl-Programm durch die Verwendung des \ K Regex-Atoms gekürzt habe. Das erfordert 5.10, also zögern Sie nicht, diese Änderung rückgängig zu machen.


zu Root erscheint unnötig. Da die zu bearbeitende Datei anscheinend zu harrikr gehört, warum nicht einfach ssh als diese Person? Ich denke, das bedeutet auch, dass -t unnötig wird.

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

Die Datei im Besitz von root, aber die Testfalldatei gehört harrikr – Badboy

+0

@ user1272415, Net :: SSH :: Perl :: ProxiedIPC hat drei Einschränkungen, die Sie betreffen. Soweit ich das beurteilen kann, bietet ProxiedIPC keine Möglichkeit, das su und/oder sudo zu machen (ohne auszublenden, was dich direkt zum ursprünglichen Problem zurückbringt), ProxiedIPC erlaubt dir nicht, die Befehlszeile zu übergeben Optionen zu Perl, und ProxiedIPC erlaubt es nicht, Argumente an das Perl-Skript zu übergeben. – ikegami

+0

Ike Ich nahm diesen Code und gab meine Namen und es ssh an den Remote-Server, aber nicht die Datei data.xml geändert. Ich sehe nicht, wo Sie shell_quote ($ Host) definieren .. $ host – Badboy