Комментарии 54
Я все просил Яндекс... Добавить такой функционал в свою колонку
В итоге купли плату , для включения и выключения (((
Здравствуйте! Я из Яндекса. Мы всегда прислушиваемся к пожеланиям наших пользователей. Постараемся удивить вас в будущем!
Давным-давно писал о том же и даже ответ был похож, но ничего не сделано. Подождал и на коленке набросал приложение для ios и mac, кому нужно, можно бесплатно скачать в аппсторе. При желании можно сделать включение голосом через Сири, любое устройство, хбокс, телевизор, компьютер(естественно при такой возможности на устройстве)
П.с. Минусы не мои
Года 2 назад писал в поддержку, чтобы в яндекс.браузере можно было автоматически вводить сохраненные пароли на самоподписанных хттпс-сайтах и вот, вуаля - месяц назад наконец стало можно. Яндекс для терпеливых. Но окошко с кнопкой "сделать исключение для этого сайта" вылезает после каждого перезапуска браузера :(
Здравствуйте! Наши разработчики действительно стараются реализовать самые полезные и популярные предложения. Однако любые изменения мы стараемся вводить постепенно, так как для их реализации требуются значительные ресурсы.
Уточните, пожалуйста, добавлен ли самоподписанный сертификат в «Доверенные корневые центры сертификации»? Если нет, то вам понадобится:
Перейти к самоподписанному сертификату через замок в адресной строке → Подробнее → Данные сертификата.
Выбрать «Копировать в файл».
Оставить опцию по умолчанию.
Выбрать директорию и сохранить сертификат → открыть его в этой директории двойным нажатием клавиши → в окне выбрать «Установить сертификат».
Выбрать тип установки.
Выбрать «Доверенные корневые центры сертификации».
Завершить установку.
В некоторых случаях понадобится также прописать DNS-имя сайта в поле SAN (дополнительное имя субъекта) сертификата.
в голос
Немного костыльно, но это вполне реализуемо и в текущей Алисе. Тут хорошо описан процесс. Даём доступ к порту ПК, куда будет приходить WoL пакет, из интернета; выбираем любой онлайн сервис, который умеет посылать WoL пакеты после GET запроса с параметрами, а не каждый раз вводить данные в форму, проверяем его (у меня пакет дошёл только от 1 из 3 сервисов); создаём виртуальное устройство у Домовёнка Кузи, создаем ему триггер на включение из Алисы, куда вставляем ссылку с предыдущего шага; связываем Кузю с Алисой; profit.
Я когда-то получил тот же результат, только через малинку, которая с реверс-туннелем подключалась к впс, куда был натравлен Кузя. "Алиса, включи/выключи компьютер" -> Алиса дёргает Кузю, Кузя дёргает эндпоинт на впс, который летит на малинку, а малинка уже либо шлёт вол-запрос, либо прям ссшится на домашний комп и делает там systemctl suspend.
Любоптыно было бы посмотреть на само приложение, как через него реализовано выключение.
ставить агенты на ПК мне очень не хотелось
добавить данный скрипт в автозагрузку
Интрига.
Не хотелось ставить сторонние агенты с кучей функций, которые мне не нужны. Хотя так, конечно, было бы быстрее. Но захотелось сделать по-своему (тег про троллейбус из хлеба не просто так указан).
Плюс может кому-нибудь такое решение пригодится
сторонние агенты с кучей функций
а вот питон, что с ним?)
@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-пакета.
https://github.com/SR-G/sleep-on-lan
Было аналогичное желание, решение с гитхаба работает без нареканий
Слегка режет глаз "return 1" и "if is_wol_packet == 1:"
Почему не вернуть просто True/False и сделать "if is_wol_packet:"?
Это же питон, не C...
Да и с единицей тоже будет работать "if is_wol_packet:"
Можно дергать кнопку еспшкой и никакие агенты и софт не нужный, хоть через браузер открывай.
Но wol же не включает, а только из спящего режима выводит. У меня не получалось включать выключенный ПК, только из stand-by.
Я нажимаю "Завершение работы", ПК выключается, никакие состояния не сохраняются, включение идёт с логотипа мат. платы. Я так понимаю это не спящий режим. Хотя возможно я чего-то не знаю.
И из такого состояния без проблем включается через WoL. Если у вас включить не получается после завершения работы, то попробуйте полазить по настройкам адаптера и биоса
Зависит от железа (настроек BIOS/UEFI в том числе). Вообще, WoL может быть полной заменой кнопки питания, т.е. именно включать компьютер; хотя это может быть неочевидно из названия "wake on LAN"
wol включает
Интел и АМД по разному эту фичу обрабатывают вроде бы.
А чем не устроил
shutdown /s /m \\имя_компьютера
Если не нравится, что одна и та же кнопка отправляющего приложения и включает, и выключает компьютер, то в коде меняем символы MAC адреса в обратном порядке и в отправляющее приложение забиваем ещё один тот же MAC, но в обратном порядке. Это работает, т.к. пакет broadcast-овый.
Выключаю через Steam Link))
Можно настроить ssh сервер (который встроен в Windows начиная с какого-то билда 10-ки, включается в компонентах) и выключать стандартной командой по ssh, при помощи psshutdown можно так же отправлять в сон (psshutdown -d -t 1 && exit).
Это так же можно проворачивать из WAN, использую роутер в качестве SSH-шлюза для подключения к ПК.
Зачем мудрить что-то через powershell, если можно через py to exe скомпилировать и закинуть в папку автозагрузки.
Выключаем компьютер через Wake-on-Lan