1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

perl bzw. sh Problem

Dieses Thema im Forum "Programmieren" wurde erstellt von mogbo, 15 Mai 2017.

  1. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Hallo,
    hab mir ein recht simples Script für das Starten und Beenden von VPNs gemacht.
    Sämtliche *.ovpn Dateien liegen in /etc/openvpn

    Mein Problem ist jetzt bei der Ausführung, dass wenn ich den if ($input > 0) Teil ausführe, bekomm ich die Fehlermeldung: sh syntax error `;' unexpected . Ich kann jedoch den Fehler nicht finden. Könnte vlt mal ein zweites Auge drüber schauen, bin am Verzweifeln :)
    Code:
    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    use utf8;
    
    my @ls_out;
    my $count = 0;
    my $zaehler;
    my $anzahl;
    my $input;
    
    my $path = "/etc/openvpn";
    
    @ls_out = `ls $path | perl -lane 'print if /.ovpn/'`;
    $anzahl = @ls_out;
    
    print "0.) Kill openvpn and change /etc/resolv.conf\n";
    
    while ( $anzahl > $count )
    {
            $zaehler = $count + 1;
            print "$zaehler.) $ls_out[$count]";
            $count += 1;
    }
    
    print "Choose: \n";
    chomp( $input = <STDIN> );
    
    if ( $input > 0 )
    {
            $input -= 1;
            system("doas sh -c 'openvpn --config $path/$ls_out[$input]; echo $ls_out[$input] > /tmp/vpn_connection; chown root:wheel /tmp/vpn_connection; chmod 440 /tmp/vpn_connection'");
    }
    else
    {
            system("doas sh -c 'pkill openvpn; echo \"nameserver 127.0.0.1\" > /etc/resolv.conf'");
    }
    
    Schönheitsfehler und Sonstiges können auch gerne bemängelt werden, hab leider niemanden der mich kritisieren könnte
     
  2. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Füge doch einfach ein wenig Debugging hinzu und lass dir das Kommando vorher ausgeben:
    Code:
    ...
    if ( $input > 0 )
    {
            $input -= 1;
            my $cmd="doas sh -c 'openvpn --config $path/$ls_out[$input]; echo $ls_out[$input] > /tmp/vpn_connection; chown root:wheel /tmp/vpn_connection; chmod 440 /tmp/vpn_connection'";
            warn "calling $cmd\n";
            system($cmd);
    }
    ...
     
  3. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Danke für den Tipp, leider kommt dabei auch nicht mehr raus. Die Ausgabe von warn sieht für mich richtig aus, jedoch am Ende mit der gleichen Fehlermeldung: sh syntax error `;' unexpected
     
  4. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Ich tippe auf die single quotas innerhalb von double quotas
     
  5. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Hm, dann dürfte diese Zeile auch nicht gehen oder? Die geht aber
     
  6. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Mit dem Unterschied, dass in dieser Zeile keine Variablen verwendet werden
    Hier jedoch schon, und dank single quotas können die Variablen nicht übersetzt werden.
    Kann mich aber auch täuschen, lese es grad auf einem 4,3Zoll Display :-)
     
  7. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Code:
    #!/usr/bin/env perl
    #===============================================================================
    #
    #         FILE: ovpn.pl
    #
    #        USAGE: ./ovpn.pl  
    #
    #  DESCRIPTION: 
    #
    #      OPTIONS: ---
    # REQUIREMENTS: ---
    #         BUGS: ---
    #        NOTES: ---
    #       AUTHOR: xxxx (), 
    # ORGANIZATION: 
    #      VERSION: 1.0
    #      CREATED: 05/15/17 15:09:33
    #     REVISION: ---
    #===============================================================================
    
    use strict;
    use warnings;
    use utf8;
    
    my @ls_out;
    my $count = 0;
    my $zaehler;
    my $anzahl;
    my $input;
    my $random;
    
    my $path = "/etc/openvpn";
    
    @ls_out = `ls $path | perl -lane 'print if /.ovpn/'`;
    $anzahl = @ls_out;
    
    print "0.) Kill openvpn and change /etc/resolv.conf\n";
    
    while ( $anzahl > $count )
    {
        $zaehler = $count + 1;
        print "$zaehler.) $ls_out[$count]";
        $count += 1;
    }
    
    print "99.) Random connection\n";
    
    print "Choose: \n";
    chomp( $input = <STDIN> );
    
    if ( $input > 0 )
    {
        if ( $input == 99 )
        {
            $random = $ls_out[rand($anzahl)];
            system("echo \"$random\" > /tmp/vpn_connection");
            system("chmod 660 /tmp/vpn_connection");
            system("doas sh -c 'openvpn --config $path/$random'");
        }
        else
        {
            $input -= 1;
            system("echo \"$ls_out[$input]\" > /tmp/vpn_connection");
            system("chmod 660 /tmp/vpn_connection");
            system("doas sh -c 'openvpn --config $path/$ls_out[$input]'");
        }
    }
    else
    {
        system("doas sh -c 'pkill openvpn;echo \"nameserver 127.0.0.1\" > /etc/resolv.conf'");
    }
    
    Hm, habs jetzt so gelöst, auch wenn ich das chown root:wheel /tmp/vpn_connection schon gerne ausführen würde, auch wenns im Endeffekt vermutlich völlig unnötig ist.

    Code:
    system("doas sh -c 'openvpn --config $path/$ls_out[$input]'");
    
    So lässt es sich komischerweise auch ohne Probleme ausführen, scheint wohl ein Problem mit dem Semicolon zu sein (was für mich völlig sinnfrei ist), oder ich verstehe deine Erklärung nicht richtig.

    Nach deiner Erklärung dürfte die Zeile oben auch nicht gehen oder?
     
  8. TCM

    TCM Well-Known Member

    Registriert seit:
    14 März 2005
    Beiträge:
    1.231
    Nimm die Variablen mal testweise aus dem String raus und setz ihn lieber per concatenation zusammen. Auch gibt es einen Unterschied zwischen system($foo) und system ($foo, $bar, $baz), den du evtl. nutzen kannst.
     
  9. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Habs ohne Variablen getestet, läuft, sobald ich eine Variable verwende spuckt er mir sobald ein Semicolon auftaucht eine Fehlermeldung aus, oder führt den Teil nach dem Semicolon nicht aus.
     
  10. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Weiß ich leider nicht wie ichs verwenden soll, da
    Code:
    doas sh -c
    
    mit einer Passworteingabe beides ausführen muss.

    Ich grüble mal morgen weiter evtl find ich ja doch einen Weg :)
     
  11. TCM

    TCM Well-Known Member

    Registriert seit:
    14 März 2005
    Beiträge:
    1.231
    Wie sieht der Test jetzt aus? Ich dachte an sowas wie
    Code:
    system('doas', 'sh', '-c', 'blablabla ' . $foo[$bar] . '; blablabla');
     
  12. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Code:
    ...
    if ( $input == 99 )
    {
      $random = $ls_out[rand($anzahl)];
      system("echo \"$random\" > /tmp/vpn_connection");
      system("chmod 660 /tmp/vpn_connection");
      my $cmd_1 = "chown root:wheel /tmp/vpn_connection";
      my $cmd_2 = "openvpn --config $path/$random";
      system("'doas', 'sh', '-c', '$cmd_1;$cmd_2ƒ'");
    }
    ...
    
    Meintest du so @TCM ? Kanns leider nicht testen, bin nicht zu Hause
     
  13. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Versuch es mal so (habs nicht getestet, müsste aber mMn funktionieren):
     
  14. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    Quasi Singelquotes durch \" ersetzen, glaub das hab ich wirklich noch nicht probiert, werd ich zu Hause gleich mal testen.

    Schon komisch, ganzes Script in 10 mins geschrieben und dann schluckt ein kleiner Schönheitsaspekt soviel Zeit...
     
  15. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Bevor du nicht die komplette Kommandozeile postest, die fehlschlägt (das war der Hinweis auf die Debug-Ausgabe), kann dir hier niemand helfen. Glaskugeln sind nunmal Mangelware.

    Rob
     
  16. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Das ist falsch. Da das gesamte Kommando in doppelten Anführungszeichen steht, werden die Variablen auf jeden Fall interpoliert. Die einfachen Anführungszeichen innerhalb der Zeichenkette haben darauf keinen Einfluss mehr.

    Rob
     
  17. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Wozu soll diese Datei überhaupt sein? In deinem Programm wird sie nirgends ein zweites Mal genutzt.

    Rob
     
  18. mogbo

    mogbo Does it run under Windows? Who cares?

    Registriert seit:
    12 September 2016
    Beiträge:
    316
    doas sh -c 'openvpn --config /etc/openvpn/xy.ovpn; echo xy.ovpn > /tmp/vpn_connection; chown root:wheel /tmp/vpn_connection; chmod 440 /tmp/vpn_connection'
    sh syntax error `;' unexpected

    Mehr als diese zwei Zeilen kommt bei warn nicht raus, ich kanns später nochmals testen und posten (bin gerade nicht an meinem PC).

    In meinen *.ovpn ist immer ein Script verbaut:

    /etc/openvpn/*.ovpn
    Code:
    ...
    up "/etc/openvpn/up.sh"
    ...
    
    Ich brauch die Ausgabe welcher VPN verwendet wird um die Namensauflösung anzupassen, nachdem die Verbindung zum VPN steht, da ich sonst einen DNSleak habe.
    Da ich nicht jede *.ovpn als Schneeflocke konfigurieren will, hab ichs lieber so gelöst.

    Darum hab ich im Script auch eine extra Funktion zum abschalten des VPNs, da die Namensauflösung nur mit Verbundenem VPN klappt.
     
  19. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Nimm mal eine genaue Kopie deiner Debug-Ausgabe und führe das in der Shell aus. Kommt dann auch eine Fehlermeldung?

    Rob
     
  20. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Das mag bei Perl noch funktionieren, in dem Beispiel wird aber noch die sh augerufen und die kann das dann nicht mehr sauber interpretieiren.

    2017-05-16 12_31_57-FreeBSD [wird ausgeführt] - Oracle VM VirtualBox.png
    2017-05-16 12_32_27-FreeBSD [wird ausgeführt] - Oracle VM VirtualBox.png

    Edit: habe einen Fehler im letzten Beispiel gehabt, daher dieser Update.
     
    Zuletzt bearbeitet: 16 Mai 2017
  21. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Und hier ein Beispiel wie es funktioniert:
    2017-05-16 12_37_06-FreeBSD [wird ausgeführt] - Oracle VM VirtualBox.png

    2017-05-16 12_37_27-FreeBSD [wird ausgeführt] - Oracle VM VirtualBox.png
     
  22. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Häh? Du hast im ersten Beispiel einen Syntaxfehler im Perl-Skript, das kann ja nicht gehen.

    In der Kommandozeile des OP sieht die Shell die Variablen gar nicht, also kann sie auch nichts falsch interpretieren.
    Rob
     
  23. evgenij

    evgenij Member

    Registriert seit:
    11 November 2011
    Beiträge:
    46
    Huh, wo denn? Ich habe den oberen Beispiel nur angepasst und die double quotas mit backslash maskiert...mehr habe ich nicht angepasst
     
  24. KobRheTilla

    KobRheTilla used register

    Registriert seit:
    20 Januar 2011
    Beiträge:
    1.017
    Schau doch in dein Bild: "Scalar found where operator expected at ./test.pl line 6". Das ist die Fehlermeldung vom Perl-Interpreter.

    Rob
     
  25. Yamagi

    Yamagi Possessed With Psi Powers Mitarbeiter

    Registriert seit:
    14 April 2004
    Beiträge:
    8.657
    Ort:
    Schleswig-Holstein
    Muss das als Screenshot sein? Man könnte auch code-Tags nutzen...