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.
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 –