Войти

Показать полную графическую версию : Сохранение параметра в файл и обратное действие


Страниц : [1] 2

Abricosio
29-01-2012, 00:15
Добрый вечер!
Есть вопрос, буду благодарен за любую помощь.
Есть программа по смене MAC адреса, называется MacShift
mac адрес меняется на произвольный (random) через bat файл такого содержания:
start c:/macshift/macshift.exe -i "LocalNet" -r
где LocalNet - соответственно название сети, и -r - параметр произвольной смены МАКа
Возможно ли дописать данный бат файл, чтобы он сохранял каждый раз строчку такого содержания:
mac=xxxxxxxxxxxx (соответственно измененный мак адрес)
в файл c:/mac.txt

И второй вопрос, обратный к первому
Какой скрипт нужно написать, чтобы он(скрипт) брал строчку из файла c:/mac.txt содержания
mac=xxxxxxxxxxxx
и xxxxxxxxxxxx вставлял в скрипт как
start c:/macshift/macshift.exe -i "LocalNet" -xxxxxxxxxxxx

Спасибо ОГРОМНОЕ заранее!

XXXp
30-01-2012, 01:00
Как сделать не знаю, но предполагаю, что МАК можно после смены много откуда брать и сохранять

Abricosio
30-01-2012, 18:50
Более понятно описал необходимый скрипт!
За помощь в создании компенсирую финансами потраченное время (чтобы и вам было не накладно)

Имеется программа macshift (по запросу могу выслать конечно)
Смена произвольного Mac адреса в ней осуществляется через бат файл с содержанием:
start c:/macshift/macshift.exe -i "LocalNet" -r
где LocalNet - название локальной сети -r - проивольное изменение МАК адреса
Соответственно, команда
start c:/macshift/macshift.exe -i "LocalNet" -xxxxxxxxxxxx
Меняет МАК на -xxxxxxxxxxxx
Ну и, соответственно:
Необходимо сделать следующий bat файл:
Загружается c:/config.ini в нём находится строчка mac=
Если строчка ПУСТАЯ, т.е. после = ничего нет (или вообще строчки нет, если так проще)
То осуществляет команду start c:/macshift/macshift.exe -i "LocalNet" -r (произвольно меняем мак)
и сохраняем получившийся mac в файл c:/config.ini в виде mac=новый мак (без тире и двоеточия)
Если строчка НЕ ПУСТАЯ, т.е. mac=zzzzzzzzzzzz
То осуществляем команду start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz

Abricosio
31-01-2012, 22:29
Неужели это нельзя реализовать?
Напоминаю, что постараюсь компенсировать потраченное время на создание скрипта

root221
01-02-2012, 01:37
О боже как всё сложно.

