2016-03-31 27 views
0

Birçok sunucuya ssh için plink kullanıyorum ve komutları çalıştırıyorum. Ancak, şifre özel karakter olduğunda konsolda komutları çalıştıramaz.Özel karakterler cmd cinsinden parola nasıl geçirilir?

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

[email protected]#$%^&*()_+{}|:"sdfsdfs!df - \ ile " kaçan Başarı.

[email protected]#<>$%^&*()_+{}|:"sdfsdfs!df - \ ile "'dan kaçtığında başarı.

[email protected]#$%^&*()_+{}|:"<>sdfsdfs!df - Başarısız. \ ile "'dan kaçtı. Hata mesajı:> şu anda beklenmedik.

[email protected]#$%^&*()_+{}|:"><sdfsdfs!df - Başarısız. \ ile "'dan kaçtı. Hata mesajı: < şu anda beklenmedik bir durumdu.

[email protected]#$%^&*()_+{}|:"<sdfsdfs!df - Başarısız. \ ile "'dan kaçtı. Hata mesajı: Sistem belirtilen yolu bulamıyor.

[email protected]#$%^&*()_+{}|:">sdfsdfs!df - Başarısız. \ ile "'dan kaçtı. Hata mesajı: Sistem belirtilen yolu bulamıyor.

< veya >"'dan sonra görüntülendiğinde, çıkış işe yaramaz. Birçok kişi bunu nasıl halledeceğimi biliyor mu?

+0

cmd komut dosyasında CMD'nin bir değişkeni geçirdiğini düşündüğü sırada yüzde yüzdesi de kaçmak ister - bunun için %% double kullanabilirsin. Daha fazla bilgi - http://www.robvanderwoude.com/escapechars.php –

cevap

0

Sorunun, özel karakterlerden kaçmak için değil, cmd'nin özel karakterleri nasıl işlediği ile ilgili olduğunu fark ettik. Bundan

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 

:

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

Burada özel bu uygulamaya karakterler ve sahip girdileri geçti çıktısı: Bunun için, komut satırı argümanı alıp yazdırmak için basit bir Java sınıfı yarattı analizi, "ve da ^ ile kaçan edilecek olan alternatif " sonra da ortaya çıkabilecek < veya > sembolüdür tek özel karakter çıkış yapılmasını tespit edilmiştir. This document beni kaçış bölümüne yönlendirdi.

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) 

Hala kaçan argümanlarla yürütülebilir çağırarak ile sorunları vardı:

Aşağıda Kaçtım parametresi oluşturmak için yazdım piton fonksiyonudur. Ben talimatının uygulanması için aşağıdaki yolu kullanıyordu:

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

Veya Java söylemek, öyle olurdu:

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

Bu fazla sorun verdi. Python veya Java'nın işlemi yürütme şekli farklıdır. Özel karakterler kaçar ve sürece geçer. Bu nedenle, çok daha fazla sorun yaratır.

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

olarak yazılmış olabilir: Bu işlemek için, ben yukarıdaki kodu değişti

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

, komut arasında, için örn içinde boşluk vardı ls -al, ancak bir işlemi başlatmak için argümanları iletmenin yolu budur. " arasındaki komutu geçmeyi denediğimde, uzak sistemde yürütme için " aktarıldığından, komutun bulunamadığı hatası verildi.

Not: Ben komut argümanlar görmek için komutu WMIC path win32_process get name,Commandline | find "plink.exe" kullanmıştı . Çıktı html kaçtı, ancak geçen argümanları bulmaya yardım etti.

İlgili konular