2013-09-16 1 views
1

Я пытаюсь вызвать netcat/nc изнутри цикла, передавая lcv в качестве последнего октета в команде. Кажется, я столкнулся с проблемой из-за того, что переменная находится в середине команды. То, что я хотел бы сделать, это:Вызов nc/netcat в python с переменной

for i in 1 to 50 
    print i 
    nc -nvv 192.168.1.i 21 -w 15 >> local_net.txt 

До сих пор я пытался:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt") 

и

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt") 

Есть ли простой способ ссылаться на LVC внутри команды выполнения системная команда?

+0

Я не уверен, что вы подразумеваете под «lcv» или «LVC». Они то же самое? – abarnert

ответ

5

Причина этого не работает:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt" 

... что os.system занимает одну строку, как команда оболочки. Вы даете ему три отдельных аргумента. (К тому же, даже если это работает, как вы надеялись, что придется либо ставить пробел перед i или не расфасованные один за i.) Вы можете исправить это любым из обычных способов, сочетающих строк:

os.system("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i)) 

os.system("nc -nvv 192.168.1." + str(i) + " 21 -w 15 >> local_net.txt".format(i)) 

Однако ваша интуиция, чтобы попробовать subprocess.call, была хорошей. Причина этого не работает:

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt") 

... есть двукратный.

Во-первых, вы объединяете несколько аргументов. Это эквивалентно команде оболочки:

nc '-nvv 192.168.1.' '1' '21 -w 15 >> local_net.txt' 

Когда то, что вы хотите, это эквивалентно этим:

nc -nvv 192.168.1.1 21 -w 15 >> local_net.txt 
nc '-nvv' '192.168.1.1' '21' '-w' '15' >> 'local_net.txt' 

Вам нужно разделить аргументы правильно, чтобы получить это.

Во-вторых, >> local_net.txt не является частью самой команды; это директива перенаправления оболочки. Вы не можете сделать это без оболочки.

Если вы действительно хотите использовать оболочку, вы можете сделать это так же, как и с system, но положить вместе один единственный:

subprocess.call("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i), shell=True) 

Но лучший способ сделать это, чтобы разбить аргументы должным образом, и сделать перенаправление на Python стиль вместо оболочки стиле:

with open('local_net.txt', 'a+b') as f: 
    subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"], 
        stdout=f) 

в файловом режиме, то a означает добавление в конец файла; + означает обновить файл, если он существует, создать его иначе; b означает открыть его в двоичном режиме (поэтому вы не переводите символы новой строки, если это Windows-я предполагаю Python 2.x здесь).


Между тем, версия Python из for i in 1 to 50for i in range(1, 51): является. (Обратите внимание, что 51 в конце, потому что диапазоны Python полуоткрыты.) Таким образом, положить все это вместе:

for i in range(50): 
    with open('local_net.txt', 'a+b') as f: 
     subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"], 
         stdout=f) 

Стоит отметить, что вы можете сделать это в большинстве Sh-подобных оболочек, в том числе bash, не требуя вообще Python. И для чего-то такого простого, может быть проще:

for i in {1..50}; do 
    nc -nvv 192.168.1.${i} 21 -w 15 >> local_net.txt 
done 
+0

Большое спасибо, вы не только имеете несколько решений. Ты объяснил, что я делаю неправильно. Спасибо! – user2782452