2016-03-31 8 views
0

Ich verwende plink zu SSH zu vielen Servern und Befehle ausführen. Es kann jedoch keine Befehle auf der Konsole ausgeführt werden, wenn das Passwort Sonderzeichen enthält.Wie passiere ich ein Passwort mit Sonderzeichen in cmd?

Verbrauch: plink.exe -ssh -pw "password" [email protected] "command to execute"

[email protected]#$%^&*()_+{}|:"sdfsdfs!df - Erfolg, wenn " mit \ entkommen.

[email protected]#<>$%^&*()_+{}|:"sdfsdfs!df - Erfolgreich, wenn es entkommen " mit \.

[email protected]#$%^&*()_+{}|:"<>sdfsdfs!df - Fehlgeschlagen. Entgangen " mit \. Fehlermeldung:> war zu dieser Zeit unerwartet.

[email protected]#$%^&*()_+{}|:"><sdfsdfs!df - Fehlgeschlagen. Entgangen " mit \. Fehlermeldung: < war zu dieser Zeit unerwartet.

[email protected]#$%^&*()_+{}|:"<sdfsdfs!df - Fehlgeschlagen. Entgangen " mit \. Fehlermeldung: Das System kann den angegebenen Pfad nicht finden.

[email protected]#$%^&*()_+{}|:">sdfsdfs!df - Fehlgeschlagen. Entgangen " mit \. Fehlermeldung: Das System kann den angegebenen Pfad nicht finden.

Sieht aus wie wenn < oder > nach " erscheinen, funktioniert die Escape nicht. Viele ich weiß, wie man damit umgeht?

+0

Prozentsatz% muss auch entkommen, wenn in cmd Skript als CMD denkt, dass Sie eine Variable übergeben - Sie können Double %% dafür verwenden. Mehr hier - http://www.robvanderwoude.com/escapechars.php –

Antwort

0

Realisiert, dass das Problem nicht mit plink die Sonderzeichen zu entkommen, sondern mit, wie cmd Sonderzeichen behandelt. Dazu habe ich eine einfache Java-Klasse, um das Befehlszeilenargument zu nehmen und drucken:

public class MyTest { 
    public static void main(String args[]) { 
     System.out.println(args[0]); 
    } 
} 

ich bestehen Eingänge mit Sonderzeichen dieser Anmeldung und hier ist die Ausgabe:

C:\>java MyTest "[email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./sss" 
    > was unexpected at this time. 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"<>?-=`[]\;',./sss" 
    > was unexpected at this time. 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./sss" 
    [email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./sss 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasfafds" 
    [email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./s"sasfafds 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasf<>afds" 
    [email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./s"sasf<>afds 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasf<>af\"ds" 
    [email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./s"sasf<>af"ds 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasf<>af\"dasd<>fs" 
    > was unexpected at this time. 

    C:\>java MyTest "[email protected]#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasf<>af\"dasd^<^>fs" 

    [email protected]#$%^&*()_+{}|:"<>?-=`[]\;',./s"sasf<>af"dasd<>fs 

    C:\>java MyTest "[email protected]<>#$%^&*()_+{}|:\"^<^>?-=`[]\;',./s\"sasf<>af\"dasd^<^>fs" 
    [email protected]<>#$%^&*()_+{}|:"<>?-=`[]\;',./s"sasf<>af"dasd<>fs 

Aus diesem Analyse, es wird festgestellt, dass nur Sonderzeichen zu entkommen ist "und alle < oder > Symbol nach dem Alternieren " hat auch mit ^ zu entkommen. This document wies mich auf den Fluchtteil.

Unten ist die Python-Funktion, die ich das entwichene Parameter zur Erzeugung geschrieben haben:

def escapepassword(initpassword): 
    passsplit = list(initpassword) 
    quotesflag=False 
    index = -1 
    for token in passsplit: 
     index += 1 
     if quotesflag and (token in ("<", ">")): 
      passsplit[index] = "^" + token 
     else: 
      if token == '"': 
       passsplit[index] = "\\\"" 
       quotesflag = not quotesflag 
    return "".join(passsplit) 

Noch hatte ich Probleme mit der ausführbaren Datei mit entkam Argumente aufrufen. Ich wurde mit der folgenden Art und Weise den Befehl ausführt:

subprocess.Popen('plink.exe -ssh -batch -pw' + escapepassword(password) + ' ' + username + '@' + ipaddress + ' "' + command + '"', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Oder in Java zu sagen, wäre es:

Runtime.getRuntime().exec("plink.exe -ssh -batch -pw" + escapepassword(password) + " " + username + "@" + ipaddress + " \"" + command + "\""); 

hat diese viel Mühe gegeben. Die Art, wie Python oder Java den Prozess ausführen, ist anders. Das Sonderzeichen wird ausgeblendet und wird an den Prozess übergeben. Daher erzeugt es viel mehr Probleme.Um damit umzugehen, änderte ich den obigen Code zu:

commandtoexecute = ['plink.exe', '-ssh', '-batch', '-pw', password, username + '@' + ipaddress, command] 
subprocess.Popen(commandtoexecute, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

In Java werden könnten geschrieben als:

Runtime.getRuntime().exec(new String [] {"plink.exe", "-ssh", "-batch", "-pw", password, username + "@" + ipaddress, command); 

Hier hatte Befehl Raum dazwischen, für z.B. ls -al, aber dies ist die Methode, um Argumente zum Starten eines Prozesses zu übergeben. Als ich versuchte, den Befehl zwischen " zu übergeben, hatte es einen Fehler gegeben, der sagte, dass Befehl nicht gefunden wurde, weil " auch für die Ausführung auf dem Remote-System übergeben wurde.

Hinweis: ich den Befehl hatte WMIC path win32_process get name,Commandline | find "plink.exe" die Kommandozeilenargumente zu sehen. Die Ausgabe ist html maskiert, hat jedoch geholfen, die übergebenen Argumente zu finden.

Verwandte Themen