Системный сигнал из rc.local-запланированного сценария Python

Многие другие ответы сосредоточены на том, кто использует ваш Wi-Fi или заражает ваши машины. Это возможно, но они не видят простейшего объяснения (бритва Оккама ...).

Вы, скорее всего, выступаете в качестве открытого реле, а это значит, что любой человек в мире может подключиться к вашей машине и просто попросить его куда-нибудь отправить почту, и вы это сделаете, без вопросов. Часто это связано с тем, что интернет-провайдеры блокируют вас, потому что это простой тест для них. Они сканируют свой IP-блок клиента и спрашивают что-либо на порту 25 для передачи тестового сообщения, и если вы это сделаете, вы являетесь спамером. Возможно, это так, что никто не использует ваше реле, но его простое существование достаточно для блокировки.

Чтобы проверить, являетесь ли вы открытым ретранслятором, telnet на ваш почтовый сервер и поговорите с ним. Жирным шрифтом являются те, которые вы вводите.

% telnet your.mail.server 25
Trying 1.2.3.4...
Connected to your.mail.server.
Escape character is '^]'.
220 your.mail.server ESMTP Postfix (Debian/GNU)
helo geocities.com
250 your.mail.server
mail from: the90s@geocities.com
250 2.1.0 Ok
rcpt to: someone@gmail.com
554 5.7.1 <someone@gmail.com>: Relay access denied

Строки, которые вы вводите, - это строки helo, mail from: и rcpt to:. Убедитесь, что вы используете адреса, которые не являются локальными для вас, оба должны быть удаленными хостами. Если вы не получили ошибку 554 relay denied, то вы неправильно настроили спам-шлюз и по праву заблокированы.

Самый простой способ исправить это - потребовать аутентификации для отправки почты через ваш MTA. Детали для установки этого зависят от используемой MTA, детали, которой нет в вашем вопросе.

1
задан 13 October 2016 в 00:29

3 ответа

как запущен в процессе init.d

Нет такой вещи, как «процесс init.d».

rc.local является частью системы rc, которая был заменен три раза. Эта система была заменена van Smoorenburg rc, upstart (десять лет назад) и (по версии Ubuntu версии 15) systemd. То, что вы используете, - это совместимость с обратной совместимостью с третьей итерацией.

В системных операционных системах, таких как Ubuntu версии 15 и более поздних версиях, прокладка является службой systemd с именем rc-local.service. Вы можете узнать его определение службы с помощью systemctl cat rc-local.service

Как вы можете видеть, это не определено как присоединение услуги к терминальному устройству. Сервисный процесс не запускается с управляющим терминалом, а его стандартный ввод и вывод не подключены к терминалу.

Этот код на питоне и сценарий оболочки не «подают звуковой сигнал о динамике ПК». Они записывают символ # 7 на свои стандартные выходы. Просто так происходит, когда вы запускаете их в интерактивном режиме в своем сеансе входа в систему, когда устройство, которое является их стандартным выходом, интерпретирует символ # 7 как инструкцию, чтобы сделать шум. Перенесите стандартный вывод интерактивной команды на /dev/null и наблюдайте за тем, как тихий код становится.

Именно поэтому важно, что прокладка rc.local (очень) обратной совместимости не имеет никакого подключения к терминальному устройству .

Вы можете решить эту проблему с помощью утилиты beep. Эта попытка (если она вызвана соответствующим образом) для явного открытия дескриптора файла к терминальному устройству и отправки символа № 7 (или использования консоли или evdev ioctl() s) этого устройства, а не просто предполагая, что стандартный вывод является терминальным устройством.

Но стоит подумать о том, чтобы не использовать rc.local тоже.

Дальнейшее чтение

https://unix.stackexchange.com/a/211927 / 5132
1
ответ дан 23 May 2018 в 05:15
  • 1
    Спасибо за информативный ответ (опрокинутый как noob). Раньше я устанавливал звуковой сигнал, но не мог заставить это работать. (См. Мои оставшиеся комментарии к этой теме.) – Justin Case 17 October 2016 в 19:15

Чтобы услышать звуковой сигнал громкоговорителя ПК из /etc/rc.local скрипта Python через консоль Linux, вы можете использовать console_ioctl(4): KDMKTONE, KIOCSOUND:

#!/usr/bin/env python
import os    
from fcntl import ioctl

CLOCK_TICK_RATE = 1193180 # magic https://github.com/johnath/beep/blob/0d790fa45777896749a885c3b93b2c1476d59f20/beep.c#L31-L49
KDMKTONE = 0x4B30   # generate tone include/uapi/linux/kd.h#L25

def beep(console_fd, frequency=440, length_millis=200):
    period = CLOCK_TICK_RATE // frequency
    ioctl(console_fd, KDMKTONE, (length_millis << 16) | period) # start beeping
    # return immediately

