Причина этого не работает:
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 50
for 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
Я не уверен, что вы подразумеваете под «lcv» или «LVC». Они то же самое? – abarnert