По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Если PowerShell кажется вам сложным для использования его для повседневных задач, "круто" может быть не тем словом, которое у вас ассоциируете с ним. Но PowerShell является основной частью Exchange, Windows Server и SQL Server, и он обладает огромными возможностями, которые мы все должны понять, принять и использовать, чтобы облегчить и автоматизировать наши текущие дела. Я собираюсь немного поразвлечься и показать вам несколько хитростей, которые определенно пригодятся вам в решении нудных задач на работе. Кроме того, вы будете выглядеть намного круче в глазах ваших коллег, когда сможете решить проблему из командной строки. Согласитесь, это выглядит привлекательно, чем щелкать правой кнопкой мыши и что-то исправлять. Будьте очень осторожны так как это инструмент достойный своего названия (Power – Сила, Shell – Оболочка). PowerShell может легко вызвать массовые изменения конфигурации, как положительные, так и отрицательные, поэтому для безопасности создайте тестовую или лучше всего виртуальную среду для вашего обучения и тестирования. Если вы будете тестировать у себя на компьютере, то создайте точку восстановления системы. Чтобы во время выполнения одной из следующих команд что-то пойдет не так, вы всегда могли восстановить свой компьютер. 10 крутых вещей, которые можно сделать с помощью Windows PowerShell 1: Отчёты о подключённых USB оборудованиях PowerShell даёт возможность работать с Windows Management Instrumentation (WMI). С помощью PowerShell, вы можете сделать WMI - запрос для получения информации о USB - устройствах, которые установлены как на локальной, так и на удаленных системах. gwmi Win32_USBControllerDevice -computername DBSERVER1 |fl Antecedent,Dependent В данной команде будет применен фильтр возврата предшествующих и зависимых полей с компьютера DBSERVER1. Если вы хотите получить полную информацию о USB-устройствах в системе, вы можете убрать оператор | и fl. Это весьма удобный способ для ведения отчётов по серверам, к которым подключены USB - устройства с лицензией. 2: Выполнение ваших любимых задач CMD в PowerShell Да, вы можете перестать использовать командную строку (CMD) и начать выполнять все те же задачи в PowerShell. Это поможет сделать процесс обучение немного проще и помочь вам лучше ознакомиться с интерфейсом. К сожалению, PowerShell невозможно вызвать через окно «выполнить» с помощью трёх букв, подобно CMD. Но вы можете назначить сочетание клавиш для быстрого запуска PowerShell, например, Ctrl + Shift + P. 3: Принудительное завершение процесса в PowerShell Если зависла какая-то служба Windows, вы можете использовать PowerShell для завершения процесса так же, как и через Диспетчер Задач. Например, для закрытия BadThread.exe, вы делаете следующее: get-process BadTh* Результаты выведут нам нужные данные в таком формате: Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 19 5 -321955 -312219 -154 32.76 7583 BadThread После того, как мы идентифицируем Process ID, вы можете принудительно закрыть зависший процесс введя команду: stop-process -id 7583 В тот же момент процесс BadThread будет принудительно остановлен, и вы сможете возобновить попытку запуска службы. Которую можете сделать прямо здесь, в PowerShell. 4: Используйте PSDrive для большего, чем просто просмотр дисков Команда PSDrive позволяет просматривать объекты Windows за пределами традиционных сетей, а также локальных или съемных дисков. Например, чтобы посмотреть диски в разделе верхнего уровня реестра HKEY_LOCAL_MACHINE, вы можете использовать HKLM PSDrive. Чтобы войти в реестр, введите следующую команду: PS C:> cd HKLM: PS HKLM:/> Затем вы переключаетесь в раздел регистра где сможете просмотреть список всех объектов и удалять их, если вам это нужно. 5: Экспорт NTFS разрешений папки – как обычно, так и рекурсивно Управление разрешениями NTFS - это отдельный вопрос, но с помощью PowerShell можно экспортировать список разрешений для аудита доступов или для быстрого анализа списка ACLs для настройки политик безопасности. Это лучший вариант для создания отчётности в формате периодически запускаемого скрипта, или вы можете запускать его по требованию, например, для диагностики конкретной проблемы, связанной с доступами. Например, используя следующую команду: PS E:>Get-Acl N:Data Это даст вам быстрый ответ с результатами ваших прав безопасности по указанному пути N:Data (обратите внимание, что команда не даёт доступ к ресурсу). Данная команда не даст нам общую картину всех доступов всего пути, а только отчёт только об указанном пути. Но если вы хотите включить рекурсию для всего пути, вы можете использовать другую команду. Для того же пути N:Data вы должны использовать командлет Get-ChildItem (cmdlet) в PowerShell в сочетании с командлетом Get-Acl. Рассмотрим следующий пример: PS E:>Get-ChildItem N:Data -recurse | Get-Acl Данная команда будет отображать списки ACL для содержимого всего пути N:Data. Разберём как это работает: командлет Get-ChildItem показывает нам все объекты файловой системы по указанному пути N:Data, а дальше весь список объектов передаётся командлету Get-Acl который предоставляет результаты (списки ACL) для каждого объекта. Если вы хотите заархивировать данные в документ (CSV), вам нужно добавить | export-csv c:filename.csv в конце команды. Кроме этого вы можете извлечь в обычный текстовый файл с помощью добавления командлета > C:filename.txt. Обратите внимание что, когда вы используете параметр -recurse, он будет применяться во всех вложенных файлах и папках. Поэтому будьте внимательны, когда используете его для инвентаризации объёмных томов или же по сети. 6: Отличия PowerShell 2.0 PowerShell 2.0 включает в себя графический интерфейс что является удобной особенностью данной системы. Скрипты PowerShell сохраняются как файлы .ps1, что позволяет нам легко изменять, импортировать и мигрировать сценарии в различные системы. На скриншоте ниже показан пример списка разрешений NTFS в графическом режиме. Примечание для PowerShell 2.0: Перед тем как начать использовать PowerShell 2.0 версию, необходимо настроить политику исполнения с помощью первой версии PowerShell. Введите одну из следующих команд для настройки политики исполнения под ваши нужды: PS C:> Set-ExecutionPolicy Restricted (только проверка) PS C:> Set-ExecutionPolicy AllSigned (наиболее безопасный) PS C:> Set-ExecutionPolicy RemoteSigned (средний уровень безопасности) PS C:> Set-ExecutionPolicy Unrestricted (наименее безопасный) При этом не забудьте, что для PowerShell 2.0 требуется пакет WS-MAN v1.1 и Microsoft.NET Framework 3.0 для графического интерфейса. 7: Горячие клавиши в графическом интерфейсе PowerShell Если вы знакомы со средой Microsoft SQL Query Analyzer, вы по достоинству оцените некоторые из этих сочетаний клавиш. В PowerShell GUI вы можете выбрать одну или несколько строк и выполнить их разом одним нажатием клавиши F5. Кроме того, если вы изменили скрипт, то для экономии времени при редактировании и тестировании доступны привычные Ctrl + S для сохранения, Ctrl + Z для отмены, Ctrl + C для копирования и Ctrl + V для вставки. 8: Фоновый режим для длительных задачи Если вы собираетесь использовать команду, выполнение которого займёт некоторое время, вы можете запустить PowerShell в фоновом режиме до её завершения. Таким образом, можно отправить серию команд на автоматическое выполнение по своему собственному расписанию. Чтобы запустить команду в фоновом режиме необходимо добавить в начало параметр –psjob. А ещё можно узнать о состоянии любого из заданий с помощью следующей команды: PS C:> get-psjob В дополнительном окне вы увидите таблицу с результатами о текущих состояний ваших заданий, дополнительно с уникальными идентификаторами сеанса для каждой задачи отдельно. На скриншоте ниже показана одна проваленная задача. С помощью следующей команды вы можете удалить неудачную задачу, указав ID Session в конце команды: PS C:>remove-psjob 9 9: Вставка временных рамок для вывода команд PowerShell Для задач PowerShell можно ввести временную метку последовательности, чтобы определить продолжительность каждого шага, к тому же можно использовать для настройки журнала вводимых скриптов. Это может оказаться удобным способом для их тестирования. Чтобы вставить метку времени, введите одну из следующих команд в виде одно строки в файле .ps1: КомандыВывод"$(Get-Date -format g) Start logging"20/4/2020 7:45 AM"$(Get-Date -format F) Start logging"Friday, December 23, 2019 8:26:24 AM“$(Get-Date -format o) Start logging"2019-11-17T19:26:24.0479860-06:00 Существует много различных форматов команды Get-Date, но обычно эти три параметра подходят для большинства целей с временными метками. 10: Вывод результатов с задержкой В PowerShell некоторые команды выводят информацию на экран быстрым прокручиванием. Если вы не экспортируете данные в файл, будет невозможно просмотреть их на экране. Давайте ещё раз воспользуемся командлетом Get-ChildItem из предыдущих примеров. Эта команда может выводить множество результатов в зависимости от указанного пути. Для упрощения просмотра выводимых данных на экране мы воспользуемся функцией, которая называется EasyView. Данная функция позволяет нам просмотреть результаты на экране путем отображения одной строки каждые полсекунды. Функция EasyView создаётся следующим образом: function EasyView { process { $_; Start-Sleep -seconds .5}} Чтобы выполнить команду PowerShell с помощью функции EasyView добавьте в конце команды оператор | и название самой функции, как показано ниже: Get-ChildItem N:Data | EasyView Функция EasyView настроена на отображение строк с интервалом в полсекунды. Вы также можете настроить интервал в миллисекундах. Итоги Крутые особенности на этих 10 пунктах не заканчиваются. Есть множества функций PowerShell, которые могут упростить ваши ежедневные задачи. Я надеюсь эта статья привлечёт ваше внимание к командной строке и поможет вам в будущем использовать PowerShell.
img
В данной статье мы постараемся разобрать, как создать, отследить и завершить процесс. Посмотрим следующие задачки: Запуск задачи в активном и фоновом режиме; Заставить задачу выполнятся после выхода из системы; Отслеживать и сортировать активные процессы; Завершать процессы; Постараемся разобрать следующие понятия: Fg (foreground) и bg (background); Nohup (no hang up); Ps - информация об активных процессах; Pstree - дерево процессов; Pgrep - поиск процессов; Pkill - завершение процессов; Top - диспетчер задач; Free - загрузка оперативной памяти; Uptime - время и полнота загрузки; Screen - управление сессиями. Начнем разбирать данную тему с простой команды. Команда sleep man sleep С помощью данной команды мы можем выставить задержку на определенное время, собственно, о чем и написано в справочной статье. Она обычно пригождается, когда необходимо выполнить какой-то скрипт и компьютер должен немного подождать. В частности, мы можем посмотреть следующий пример: sleep 1000 - после данной команды, мы можем вводить в консоль различные символы, они будут появляться на экране но машина и операционная система не будет реагировать. Для того чтобы прервать нажимаем ctrl + c сочетание клавиш. Когда набираем команду, она начинает работать в активном режиме и занимает консоль, и мы соответственно ничего не можем делать. Так как компьютер у нас сейчас много задачный, процессор многозадачный, операционная система многозадачная, мы можем запускать какие-то процессы в фоновом режиме. Для того, чтобы это сделать необходимо набрать команду и в конце поставить знак амперсанда "". Т.е. мы получим следующее sleep 1000. Как, только мы написали команду плюс амперсанд и нажали Enter. Мы видим появился один процесс, и он бежит в фоновом режиме. Есть такая команда jobs, она показывает выполняющиеся задачи, бегущие процессы. И вот мы видим, что у нас есть одна выполняющаяся задача sleep на 1000 секунд. Мы можем еще запустить один sleep 999. Практического эффекта нету, данный пример необходим для наглядности процессов. Появился еще один процесс с отличным от прошлого id. Итого у нас 2 процесса. Теперь представим, что нам необходимо поработать с сервером, но в настоящий момент необходимо обновить, например, репозиторий или пакеты. Мы запускаем процесс обновления с амперсандом и продолжаем работу в обычном режиме, консоль стандартного вывода у нас свободна. Но если нам необходимо вернутся к процессу, который бежит в фоне. Мы можем использовать команду fg и номер процесса, например, 1 или 2. Так же сданной командой мы можем использовать PID, т.е. уникальный идентификатор процесса. Таким образом мы можем видеть, что мы оказались внутри указанного процесса. Для выхода нажимаем ctrl+z. И теперь данная задача будет остановлена. В чем можно убедится, используя команду job. И соответственно, чтобы запустить процесс используем команду bg #процесса. Небольшой итог: Есть команда, показывающая процессы jobs. И команды fg и bg, которые позволяют отправить процессы в фоновый режим и вернуть обратно. Команда PS man ps Согласно описанию, данная команда показывает снапшот текущих процессов. У данной команды очень много ключей, но очень часть данная команда используется в таком виде ps aux. Это означает вывести результат по всем пользователям, все процессы, даже запущенные вне нашего терминала. Это помогает, когда у нас много пользовательская среда, или мы запустили от имени суперпользователя, а сами переключились на текущего. Выглядит данная картинка примерно так: На данной картинке мы можем увидеть от имени какого пользователя процессы выполняются. Это снимок процессов системы, статический снапшот. Он выполнен на тот момент, когда мы подали команду на терминал. Внизу на картинке, можно увидеть наши sleep, значит они на момент ввода команды бежали в фоновом режиме. Кроме того, мы можем запускать данную команду, через pipeline. Например: ps aux | grep sleep Команда grep - отсортировать. И в данном случае мы увидим только два наших процесса. Мы так же можем убить процессы. Процессы убиваются командой kill PID (т.е по его ID). Вот таким образом мы можем завершить процесс. Запустим еще несколько процессов. Теперь мы можем их завершить массово с использованием их сортировки killall sleep например. Мы можем увидеть, что процессы завершились. Данная команда может быть полезно при зависании какого ни будь приложения. Действие данной команды работает, только в пределах пользователя от которого данную команду запустили. Если выполнять данную команду от root. То данная команда завершит процессы у всех пользователей с именем sleep. Если мы создадим процесс, а затем выйдем из терминала (команда exit). Заходя обратно выполняя ps aux мы так же в фоне увидим, что процесс выполняется. А набрав jobs мы не увидим данный процесс. Это происходит потому, что команда jobs показывает только текущие процессы запущенные из данной консоли. Есть такой тонкий нюанс. Если мы запускаем в нашем сеансе процессы, бэкграунд или активный режим, при завершении сессии наши процессы завершаются. Получается следующее, при подключении к серверу, через ssh все наши процессы запущенные при обрыве сессии прервутся. Например, мы запустим процесс обновления системы и завершим нашу сессию процесс обновления прервется. Чтобы у нас процессы не завершались при выходе из системы пользователя, есть команда nohup. Используем ее. nohup sleep 10000 Во-первых, данная команда позволяет заменить стандартный вывод на вывод в файл и во -вторых команда будет выполнятся, пока будет запущенна операционная система. Вне зависимости от наличия пользователя в системе, который запустил. Есть достаточно много нюансов. Можно логинится, разлогиниватся и попадать в тот же сеанс, а в современных Ubuntu уже практически нет необходимости использовать данную команду. Но все же, чтобы гарантированно процесс работал необходимо использовать данную команду. Теперь можно посмотреть команду pstree. Данная команда позволяет посмотреть все процессы в иерархическом виде дерева. На картинке, четко виден родительский процесс systemd, который запускает все остальные процессы. Например sshd - подключение к серверу, которое запускает bash - интерпретатор, далее запускается sudo , su и pstree в самом конце. Есть еще интересные команды pgrep и pkill. Есть просто запустить pgrep то данная команда ничего не выдаст. А если в совокупности с ключами и названием процесса, то данная команда вернет идентификационный номер данного процесса. Мы так же можем добавить ключ -l, то команда вернет и название процессов. У нее много других ключей. Можно, например, команде сказать pgrep -u root -l, т.е показать все процессы пользователя root. Следовательно, команда pkill позволяет убить все эти процессы. Например: pkill sleep. Мы убили все процессы sleep. В реальной же ситуации, мы обычно используем команду top. Данная команда позволяет наблюдать и не только в режиме реального времени за процессами. Посмотрим на данные выводимые данной утилитой. Мы видим, что по умолчанию данная утилита сортирует по загрузке процессора. Мы можем перейти в режим помощи нажав клавишу "h". Ключей и опций у данной утилиты достаточно много. Можно воспользоваться клавишами """", для переключения сортировки, например на сортировку по загруженности оперативной памяти. В данной утилите мы можем сказать, что необходимо завершить той или иной процесс. Практически он аналогичен Диспетчеру задач в операционной системе windows. Для того, чтобы убить процесс нажимаем клавишу "k" и система ждет ввода PID процесса. По умолчанию он берет тот PID, который находится в самом верху. Т.е. по факту самый загружающий процесс систему. Если у нас, что-то висит, то достаточно удобно завершить такой процесс. После ввода PID система запросит, какой сигнал ей необходимо послать по умолчанию сигнал номер 15 или sigterm - т.е. сигнал завершения работы в мягком режиме. Если мы хотим использовать более жесткий вариант отправляем цифру 9, или sigkill. В таком случае операционная система, очень жестко потушит процесс наплевав на зависимые процессы от данного и те процессы от которых зависит данный процесс. Команда uptime man uptime Данная команда показывает, как долго у нас запущена система. Сам по себе эти данные нам ничего не дают. Данная команда. полезна в контексте, если нам передали сервера, и мы видим у них очень большой аптайм, следовательно, сервера не обновлялись и не перезагружались. Данная команда полезна помимо параметра сколько запущенна системаданная команда показывает общую загрузку системы. Это показывают три цифры в выводе данной команды. Там достаточно сложная формула по которой рассчитывается данный параметра, во внимание принимается загрузка ЦП, жестких дисков, оперативной памяти. Первая цифра - это загрузка в минуту, вторая цифра - это загрузка в последние пять минут и третья цифра - это загрузка в последние 15 минут. Исходя из последней картинки, цифры примерно одинаковые, а значит нагрузка равномерна. Если цифры скачут, значит необходимо анализировать, особенно если на сервере есть просадка по производительности. Команда free man free Данная команда показывает свободное и используемое количество памяти в системе. И в данном случае, так же, как и в windows task manager, под памятью понимается оперативная память, так и файл подкачки (windows), раздел подкачки (swap Linux). Swap раздел, это раздел системы используемый для ее нужд если системе не хватает оперативной памяти. Это раздел на жестком диске, который используется в качестве оперативной памяти. Но жесткий диск значительно медленней оперативной памяти, поэтому сначала заполняется оперативная память, а только потом используется раздел подкачки (swap). Команда screen man screen Она есть не во всех дистрибутивах по умолчанию. Эта команда, которая позволяет создать типа оконного менеджера. Это удобно, когда подключаешься по ssh и получаешь, как будто бы несколько окон в пределах одного терминала. Понятно, что современные ssh клиенты позволяют открыть сколько угодно вкладок и работать с ними параллельно. Запускаем screen. Переходим во внутрь screen, запускаем какую-нибудь команду, например, ping ya.ru. Далее нажимаем ctrl+a и затем d и получаем: Первая команда позволяет находится в текущем окне, а вторая клавиша d позволяет свернуть текущий скрин. Теперь можно закрывать терминал, вылогиниваться из консоли. Процесс запущенный в скрине будет работать. Для того, чтобы восстановить окно с процессом достаточно ввести screen -r и мы вернемся к бегущему процессу. Для того, чтобы завершить screen необходимо внутри ввести exit. Если у нас есть потребность запустить несколько окон, то можно это сделать следующим образом: Screen -S yandex ping ya.ru, screen -S rambler ping r0.ru Где yandex и rambler - это просто названия окон (alias) Просмотреть бегущие окна: screen - ls Чтобы вернутся к нужному окну вводим screen -r alias
img
Всем привет! В одной из прошлых статей мы писали об организации офисной IP-DECT телефонной сети на базе решения Grandstream DP715. Так вот на днях к нам приехал его “старший брат” - Grandstream DP750 с трубками DP720. Поэтому сейчас будет небольшой анпакинг. Потом мы настроим базу и трубки, а также зарегистрируем их на IP-АТС Asterisk 13. /p> $dbName_ecom = "to-www_ecom"; $GoodID = "3437215979"; mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); mysql_select_db($dbName_ecom) or die(mysql_error()); $query_ecom = "SELECT `model`, `itemimage1`, `price`, `discount`, `url`, `preview115`, `vendor`, `vendorCode` FROM `items` WHERE itemid = '$GoodID';"; $res_ecom=mysql_query($query_ecom) or die(mysql_error()); $row_ecom = mysql_fetch_array($res_ecom); echo 'Кстати, купить '.$row_ecom['vendor'].' '.$row_ecom['vendorCode'].' можно в нашем магазине Merion Shop по ссылке ниже. С настройкой поможем 🔧 Купить '.$row_ecom['model'].''.number_format(intval($row_ecom['price']) * (1 - (intval($row_ecom['discount'])) / 100), 0, ',', ' ').' ₽'; $dbName = "to-www_02"; mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); mysql_select_db($dbName) or die(mysql_error()); Обзор База DP750 и трубки DP720 поставляются в фирменной коробке от производителя. В отличие от DP715, база DP750 больше не является ещё и зарядным стаканом для трубок. В комплект поставки базы DP750 входит: Сама база DP750; Зарядное устройство на 5В; Ethernet – кабель; Руководство по быстрой установке; Лицензионное соглашение На крышке базы DP750 расположены: Индикатор питания; Индикатор доступности сети; Индикатор регистрации SIP-аккаунта; Индикатор занятости линии. Мигает, если занята хотя бы одна линия; Индикатор радио-сигнала. Мигает, если база готова принимать регистрацию трубки Мы, как назло, забыли сфотографировать базу включённой, чтобы продемонстрировать индикацию :( На боковой панели располагаются: Разъём для подключения блока питания; Кнопка сброса к заводским настройкам; Физический интерфейс для Fast Ethernet; И физическая кнопка для ввода базы в режим поиска трубки. Запомните её, в процессе регистрации трубок на базе она нам очень понадобится и не раз :) Используется также для “пинга” зарегистрированных трубок. В комплект поставки трубок DP720 входит: Сама трубка DP720; 2 батарейки типа ААА (аккумуляторы); Задняя крышка отсека для батареек и зажим для крепления на поясе; Зарядный стакан; Блок питания на 5В; Руководство Вот так это выглядит в собранном состоянии: Настройка Итак, перейдём к настройке. Сначала выясним IP-адрес базы, который она по умолчанию получит по DHCP. Для этого берём одну трубку, нажимаем на кнопку слева от центральной, далее Settings → Registration начнётся поиск базы. После этого на базе зажимаем на 15 секунд ту самую кнопку для ввода базы в режим поиска, пока индикатор радио сигнала не начнёт мигать. Через некоторое время трубка зарегистрируется на базе. У неё пока может не быть SIP-аккаунта, а база пока может не знать об IP-АТС. Теперь мы можем узнать IP-адрес базы. Берём трубку, далее Status и стрелочками листаем до IP-адреса. После чего вбиваем его в адресную строку браузера: Логин и пароль по умолчанию admin/admin Первое, на что обращаешь внимание – это полностью переработанный дизайн web-интерфейса по сравнению с DP715. На вкладке STATUS пока может быть пусто. Настроим SIP-профиль для нашей базы, т.е укажем как найти IP-АТС. Для этого заходим во вкладку PROFILE → General Settings и в поле SIP Server указываем адрес нашей IP-АТС и порт, на который она принимает регистрации. На данном этапе, рекомендуем позаботиться о том, чтобы на Вашей IP-АТС уже был заведён внутренний номер для трубок, которые Вы хотите зарегистрировать. Как создать внутренний номер на FreePBX 13, можно почитать в нашей статье. Если внутренние номера готовы, то переходим на вкладку DECT, далее SIP Account Settings и заполняем в соответствии с настройками внутреннего номера, который мы завели на IP-АТС. В нашем случае, это номер 124 – User1. На забываем нажимать Save and Apply Теперь берём трубку и вводим её в режим регистрации - нажимаем на кнопку слева от центральной, далее Settings → Registration начнётся поиск базы. Подходим к базе и зажимаем кнопку для ввода в режим регистрации. Напомним, зажимать нужно в течение 15 секунд, пока индикатор не начнёт мигать. Через какое-то время, трубка зарегистрируется на базе и вы увидите имя внутреннего номера на дисплее. Если регистрируется подряд несколько трубок, то может потребоваться перезагрузить базу. Проверить, что трубка успешно зарегистрировалась, теперь можно на вкладке STATUS
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59