beep(console_fd=os.open('/dev/tty0', os.O_RDONLY | os.O_NOCTTY)) # I'm [G]root

См. консоль Linux [ ! d1]. Он работает, потому что /etc/rc.local выполняется root. Вы можете запустить его как обычный пользователь, если у вас есть терминал, например, в виртуальной консоли Ctrl + Alt + F1 (нажмите Alt + F7, чтобы переключиться обратно в ваш менеджер окон GUI).

Убедитесь, что pcspkr модуль ядра не занесен в черный список (закомментируйте значение по умолчанию):

$ sudo sed -i 's/^blacklist pcspkr/#blacklist pcspkr/' /etc/modprobe.d/blacklist.conf

Убедитесь, что он может быть загружен без ошибок:

$ sudo modprobe pcspkr

Убедитесь, что /etc/rc.local исполняемый файл:

$ sudo chmod +x /etc/rc.local

print('\a') (запись символа U+0007 BELL* в stdout) приводит к , если у вас есть терминал .

Он может воспроизводить образец bell.ogg, загруженный с помощью команды pactl (для звукового сервера PulseAudio):

$ pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg

Вероятно, PulseAudio не использует динамик ПК

В моей системе Ubuntu 16.04, print('\a') из /etc/rc.local записывает #007 в /var/log/syslog и подает звуковой сигнал на громкоговоритель ПК (systemctl cat rc-local.service показывает [ f24], т. е. выход идет в файл журнала и консоль).

0
ответ дан 23 May 2018 в 05:15
  • 1
    Хороший ответ (разогнан как noob). Я установил pulseaudio-utils, так как я думал, что у него есть потенциал, но учитывая, что это сервер Ubuntu, в системе нет файлов ogg, как это было бы возможно с установкой рабочего стола. Я преследую некоторых из них и вижу, работает ли это в более поздней версии проекта. Благодарю. – Justin Case 17 October 2016 в 19:24
  • 2
    @JustinCase, чтобы быть ясным, код Python (в верхней части ответа) не требует установки ничего (кроме самого python). – jfs 17 October 2016 в 19:29
  • 3
    Отметил. Я создал beep.py, а с консоли и скрипта они работают, как ожидалось. Я пытался принести код в свой скрипт, и он работает. Я попытался повторить команду beep () три раза, и она подает звуковой сигнал только один раз. Обратите внимание, что все мои (несколько успешные) попытки со всеми этими предложениями производят только один / по умолчанию сигнал. Я думаю, мне нужно просто с этим справиться и отпустить. – Justin Case 17 October 2016 в 19:49
  • 4
    @JustinCase: вам, вероятно, следует задать отдельный вопрос о повторении звукового сигнала, особенно потому, что он работает для меня: я только что добавил цикл for _ in range(5): \n time.sleep(1) \n beep(...), и он подает звуковой сигнал 5 раз с интервалом в 1 секунду. – jfs 18 October 2016 в 01:37

Чтобы услышать звуковой сигнал из pc-динамика из сценария Python, вы можете использовать API evdev Linux:

#!/usr/bin/env python
import ctypes
import math
import os
import time


EV_SND = 0x12  # linux/input-event-codes.h
SND_TONE = 0x2  # ditto
time_t = suseconds_t = ctypes.c_long

class Timeval(ctypes.Structure):
    _fields_ = [('tv_sec', time_t),       # seconds
                ('tv_usec', suseconds_t)] # microseconds

class InputEvent(ctypes.Structure):
    _fields_ = [('time', Timeval),
                ('type', ctypes.c_uint16),
                ('code', ctypes.c_uint16),
                ('value', ctypes.c_int32)]


frequency = 440  # Hz, A440 in ISO 16
device = "/dev/input/by-path/platform-pcspkr-event-spkr"
pcspkr_fd = os.open(device, os.O_WRONLY)  # root! + modprobe pcspkr
fsec, sec = math.modf(time.time())  # current time
ev = InputEvent(time=Timeval(tv_sec=int(sec), tv_usec=int(fsec * 1000000)),
                type=EV_SND,
                code=SND_TONE,
                value=frequency)
os.write(pcspkr_fd, ev)  # start beep
try:
    time.sleep(0.2)  # 200 milliseconds
finally:
    ev.value = 0  # stop
    os.write(pcspkr_fd, ev)

Запустить Linux evdev API в качестве корня. /etc/rc.local запускается root, поэтому скрипт должен работать как есть.

Если файл /dev/input/by-path/platform-pcspkr-event-spkr не существует, убедитесь, что модуль pcspkr загружен:

root# modprobe pcspkr
]

У сценария нет других зависимостей, кроме самого python.

0
ответ дан 23 May 2018 в 05:15

Другие вопросы по тегам:

Похожие вопросы: