Задать вопрос
  • Почему get_user() возвращает None?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно включить members intents https://discordpy.readthedocs.io/en/latest/intents.html
    И в настройках бота в dev portal разрешить privileged intents.
    Ответ написан
    Комментировать
  • Как отправить сообщение telegram, viber, whatsapp - без ботов? PHP?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Тут этот вопрос регулярно задают.

    Telegram - никак, вообще. Пусть нужные пользователи подпишутся на бота, а дальше им по user id можно слать.

    Viber - платно и довольно дорого через Viber Business Messages, цена одного сообщения не меньше чем смс, плюс минимальный ежемесячный платёж довольно большой. Доступ только бизнесам. Точно так же проще сделать бота и слать по id.

    WhatsApp - тут никаких бесплатных ботов легально не предусмотрено вообще, зато можно по номеру телефона тоже довольно дорого через множество посредников. Опять же, только бизнесам. В основном это продают тоже с обязательным минимальным платежом, но тут хотя бы у некоторых (у того же twilio) есть тарифы без абонентки, с оплатой за каждое сообщение. Ещё можно рисковать нелегальными методами через эмуляцию WhatsApp Web.
    Ответ написан
    7 комментариев
  • Что я упускаю при руссификации консоли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В отличие от Debian, в Ubuntu файлы локализации вынесены в отдельный пакет language-pack-ru, установка которого решает проблему.
    Ответ написан
    Комментировать
  • Как открыть nano программно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для go подсказали выше (exec.Command)

    Для python - os.system.
    Ответ написан
  • Как получить список всех членов канала(Discord.py)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно включить members intent.

    import discord
    intents = discord.Intents.default()
    intents.members = True
    
    client = discord.Client(intents=intents)
    # или
    # bot = commands.Bot(command_prefix='!', intents=intents)


    Также в Dev. Portal включить Privileged Intents для своего бота.

    Документация
    Ответ написан
    3 комментария
  • Как сделать Post запрос в lua?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё прекрасно работает прямо по примерам, нагугленным из интернетов. Нужна библиотека luasocket.

    local http = require "socket.http"
    local ltn12 = require "ltn12"
    
    local reqbody = "{post body}"
    local respbody = {} -- for the response body
    
    local result, respcode, respheaders, respstatus = http.request {
        method = "POST",
        url = "https://httpbin.org/post",
        source = ltn12.source.string(reqbody),
        headers = {
            ["content-type"] = "text/plain",
            ["content-length"] = tostring(#reqbody)
        },
        sink = ltn12.sink.table(respbody)
    }
    -- get body as string by concatenating table filled by sink
    respbody = table.concat(respbody)
    
    print (result)
    print (respcode)
    print (respheaders)
    print (respstatus)
    print (respbody)
    Ответ написан
    4 комментария
  • Почему не удаётся очистить папку через os.remove?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    os.rmdir('photo')

    os.remove не работает с каталогами.
    Ответ написан
  • Каким способом блокирует Роскомнадзор?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Роскомнадзор сам ничего не блокирует, это регулятор, а не технический исполнитель. Его уровень - бумажка написаль.

    Вся работа РКН заключается включение некоторой строчки в некоторый список, регулярно эта строчка даже нормально не парсится (большой привет http:\\), но провайдеров обязуют "всёзаблакиравать", они как-то интерпретируют этот список и как-то пытаются сделать невозможным доступ к хостам из него. У каждого свой метод для этого. Кто-то блочит полученные по DNS все IP из списка или подменяет их IP на IP заглушки, кто-то отвечает RST на любой трафик в эти IP, кто-то пытается подсовывать свой левый https-сертификат на заблокированные сайты, плюс множество местных особенностей, вариаций итд итп.
    Ответ написан
  • Не работает код, ошибок нет, что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В этом коде выполняется bot, а client не используется.

    У commands.Bot есть примерно все те же методы и свойства, что у discord.Client. Для начала надо @client.event заменить на @bot.event.

    Далее, известная проблема заключается в том, что собственный обработчик on_message мешает выполняться командам, это настолько популярная проблема, что в официальном FAQ идёт первым же пунктом: https://discordpy.readthedocs.io/en/latest/faq.htm...

    Функции лучше не называть русскими буквами и тем более не надо вставлять туда звёздочки. Команды можно называть с помощью параметра name, чтобы они отличались от названия функции:

    @bot.command(name='пнуть')
    async def kick(ctx, nick):
    Ответ написан
  • Можно ли взломать шифр Вижнера который был зашифрован Аффинным шифром?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Главная ошибка тут - в предположении, что аффинный шифр что-то усложнит. Нет, это не так. По сути шифр остаётся шифром Виженера, в котором просто изменяется ключевое слово на другое. А дальше брутфорсом пробовать разные ключевые слова, проверяя результат расшифровки на похожесть на реальный текст (к примеру, по факту наличия словарных слов).

    Вся беда подобного подхода в том, что количество перебираемых вариантов не очень велико (по меркам современного компьютера), плюс вычислительная сложность ниже плинтуса. Поэтому перебор тут будет невероятно эффективнее работать, чем в вычислительно сложных шифрах типа RSA.
    Ответ написан
  • Как лучше сделать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не должно стоять задачи деления по числу строк. Код нужно делить логически, чтобы поддерживать в нём модульную архитектуру, чтобы код был понятен и легко читаем.

    Скажем, в одном файле функции работы с базой, в другом - рендеринг графика распределения показателей, в третьем - модуль запросов к API с ГОСТ-шифрованием...

    Аналогично, не должно быть задачи раскладывания файлов по каталогам по количеству. Можно посмотреть на реальные проекты, как в них всё делится.
    Ответ написан
    Комментировать
  • Фоновый режим bat файла?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотреть в сторону утилит типа cmdow.
    Ответ написан
    Комментировать
  • Как узнать id только что отправленного ботом telegram?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В чём проблема? Метод API sendMessage возвращает id отправленного сообщения.
    Ответ написан
  • Каким образом узлы в p2p сетях обходят NAT?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, конечно, возможно.

    Часть сети имеет внешние IP и позволяет прямой коннект к ним. При простейшей реализации p2p коннект возможен только между участниками при условии наличия у одного из них внешнего IP. Если узел А хочет установить коннект с узлом Б без внешнего IP (с закрытым портом и прочее, то что в ed2k называлось LowId, в DC - passive mode - и всё такое подобное), то надо, чтобы Б получил информацию об А и установил с ним коннект сам.

    Например, в ed2k клиент с полноценным внешним IP и возможностью коннекта к нему получает HighId, одинаковый на всех серверах, а неполноценный клиент получает непостоянный уникальный в пределах сервера LowId. Чтобы установить коннект между собой, клиенты А и Б должны находиться на одном сервере, а дальше А просит сервер передать Б просьбу установить коннект. Совсем бессерверно (используя DHT) ed2k может работать только с HighId-клиентами.

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

    Самая большая проблема для децентрализованных сетей - это bootstrap при первом запуске, необходимость найти хотя бы одного участника сети, чтобы узнать адреса других. Для этого обычно бывает какой-то сервер с источником начального списка нод, который пользователь прописывает руками или который опрашивается при первом запуске автоматически.
    Ответ написан
    1 комментарий
  • Книги по математике для машинного обучения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотрю предыдущий вопрос: Что учить для работы в сфере IoT?

    Судя по всему, мы имеем обычный случай "найти себя" в какой-нибудь области. Но если по IoT нужны знания больше инженерно-технические, то в ML нужна настоящая теоретическая подготовка по математике. Если всё же очень хочется - начинать можно с любого вузовского учебника по линейной алгебре.
    Ответ написан
  • Как ускорить docker push?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это невозможно. В принципе. Слой загружается на сервер только целиком, нельзя проверять, что в нём отличается только один файл. Тем более отличаться будет не только файл, но и, например, каталог, в который его положили - у него изменится mtime. Всё это отслеживается через контрольную сумму архива слоя, она от любого нового файла меняется.
    Ответ написан
    Комментировать
  • Можно ли использовать Fail2Ban из докера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ну как бы это вполне возможно. Нужно --net=host, чтобы fail2ban редактировал iptables на хосте, нужно прокинуть (или загнать в образ) конфиг, нужно прокинуть изучаемые им логи, ну и про privileged mode не забыть. Но зачем? Ему же по сути только конфиг надо настроить один раз и везде использовать, вон уже выше ansible посоветовали для упрощения этой операции.
    Ответ написан
    Комментировать
  • Маршрутизация из одной сети в другую через цепочку Wireguard > OpenVPN?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Когда мы идём с самого сервера 192.168.11.3 в 192.168.1.* и 192.168.2.*, то в качестве исходящего адреса выставляется IP местного конца туннеля, в данном случае 10.8.2.3, поэтому всё и работает. Это легко проверить с помощью команды типа:

    ip route get 192.168.1.77

    Когда же подобный трафик приходит с телефона, у него IP-адрес 10.1.3.2. С таким адресом трафик попадает на astrave-mainsrv и в дальнейшем роутится в openvpn либо не пропускается на astrave-mainsrv (смотря как там настроено). Аналогичная фигня происходит с трафиком из сетей 192.168.11.* и 192.168.12.* - он не будет уходить в туннель с адресом источника 10.8.2.3.

    Решение: на astrave-mainsrv весь трафик, уходящий в openvpn, NATить в 10.8.2.3.

    Вот так (тут tun666 - интерфейс openvpn):

    iptables -t nat -A POSTROUTING -s 10.1.3.0/24 -o tun666 -j SNAT --to 10.8.2.3

    Или даже так (тогда можно не задумываться о том, какой IP на нашей стороне туннеля, особенно если он динамический):

    iptables -t nat -A POSTROUTING -s 10.1.3.0/24 -o tun666 -j MASQUERADE

    Или даже можно не особо разбираться с конкретным адресом (тогда заодно с любых IP типа 192.168.11.* заработает, если трафик от них как-то попадёт на astrave-mainsrv):

    iptables -t nat -A POSTROUTING -o tun666 -j MASQUERADE

    Общий смысл: если компания хочет видеть у себя весь трафик подключающегося по VPN сотрудника c адреса 10.8.2.3, то мы весь трафик должны посылать именно с этого адреса, подменяя адрес источника.
    Ответ написан
  • В каких языках есть встроенная возможность и синтаксис для удаления определенных методов и/или свойств наследуемых классов при создании класса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Весь смысл наследования в том, что экземпляр класса B можно использовать и как экземпляр класса A (но не наоборот). Если из B удалить какой-то атрибут, то что будет с наследованием? Если просто пытаться его как-то скрыть, то это не поможет - ведь можно приведением типов экземпляр класса B превратить в экземпляр класса A и получить обратно свой доступ к нужному полю.

    И вообще, вот, например, есть библиотека, которая умеет работать с объектами класса A. Библиотека скомпилирована кем-то, её исходный код недоступен. Мы определяем класс-потомок B и далее используем функции библиотеки на объектах этого класса. Всё хорошо, но мы уже не можем запретить библиотеке работать с этим полем.

    PS: В своё время намного лучше понять ООП мне помогло чтение описания внутреннего устройства классов в Turborland Pascal. Устроены классы (в Pascal они называются объектами, но это не столь важно) примерно так:

    1. Ссылка на таблицу виртуальных методов (VMT)
    2. Поле 1.
    3. Поле 2.
    ...

    VMT устроена так:

    1. Ссылка на метод 1
    2. Ссылка на метод 2
    ...

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

    За счёт этого даже уже ранее скомпилированный код, ничего не знающий о наследуемых классах, работает с ними как со своими родными.
    Ответ написан
    5 комментариев
  • Поможете разобраться в принципе маршрутизации в схеме подключения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как написано - так и работает.

    Вот, например, правило:

    -A POSTROUTING -s 10.1.3.0/24 -o br0 -j SNAT --to-source 192.168.11.3

    Оно должно подменять source у пакетов, прилетевших с адресов 10.1.3.0/24 на выходе в интерфейс br0. Однако если мы пингуем 192.168.1.72, обратно пакеты приходят с адреса 192.168.1.72 и нигде не подменяются на 10.1.3.0/24. А, собственно, зачем их подменять?

    Решать задачу надо иначе. Надо или сделать SNAT (MASQUERADE) на 192.168.1.44 с адресов не только 10.1.3.0/24, но и 192.168.11.0/24 (в этом случае в wg-туннеле будут ходить адреса 192.168.11.0/24):

    192.168.1.44:
    -A POSTROUTING -s 10.1.3.0/24 -o enp4s0 -j MASQUERADE
    -A POSTROUTING -s 192.168.11.0/24 -o enp4s0 -j MASQUERADE

    Либо надо на 192.168.11.3 делать подмену в туннельные адреса, которые в свою очередь заменяются в местный IP уже на "той" стороне (в этом случае в туннеле будут ходить только адреса 10.1.3.0/24):

    192.168.11.3:
    -A POSTROUTING -o wg0 -j MASQUERADE

    192.168.1.44:
    -A POSTROUTING -s 10.1.3.0/24 -o enp4s0 -j MASQUERADE
    Ответ написан