Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2014 20:45:23

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Не могу сообразить как можно со списка, в котором находятся и 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



И второй вопрос, как убрать вывод на экран вывод переменныx ?
# К примеру args = argv[1:] при запуске скрипта пишет ['power', 'wlan0', '3'], и также остальные.

Отредактировано Demontager (Июнь 18, 2014 20:56:26)

Офлайн

#2 Июнь 18, 2014 22:34:26

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Переписывать лучше по сути действий.
Никаких кавычек и скобок в переменных нет, это способ их преобразования в строку добавляет. Зачем вы все аргументы в строку преобразовали? Их надо напрямую использовать.
А вы взяли нормальный список, который могли запихнуть в call преобразовали в строку, а потом безуспешно пытаетесь из этой строки опять сделать исходный список.

Если очень хочется сделайте строку целиком методом строки format, проверьте ее при помощи print и вызывайте

you_string="some_conf {arg1}".format(arg1="a")
subprocess.check_call(you_string, shell=True)
check_call лучше, поскольку ошибки будут обрабатываться ближе к тому как это принято в питоне.
global у вас не имеет никакого смысла.

второй вопрос, как убрать вывод на экран вывод переменныx ?

У меня этот код ничего не пишет на консоль…. Надо смотреть как вы его запускаете.



Отредактировано doza_and (Июнь 18, 2014 22:48:13)

Офлайн

#3 Июнь 18, 2014 23:42:52

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Я и спрашиваю, потому что не знаю как правильно, это моя первая проба перенести свой же написанный bash на python
Вот что я запускаю, https://gist.github.com/Demontager/340cbb413aecba500a6c
Оригинал скрипт на bash https://github.com/Demontager/txpower/blob/master/txpower.sh

Ок, и как тогда напрямую аргументы использовать?

Офлайн

#4 Июнь 19, 2014 06:53:20

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Demontager

#usr/bin/python3
from sys import argv
from subprocess import call
args=sys.args[1:] # этот список - все ваши аргументы командной строки
call(['iwconfig']+args, shell=True) # call имеет несколько вариантов запуска, один из них это передать список элементов. shell как правило нужен.

Ваша ошибка была в том что вы передали список в котором один их элементов был также списком. Внутри себя subprocess перевел этот список в строку, а по правилам он сделает так:
>>> a=[1,'s']
>>> a
[1, 's']
>>> str(a)
"[1, 's']"
Т.е. любой объект Python может представить в printable виде. Поэтому на вход iwconfig ушло не то что надо.
Решение - это сформировать новый список из необходимых элементов и передать его в call.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Июнь 19, 2014 12:04:24

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Demontager
Вот что я запускаю,
Оригинал скрипт на bash

Пособие МГУшное http://www.stolyarov.info/books/codestyle
Прочитай, там про отступы и всё остальное.



Офлайн

#6 Июнь 19, 2014 22:43:45

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

JOHN_16,
Как конкретно тогда переменной присвоить аргумент со списка ? Допустим IFACE, он должен быть равен wlan0
Вот тут как его подставить ?

call(['iwconfig']+args, shell=True)
py.user.next,
Благодарю, скачал, на досуге почитаю.

Офлайн

#7 Июнь 19, 2014 23:58:15

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Demontager
вы знаете какие аргументы передаете скрипту - power wlan0 3
Через sys.args получаете в виде списка

['power', 'wlan0', '3']
Список, это в общем то почти массив, поэтому обращаться к нему надо через индексы. Вы знаете что значение wlan0 было по списку вторым, значит присваиваем нужное значение переменной
IFACE=args[1]
Теперь, если вы хотите подставить все это в call, то нужно сформировать список значений, которые будут переданы в call, покажу прям пошагово
tmp=['iwconfig']
tmp.append(IFACE)
call(tmp, shell=True)
в результате выполнится команда iwconfig wlan0 так, как если бы вы ее выполняли в консоли.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#8 Июнь 20, 2014 20:36:07

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Теперь то, что нужно, спасибо, значит мне нужны были индексы, а не слайсы.
Еще вопрос, как сделать чтобы все аргументы не печатались на экран ? Вот после этого

args = argv[1:] #выводятся ['power', 'wlan0', '3']
Мне нужно их записать в переменную, а потом проверить сколько аргументов всего и какие.

И как еще этот вызов запретить вывод на экран ?
iface = call(['iwconfig', IFACE])
т.е. мне нужно получить код возрата, записать в iface, но на экран это выводить не нужно.
В bash &>/dev/null - stdout stderr в корзину
1>/dev/null - stdout
2>/dev/null - stderr

Отредактировано Demontager (Июнь 20, 2014 20:38:16)

Офлайн

#9 Июнь 21, 2014 01:23:30

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Demontager
Вторая ссылка в выдаче Гугла и Яндекса

Demontager
Мне нужно их записать в переменную, а потом проверить сколько аргументов всего и какие.
То что у вас написано и есть запись в переменную. Не понимаю о каком выводе говорится. Есть функция len() которая вернет длину списка. Зачем вам проверять элементы если вы их сами только что ввели?

P.S. а вообще надоело разжевывать то что есть в любой книжке и тысячи страниц в интернете. Нежелание людей заниматься самообразованием ….



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#10 Июнь 29, 2014 17:16:42

Demontager
Зарегистрирован: 2014-05-16
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить значения со списка без кавычек

Переписал все на 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version