Форум сайта python.su
0
Не могу сообразить как можно со списка, в котором находятся и int и str, получить значения без '' Квадратные скобки убрал через strip
Пытаюсь переписать bash скрипт на python, мне нужно чтобы скрипт получал 2 или 3 обязательных аргумента и записывал их в переменные
Пример:
./script.py power wlan0 3 #usr/bin/python3 from sys import argv from subprocess import call global IFACE, args, POWER, MON, CH, DUMP #Получаем все переданные аргументы ['power', 'wlan0', '3'], записываем в args args = argv[1:] # Теперь нужно через slice разделить весь список и положить значения в переменные без '' и [] IFACE = str(args[1:2]).strip('[]') #на выходе 'wlan0', а нужно wlan0 CH = str(args[2:3]).strip('[]') #на выходе '3', а нужно просто 3 #Далее значения подставляются в shell команды, одна из функций def check_iface(): iface = call(['iwconfig', IFACE]) if iface != 0: exit(1) # Но не отрабатывает, потому что подставляется 'wlan0', а должно wlan0 check_iface()
./txpower.py power wlan0 3 '3' ['power', 'wlan0', '3'] 'wlan0' No such device
# К примеру args = argv[1:] при запуске скрипта пишет ['power', 'wlan0', '3'], и также остальные.
Отредактировано Demontager (Июнь 18, 2014 20:56:26)
Офлайн
253
Переписывать лучше по сути действий.
Никаких кавычек и скобок в переменных нет, это способ их преобразования в строку добавляет. Зачем вы все аргументы в строку преобразовали? Их надо напрямую использовать.
А вы взяли нормальный список, который могли запихнуть в call преобразовали в строку, а потом безуспешно пытаетесь из этой строки опять сделать исходный список.
Если очень хочется сделайте строку целиком методом строки format, проверьте ее при помощи print и вызывайте
you_string="some_conf {arg1}".format(arg1="a") subprocess.check_call(you_string, shell=True)
Отредактировано doza_and (Июнь 18, 2014 22:48:13)
Офлайн
0
Я и спрашиваю, потому что не знаю как правильно, это моя первая проба перенести свой же написанный bash на python
Вот что я запускаю, https://gist.github.com/Demontager/340cbb413aecba500a6c
Оригинал скрипт на bash https://github.com/Demontager/txpower/blob/master/txpower.sh
Ок, и как тогда напрямую аргументы использовать?
Офлайн
221
Demontager
#usr/bin/python3 from sys import argv from subprocess import call args=sys.args[1:] # этот список - все ваши аргументы командной строки call(['iwconfig']+args, shell=True) # call имеет несколько вариантов запуска, один из них это передать список элементов. shell как правило нужен.
>>> a=[1,'s'] >>> a [1, 's'] >>> str(a) "[1, 's']"
Офлайн
857
Demontager
Вот что я запускаю,
Оригинал скрипт на bash
Офлайн
0
JOHN_16,
Как конкретно тогда переменной присвоить аргумент со списка ? Допустим IFACE, он должен быть равен wlan0
Вот тут как его подставить ?
call(['iwconfig']+args, shell=True)
Офлайн
221
Demontager
вы знаете какие аргументы передаете скрипту - power wlan0 3
Через sys.args получаете в виде списка
['power', 'wlan0', '3']
IFACE=args[1]
tmp=['iwconfig'] tmp.append(IFACE) call(tmp, shell=True)
Офлайн
0
Теперь то, что нужно, спасибо, значит мне нужны были индексы, а не слайсы.
Еще вопрос, как сделать чтобы все аргументы не печатались на экран ? Вот после этого
args = argv[1:] #выводятся ['power', 'wlan0', '3']
iface = call(['iwconfig', IFACE])
Отредактировано Demontager (Июнь 20, 2014 20:38:16)
Офлайн
221
Demontager
Вторая ссылка в выдаче Гугла и Яндекса
DemontagerТо что у вас написано и есть запись в переменную. Не понимаю о каком выводе говорится. Есть функция len() которая вернет длину списка. Зачем вам проверять элементы если вы их сами только что ввели?
Мне нужно их записать в переменную, а потом проверить сколько аргументов всего и какие.
Офлайн
0
Переписал все на python, работает как запланированно, но есть один нюанс, когда нажимаешь CTRL+C, скрипт завершается, но при этом в терминале пропадает указатель курсора.
Может что-то надо изменить/добавить ?
#!/usr/bin/python3 # Automatic txpower increase and/or starting monitor mode from os import getuid, devnull from re import findall from sys import argv from sys import stdout, stdin from time import sleep from subprocess import call, check_output # Console colors W = '\033[0m' # white (normal) R = '\033[31m' # red G = '\033[32m' # green O = '\033[33m' # orange B = '\033[34m' # blue P = '\033[35m' # purple C = '\033[36m' # cyan GR = '\033[37m' # gray args = argv[1:] POWER = '30dbm' DN = open(devnull, 'w') DUMP = '/tmp/dump.cap' def msg(): print(O+"Autmatic txpower increase on RTL8187 chip aka \"Alfa Awus036\"\n"+'and/or starting monitor mode'+W+"\n") print(G+'txpower usage:' +GR+'<power/start/stop/all> <interface> <channel>'+W+"\n") print(G+'Options:'+W) print('power :set ', POWER) print('start :enable monitor mode and airodump-ng') print('stop :disable monitor mode') print('all :set' , POWER, 'enable monitor mode and airodump-ng') print('channel :set desired channel 1-13 (optional)') print("") if len(args) == 2: pass elif len(args) == 3: CH = args[2] else: msg() exit(1) IFACE = args[1] def monif(): MONIF = findall('mon[0-9]', str(check_output(['iwconfig'],stderr=DN))) if MONIF != []: return MONIF[0] else: return '' def check_iface(): iface = call(['iwconfig', IFACE], stdout=DN, stderr=None) if iface != 0: msg() exit(1) def power(): check_iface() xd = str(check_output(['iwconfig', IFACE])) if 'Not-Associated' in xd: call(['ifconfig', IFACE, 'down']) call(['iw', 'reg', 'set', 'BO']) call(['iwconfig', IFACE, 'txpower', POWER]) call(['ifconfig', IFACE, 'up']) z = findall('Tx-Power=[1-9][0-9]', xd) print(z[0],'dBm') else: print (GR+'Disconnect from WiFi-AP first'+W) def start(): check_iface() if not findall('mon[0-9]', monif()) and len(args) == 2: call(['airmon-ng', 'start', IFACE]) sleep(3) call(['airodump-ng', '-w', DUMP, '--ignore-negative-one', monif()]) if not findall('mon[0-9]', monif()) and len(args) == 3: call(['airmon-ng', 'start', IFACE, CH]) sleep(3) call(['airodump-ng', '-w', DUMP, '-c', CH, '--ignore-negative-one', monif()]) else: print(G+'Already has monitor mode on:', monif()+W) def stop(): if monif() == '': print(G+'Monitor mode already stopped'+W) else: call(['airmon-ng', 'stop', IFACE]) x = getuid() if x != 0: print(G+'You have to be'+R+' root ' +G+'to run this script'+W) exit(1) try: if argv[1] == 'power': power() elif argv[1] == 'start': start() elif argv[1] == 'stop': stop() elif argv[1] == 'all': power() sleep(3) start() except KeyboardInterrupt: print(G+' Operation aborted'+W) exit(1)
Офлайн