честно говоря, я ничего не понял((

root221
01-02-2012, 02:16
свой macshift который будет использоваться тобой, скинь в тему, что бы быстрей тебе помогли.

Abricosio
01-02-2012, 16:06
Вот он!

Abricosio
01-02-2012, 17:09
У нас есть файл config.ini (его содержимое будет меняться естественно), изначально в нём нет строчки mac=xxx, т.е. он используется впервые для macshift
В этом случае (если нет mac=)
Нам нужно выполнить команду start c:/macshift/macshift.exe -i "LocalNet" -r
и записать в этот файл (config.ini) значение нового mac адреса в виде mac=новый мак адрес
Если в файле config.ini уже присутствует строчка mac=zzz
необходимо выполнить команду start c:/macshift/macshift.exe -i "LocalNet" -zzz
и ничего больше никуда не записывать.

Либо другой вариант того же, только гораздо более простой (для меня в том числе)
Имеем два скрипта:
Один записывает случайный mac в каждый из нескольких десятков-сотен файлов c:/configs/*.ini строчкой в виде mac=xxxxxxxxxxxx, причём запись случайного мака необходимо произвести по всем правилам, используемым в macshift (грубо команда -r для проги)
Второй скрипт просто бы брал из файла c:/config.ini строчку mac=zzzzzzzzzzzz и запускал бы команду
start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz

Anonymоus
02-02-2012, 17:54
Abricosio, вот вам скрипт, программа macshift должна лежать в одной директории с ним (или в любом месте, которое прописано в PATH), местоположение ini-файла для записи укажете сами. Если его не существует по указанному пути, он создается.




@Echo Off
SetLocal EnableDelayedExpansion
:: Проверяем, существует ли файл, и есть ли в нем нужный нам ключ (mac)
Set CfgFile=config.ini

If Not Exist "%CfgFile%" Echo mac=>"%CfgFile%"
type "%CfgFile%"|Find /I "mac=">nul||Echo mac=>>"%CfgFile%"
:: Проверяем ini-файл на наличие значения mac
Call :ReadKeyValue
If Defined mac (
Echo MAC найден: [%mac%]
:: Если найдено - запускаем macshift со значением из файла
call macshift -i "LocalNet" %Mac%>nul
) Else (
:: Если не найдено - запускаем с ключом -r, парсим вывод и сохраняем новый mac в файл
For /F "tokens=7 skip=1" %%A In ('macshift -i "LocalNet" -r^|find "MAC"') Do (
Set mac=%%A
Set mac=!mac:~,-3!
)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Pause
Exit




rem ====== Функции для работы с ini
:ReadKeyValue
If Not Exist %CfgFile% (Exit 1)
Set i=0
For /F "tokens=1,2 delims== usebackq" %%A In ("%CfgFile%") Do (
Set /A i+=1
Set %%A=%%B
Set CfgKey!i!=%%A
Set CfgStrings=!i!
)
Exit /B

:WriteKeyValue
If Exist "%CfgFile%" (Del "%CfgFile%")
For /L %%S In (1,1,%CfgStrings%) Do (
Call :SingleLine "!CfgKey%%S!"
)
Exit /B
:SingleLine
Echo %~1=!%~1!>>"%CfgFile%"
Exit /B
rem ===============================

Да, вот ещё: я саму программу macshift не стал запускать у себя, скрипт набросал без отладки, так что вы проверьте - всё ли правильно работает?

root221
02-02-2012, 18:06
Думаю не совсем всё как надо... По моему надо обратное действие ещё...
что бы мак в дальнейшем брался из конфига, если он там есть то уже выполнять команду

mac=Тут значение уже вместо -r

Второй скрипт просто бы брал из файла c:/config.ini строчку mac=zzzzzzzzzzzz и запускал бы команду
start c:/macshift/macshift.exe -i "LocalNet" -zzzzzzzzzzzz »

Anonymоus
02-02-2012, 18:15
По моему надо обратное действие ещё »

root221, посмотрите внимательнее на мой скрипт. Там все сделано именно так, как описано в первом посте. Обьясню логику его работы поподробнее:
Перво-наперво, проверяем, есть ли вообще файл, заданный как конфигурационный. Если нету - создаем. Если внутри него нету ключа mac - дописываем пустое. Далее, считываем key-value значения из него с помощью функции :ReadKeyValue, при этом создаются переменные с нужными значениями. После проверяем, определена ли переменная mac - если определена, то запускаем macshift с этим mac-адресом. Если не определена - запускаем macshift, но с ключом -r, он устанавливает случайный мак-адрес, выбираем его знаачение из stdout с помощью конвеера и find, назначаем новое значение переменной mac и записываем в файл с помощью функции :WriteKeyValue

root221
02-02-2012, 18:44
всё понял почему не работал) Потому что автор не правильно написал... МАК вызывается


не так

-zzzzzzzzz

а вот так

zzzzzzzz


Автору)

Что бы не запустался

это
call macshift -i "LocalNet" -%Mac%

заменить надо на

call macshift -i "LocalNet" %Mac%

Anonymоus
02-02-2012, 19:11
root221, понял, спасибо. Я просто по синтаксису, предложенному автором написал, саму утилиту у себя не запускал из соображений безопасности, а виртуалку поднимать лень было. Исправил в скрипте.

Abricosio
03-02-2012, 00:11
Вроде все работает! Спасибо! Как только отключить диалог "нажмите кнопку для продолжения"?
И пришлите пожалуйста в личку вариант перевода Вам моей благодарности :)

root221
03-02-2012, 06:30
)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Pause
Exit


Замени на

)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Exit

Abricosio
03-02-2012, 12:45
2Anonymоus
Спасибо большое, через личные сообщения не получается писать, говорит что у вас переполнен ящик)

Anonymоus
03-02-2012, 12:48
Да, так и есть, только что почистил. В последнее время часто пишут. Вам тоже спасибо, если понадобится помощь со скриптами - обращайтесь, помогу по мере возможностей.

Abricosio
14-02-2012, 01:57
Вылезла маленькая неувязочка в скрипте, он добавляет знак равенства "="
ко всем параметрам в файле ini в квадратных скобках, т.е.
было [blabla]
стало после работы скрипта
[blabla]=
из-за чего теперь не работает другая часть конфига. Не подскажите как решить данную проблему?) Спасибо

Anonymоus
14-02-2012, 03:07
Abricosio, поправил, теперь больше такого не будет. Вы просто не уточнили с самого начала, что в конфиге могут быть секции ini.


@Echo Off
SetLocal EnableDelayedExpansion
:: Проверяем, существует ли файл, и есть ли в нем нужный нам ключ (mac)
Set CfgFile=config.ini

If Not Exist "%CfgFile%" Echo mac=>"%CfgFile%"
type "%CfgFile%"|Find /I "mac=">nul||Echo mac=>>"%CfgFile%"
:: Проверяем ini-файл на наличие значения mac
Call :ReadKeyValue
If Defined mac (
Echo MAC найден: [%mac%]
:: Если найдено - запускаем macshift со значением из файла
call macshift -i "LocalNet" %Mac%>nul
) Else (
:: Если не найдено - запускаем с ключом -r, парсим вывод и сохраняем новый mac в файл
For /F "tokens=7 skip=1" %%A In ('macshift -i "LocalNet" -r^|find "MAC"') Do (
Set mac=%%A
Set mac=!mac:~,-3!
)
Echo MAC не найден, сгенерирован новый: [!mac!]
Call :WriteKeyValue
)
Exit




rem ====== Функции для работы с ini
:ReadKeyValue
If Not Exist %CfgFile% (Exit 1)
Set i=0
For /F "tokens=1,2 delims== usebackq" %%A In ("%CfgFile%") Do (
Set /A i+=1
Set %%A=%%B
Set CfgKey!i!=%%A
Set CfgStrings=!i!
)
Exit /B

:WriteKeyValue
If Exist "%CfgFile%" (Del "%CfgFile%")
For /L %%S In (1,1,%CfgStrings%) Do (
Call :SingleLine "!CfgKey%%S!"
)
Exit /B
:SingleLine
If "%~1"=="" Exit /B
If Not "!%~1!"=="" (Echo %~1=!%~1!>>"%CfgFile%") Else (Echo %~1>>"%CfgFile%")
Exit /B
rem ===============================

Abricosio
14-02-2012, 16:27
Спасибо большое!




© OSzone.net 2001-2012