Многие другие ответы сосредоточены на том, кто использует ваш 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, детали, которой нет в вашем вопросе.
Нет такой вещи, как «процесс 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 тоже.
Чтобы услышать звуковой сигнал громкоговорителя ПК из /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
Убедитесь, что 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], т. е. выход идет в файл журнала и консоль).
Чтобы услышать звуковой сигнал из 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.