2016-04-12 13 views
0

Linux'ta bir metin dosyasında oluşturduğum sözcüklerin bir listesini içeren basit bir komut dosyası yazmaya çalışıyorum ve bu sözcüğü bir steganografi çıkarıcıya karşı kontrol eden bir program aracılığıyla çalıştırıyorum. Ben mümkün oldumPython'da, bir listeden veriyi linux komutuna nasıl girersiniz?

steghide --extract -p {buraya şifre} -sf {burada dosya adı}:

programı (steghide)

komuta aşağıdaki sözdizimini kullanır dosyayı çağırmak ve listedeki kelimeler için bir döngü oluşturmak, ancak her bir komutta bu yinelemeden sözcüğü girmek için bir yol bulamadı.

Çalışmayı nasıl denediğimi burada.

import os 
import sys 

script, filename = argv 
filename2 = sys.open(filename) 

for word in filename2: 
    os.system('steghide --extract -p [want to put something here] -sf stegfilename') 

Kontrollü bir kutudayım ve zaten sahip olduğumun ötesindeki bir şeyi karşıdan yükleyemiyorum. Herhangi bir yardım takdir edilir.

Güncelleme: Ben çalışması için var

. Ama şimdi doğru cevabı bulursanız çıkmamı sağlamaya çalışıyorum. Python'u çıktıyı okumak için çok zorlanıyorum. Şimdiye kadar sahip olduğum şeyler. sys içe argv gelen

`alma alt işlemi f olarak (geçer) açık olan

komut, dosya = Argv geçer = dosya

: f hattı için: proc = subprocess.popen (['steghide', '--extract', '-p' line.strip(), '-sf', 'stegged dosya adı'], stdout = altprocess.PIPE) stdout = proc.communicate() [0] çıkış = proc.stdout.readline()

if 'wrote' in output: 
     print 'YOU FOUND IT!' 
     break 
    else: 
     print line` 

cevap

1

Python'da string formating options'u öğrenmek güzel bir zaman. Değerleri dinamik olarak bir dizeye eklemenize izin verir. Bir örnek: Bu özel durumda

"This {0} is an example".format([1,2,3]) 
>>>> "This [1,2,3] is an example" 

, kendi dizeye değer ekler ve sonra da bu ipe steghide arayacak

value = 'foo' # the item you want to insert - replace with list, number, etc. 
... 
for word in filename2: 
    os.system('steghide --extract -p {0} -sf stegfilename'.format(value)) 

Bu yapmak istiyorum.

1

Bunun yerine subprocess modülünü kullanın; Size daha fazla seçenek/denetim sağlar ve os.system() kullanımdan kaldırılmıştır.

from subprocess import check_call 


for word in map(str.rstrip, filename2):  
    check_call(['steghide', "--extract", "-p", word, "-sf", "stegfilename'"]) 
+0

Çalışmaya başladım, ancak şimdi doğru şifreyi bulduğunda çıkması için çalışıyorum. Şimdiye kadar sahip olduğum şeyler.sys içe argv ithalat alt işlemi komut, dosya = Argv geçer = dosya f olarak (geçer) açık olan : \t \t Proc = subprocess.popen ([ 'steghide', ': f hattı için \t --extract',' -p line.strip() '-sf', 'dosya adı stegged'], stdout'u = subprocess.PIPE) \t \t stdout'u = proc.communicate() [0] \t \t çıkış = proc.stdout.readline() \t \t \t çıktıda 'yazdı': \t \t \t print 'SEN BULUNMAKTADIR!' \t \t \t başka \t \t molası : \t \t \t baskı hattı – Brad

+0

@Brad 'steghide' C/Unix kurallarını izler ve 0 başarılı olursa, 1 değilse döner. Bunu başarmak için 'subprocess.call' ile birlikte kullanın ('subprocess.call' işlemin dönüş kodunu döndürür). "Subprocess.PIPE", proc.communicate() [0] 'vb. – jDo

1

kullanın subprocess.check_call.

import os 
import sys 

script, filename = argv 
filename2 = sys.open(filename) 

for word in filename2: 
    os.system('steghide --extract -p ' +[want to put something here]+ '-sf stegfilename') 
0

dizisi biçimlendirme burada tabidir: args bir listesini geçirerek

import subproces 
with open(filename, "r") as f: 
    # assumes that you have one word per line 
    for line in f: 
     subprocess.call(['steghide', '--extract', '-p', line.strip(), '-sf', stegfilename]) 
     # or if you want the output of running Niels Provos' cool, old tool :) 
     cmd_output = subprocess.check_output(['steghide', '--extract', '-p', line.strip(), '-sf', stegfilename]) 
İlgili konular