Pull to refresh

Comments 54

Я все просил Яндекс... Добавить такой функционал в свою колонку

В итоге купли плату , для включения и выключения (((

Здравствуйте! Я из Яндекса. Мы всегда прислушиваемся к пожеланиям наших пользователей. Постараемся удивить вас в будущем!

Давным-давно писал о том же и даже ответ был похож, но ничего не сделано. Подождал и на коленке набросал приложение для ios и mac, кому нужно, можно бесплатно скачать в аппсторе. При желании можно сделать включение голосом через Сири, любое устройство, хбокс, телевизор, компьютер(естественно при такой возможности на устройстве)

П.с. Минусы не мои

Года 2 назад писал в поддержку, чтобы в яндекс.браузере можно было автоматически вводить сохраненные пароли на самоподписанных хттпс-сайтах и вот, вуаля - месяц назад наконец стало можно. Яндекс для терпеливых. Но окошко с кнопкой "сделать исключение для этого сайта" вылезает после каждого перезапуска браузера :(

Здравствуйте! Наши разработчики действительно стараются реализовать самые полезные и популярные предложения. Однако любые изменения мы стараемся вводить постепенно, так как для их реализации требуются значительные ресурсы.

Уточните, пожалуйста, добавлен ли самоподписанный сертификат в «Доверенные корневые центры сертификации»? Если нет, то вам понадобится:

  1. Перейти к самоподписанному сертификату через замок в адресной строке → Подробнее → Данные сертификата.

  2. Выбрать «Копировать в файл».

  3. Оставить опцию по умолчанию.

  4. Выбрать директорию и сохранить сертификат → открыть его в этой директории двойным нажатием клавиши → в окне выбрать «Установить сертификат».

  5. Выбрать тип установки.

  6. Выбрать «Доверенные корневые центры сертификации».

  7. Завершить установку.

В некоторых случаях понадобится также прописать DNS-имя сайта в поле SAN (дополнительное имя субъекта) сертификата.

Немного костыльно, но это вполне реализуемо и в текущей Алисе. Тут хорошо описан процесс. Даём доступ к порту ПК, куда будет приходить WoL пакет, из интернета; выбираем любой онлайн сервис, который умеет посылать WoL пакеты после GET запроса с параметрами, а не каждый раз вводить данные в форму, проверяем его (у меня пакет дошёл только от 1 из 3 сервисов); создаём виртуальное устройство у Домовёнка Кузи, создаем ему триггер на включение из Алисы, куда вставляем ссылку с предыдущего шага; связываем Кузю с Алисой; profit.

Я когда-то получил тот же результат, только через малинку, которая с реверс-туннелем подключалась к впс, куда был натравлен Кузя. "Алиса, включи/выключи компьютер" -> Алиса дёргает Кузю, Кузя дёргает эндпоинт на впс, который летит на малинку, а малинка уже либо шлёт вол-запрос, либо прям ссшится на домашний комп и делает там systemctl suspend.

Любоптыно было бы посмотреть на само приложение, как через него реализовано выключение.

В тексте вроде всё описано. Запускаете вышеприведённый код на ПК, скачиваете любое приложение, которое умеет отправлять WoL-пакеты, отправляете пакет на адрес ПК с запущенным кодом и если всё сделано верно, то будет инициирована команда завершения работы

ставить агенты на ПК мне очень не хотелось

добавить данный скрипт в автозагрузку

Интрига.

Не хотелось ставить сторонние агенты с кучей функций, которые мне не нужны. Хотя так, конечно, было бы быстрее. Но захотелось сделать по-своему (тег про троллейбус из хлеба не просто так указан).

Плюс может кому-нибудь такое решение пригодится

сторонние агенты с кучей функций

а вот питон, что с ним?)

А питон у меня уже был установленный, я им время от времени пользуюсь. Да и он всё-таки много у кого стоит (из-за похожих причин), в отличие от различных агентов

Можно было сначала поставить агента, а потом уже сказать себе, что он уже был установленный. Ну и время от времени им пользоваться.

@ABy, @HydrogenOxyde

PoC. Powershell one-liner, без стороннего ПО в системе:

powershell -NoProfile -Command $addr=New-Object System.Net.IPEndPoint([IPAddress]::Any,9);$udp=New-Object System.Net.Sockets.UdpClient(9);while($true){$content=$udp.Receive([ref]$addr);if(($content[0]-eq$content[1]-eq$content[2]-eq$content[3]-eq$content[4]-eq$content[5]-eq0xFF)-and($content.Length-eq102)){Write-Host Got WOL packet!;shutdown /s /t 3600;break;}else{Write-Host Got non-WOL packet!;}}

Или так:

powershell -NoProfile -Command (Add-Type -TypeDefinition 'using System;using System.Net;using System.Net.Sockets;using System.Diagnostics;public static class Program{public static void Main(){var addr=new IPEndPoint(IPAddress.Any,9);var udp=new UdpClient(9);while(true){var content=udp.Receive(ref addr);if ((content[0]==0xFF^&^&content[1]==0xFF^&^&content[2]==0xFF^&^&content[3]==0xFF^&^&content[4]==0xFF^&^&content[5]==0xFF)^&^&(content.Length==102)){Console.WriteLine("""Got WOL packet!""");Process.Start("""cmd.exe""","""/c shutdown /s /t 3600""");break;}else{Console.WriteLine("""Got non-WOL packet!""");}}}}' -PassThru)::Main();

Написан за десять минут 16-летним сыном. Можно просто указать команду в планировщике.

Оно же, более читаемо, в виде bat-файлов:

Вариант 1
@echo off
powershell -NoProfile -Command ^
  $addr = New-Object System.Net.IPEndPoint([IPAddress]::Any,9); ^
  $udp = New-Object System.Net.Sockets.UdpClient(9); ^
  while ($true) { ^
    $content = $udp.Receive([ref]$addr); ^
    if (($content[0] -eq $content[1] -eq $content[2] -eq $content[3] -eq $content[4] -eq $content[5] -eq 0xFF) -and ($content.Length -eq 102)) { ^
      Write-Host Got WOL packet!; ^
      shutdown /s /t 3600; ^
      break; ^
    } else { ^
      Write-Host Got non-WOL packet!; ^
    } ^
  }
pause

Вариант 2
@echo off
powershell -NoProfile -Command ^
  (Add-Type -TypeDefinition ' ^
  using System; ^
  using System.Net; ^
  using System.Net.Sockets; ^
  using System.Diagnostics; ^
  public static class Program { ^
    public static void Main() { ^
      var addr = new IPEndPoint(IPAddress.Any, 9); ^
      var udp = new UdpClient(9); ^
      while(true) { ^
        var content = udp.Receive(ref addr); ^
        if ((content[0]==0xFF^&^&content[1]==0xFF^&^&content[2]==0xFF^&^&content[3]==0xFF^&^&content[4]==0xFF^&^&content[5]==0xFF)^&^&(content.Length==102)) {^
          Console.WriteLine("""Got WOL packet!"""); ^
          Process.Start("""cmd.exe""","""/c shutdown /s /t 3600"""); ^
          break; ^
        } else { ^
          Console.WriteLine("""Got non-WOL packet!"""); ^
        } ^
      } ^
    } ^
  }' -PassThru)::Main();
pause

Ну хорошо. Как будто я утверждал, что Питон - это единственное средство реализации данного алгоритма. Просто лично мне на Питоне было удобнее всего. И непонятно для чего в вашем комментарии указание времени разработки и возраста.

Ну и моё решение также будет работать в линуксах.

Why so serious? ¯\_(ツ)_/¯

Это всего лишь сведение к минимуму в парадигме

сторонние агенты с кучей функций, которые мне не нужны

Питон так питон, никто не пытается с вами спорить, или что-то доказывать.

непонятно для чего в вашем комментарии указание времени разработки и возраста.

Всего лишь указание что код не написан сеньором со 100500 опыта, поэтому если в нем есть недочеты, на них можно указать без обязательного предварительного КГ-АМ.

Ну и моё решение также будет работать в линуксах

Да пожалуйста. Еще раз, никто не пытается каким-то образом сказать, что ваше решение как-то хуже. Просто ABy задал вопрос про "без скриптов", и вы указали про сторонних агентов с кучей функций. Это всего лишь вариант "из коробки" без доп. ПО для того же Win10. Откуда столько агрессии?

Никакой агрессии. Просто возникло впечатление, что вы хотите похвастаться. Если такого не было, то прошу прощения, не хотел, чтобы мой комментарий выглядел агрессивно

А они разве проверяют мак-адрес?

Что-то не заработал ваш вариант, ошибку выдаёт на win11

Невозможно вызвать метод для выражения со значением NULL.
строка:3 знак:14
+ while($true){$content=$udp.Receive([ref]$addr);

А нельзя такое поведение через планировщик задач добавить в windows?

У меня так и настроено. Создан powershell-файл, в котором прописана активация venv и запуск python-скрипта. Сам запуск powershell-файла настроен в планировщике при запуске ПК.

Я имею в виду вообще без скриптов. Добавить в планировщик событие - получение wol пакета и действие - завершение работы. Или так не получится?

Предполагаю, что нет. Всё-таки должна же быть какая-то программа, которая будет слушать определённый порт, на определённом интерфейсе и подтверждать, что пришедший пакет - это WoL-пакет. И так как WoL по своей сути предназначен именно для включения, то не думаю, что в Windows вообще есть такие встроенные обработчики, т.к. по идее это задача мат. платы

Как вариант, можно включить встроенный SSH-сервер, а на телефоне использовать что-то типа Termius, который позволяет сделать скрипт "выполнить такие-то команды при заходе на этот сервер" (тушить машину).

https://support.termius.com/hc/en-us/articles/4402057170457-Snippets#runonstart

Либо можно из планировщика задач попробовать ловить событие в журнале OpenSSH.

Это если задаться целью по-максимуму обойтись тем, что есть в Windows "из коробки".

Планировщик может ловить определенные события в журналах, но, вроде бы, там не фиксируется приход WOL-пакета.

Когда искал решение, то на этот репозиторий не натыкался

Слегка режет глаз "return 1" и "if is_wol_packet == 1:"
Почему не вернуть просто True/False и сделать "if is_wol_packet:"?
Это же питон, не C...
Да и с единицей тоже будет работать "if is_wol_packet:"

Вы правы, можно было бы и так. В тексте так и написано

Конечно, вышеприведённый код не идеален. Его можно написать лучше

И у вас никогда не бросится исключение (строка с raise). Точнее бросится, но не то, которое вы ожидаете: TypeError: exceptions must derive from BaseException.

Можно дергать кнопку еспшкой и никакие агенты и софт не нужный, хоть через браузер открывай.

Но wol же не включает, а только из спящего режима выводит. У меня не получалось включать выключенный ПК, только из stand-by.

Я нажимаю "Завершение работы", ПК выключается, никакие состояния не сохраняются, включение идёт с логотипа мат. платы. Я так понимаю это не спящий режим. Хотя возможно я чего-то не знаю.

И из такого состояния без проблем включается через WoL. Если у вас включить не получается после завершения работы, то попробуйте полазить по настройкам адаптера и биоса

Я правильно понимаю что при попытке включить уже включенный он у вас выключится?

В этом и смысл, как отправить wake on lan для включения переизобретать не нужно.

Про это никто и не говорит

Зависит от железа (настроек BIOS/UEFI в том числе). Вообще, WoL может быть полной заменой кнопки питания, т.е. именно включать компьютер; хотя это может быть неочевидно из названия "wake on LAN"

Интел и АМД по разному эту фичу обрабатывают вроде бы.

В таком случае необходимо будет иметь разные приложения для включения и выключения

Термукс и два скрипта.

Термуксом не пользовался, но если он умеет отправлять пакеты по UDP, тогда да, тоже можно реализовать похожее решение. Если только TCP, тогда WoL работать не будет.

Если не нравится, что одна и та же кнопка отправляющего приложения и включает, и выключает компьютер, то в коде меняем символы MAC адреса в обратном порядке и в отправляющее приложение забиваем ещё один тот же MAC, но в обратном порядке. Это работает, т.к. пакет broadcast-овый.

А нельзя любой? Все нули например. Почему именно зеркальный?

Можно какой угодно, главное, чтобы обработчик это понимал

Можно настроить ssh сервер (который встроен в Windows начиная с какого-то билда 10-ки, включается в компонентах) и выключать стандартной командой по ssh, при помощи psshutdown можно так же отправлять в сон (psshutdown -d -t 1 && exit).

Это так же можно проворачивать из WAN, использую роутер в качестве SSH-шлюза для подключения к ПК.

SSH, если не ошибаюсь, не умеет в UDP, следовательно, придётся иметь два приложения для включения и выключения. Хотя если использовать какое-нибудь приложение, которое умеет и по SSH соединяться и произвольные UDP-пакеты отправлять, тогда будет работать

Зачем мудрить что-то через powershell, если можно через py to exe скомпилировать и закинуть в папку автозагрузки.

Sign up to leave a comment.

Articles