24 Ответы
Чтобы хоть как-то разнообразить молчание этого форума, пришел с вопросом сюда, а не на ЛОР Smile

Вот есть Vim. Старый добрый Vim. Я им обычно на серверах или нодах что-то правлю по месту, конфиги редактирую и иногда что-то просто записываю в файлы.
Один раз даже собрал на его базе IDE для питона, но быстро понял, что это все же не мое.

И вот я часто вижу крики, что Neovim круче и вообще рулит и педалит.

Мб кто-то знает, чем он лучше?

Я тут его поставил, запустил — из различий вижу только nvim вместо vim на главной странице, остальное все то же самое.
5 Ответы
Сильно пропатченный DWM на FreeBSD 13.2-RELEASE

[Изображение: 2023-04-15-17-34-1-cleaned.png]

[Изображение: 2023-04-15-19-08-cleaned.png]



На другой машине  работаю над новым конфигом. Пока вот так

[Изображение: 2023-04-16-14-14-cleaned.png]
1 Ответы
Случилось так, что мне понадобился доступ к собственному устройству через ADB. Предоставить разрешение для компьютера через ADB я не мог, т.к. интерфейс падал. Спойлер: мне надо было сбросить одну настройку без полного сброса системы, из-за этой настройки и падал интерфейс.

Для решения подобной задачи требуется TWRP или любой другой кастомный рекавери с наличием файлового менеджера. Root права не требуются.

Нужно закинуть adbkey.pub из .android в /data/misc/adb/, и переименовать его в adb_keys. Самый простой способ - это перезагрузиться в рекавери и выполнить в терминале команду:
Код:
adb push adbkey.pub /data/misc/adb/adb_keys

Однако у меня вылезла следующая ошибка: adb: error: failed to get feature set: insufficient permissions for device.

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

При следующей загрузке, устройство, с которого вы копировали файл adbkey.pub, будет автоматически авторизовано на смартфоне.
7 Ответы
На самом деле это отдельная реализация удалённой консоли, использующая SSH только для авторизации.

Основное преимущество ET - восстановление сессии при перебоях доступа к серверу. Более того, можно отправить клиент в сон, разбудить его через несколько часов, а сессия будет продолжена с того же места. Никаких сообщений об отключении или переподключении не будет.

В ET на данный момент не реализован проброс иксов, но лично мне оно и не нужно.

https://eternalterminal.dev
Нет ответов
Эти несколько строк помогут немного снизить нагрузку на сервер, обрубив множество медленных клиентов, которые занимают канал. В моём случае netstat -nalt | grep :80 | wc -l говорил примерно о 1500 клиентах, зависших в статусе TIME_WAIT, и даже статика отдавалась очень медленно.

Эти настройки - всего лишь пример, для вашего сервера подбирайте свои лимиты.
Код:
http {
    limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; # Ограничение на количество соединений с одного IP
    limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s; # Ограничение на количество соединений в рамках одной сессии, максимальное количество - 5 запросов в секунду
}

server {
    location / {
        limit_conn conn_limit_per_ip 10;
        limit_req zone=req_limit_per_ip burst=10 nodelay;
    }
    client_body_timeout 5s; # Таймаут на получение тела запроса от клиента
    client_header_timeout 5s; # Таймаут на получение заголовков запроса от клиента
}
Нет ответов
Небольшой скрипт для CVE-2022-44268, для быстрого извлечения профиля из PNG файла. Требуется модуль PIL.
Код:
from PIL import Image
import sys

if (len(sys.argv) < 2):
    sys.exit(-1)

img = Image.open(sys.argv[1])
img.load()

try:
    pf = img.info['Raw profile type']
    print (bytes.fromhex(pf).decode())
except:
    print("There is no raw profile")

img.close()

Использование: script.py image.png

Если сервер затронула эта уязвимость, то данный скрипт выведет украденные данные читабельным текстом. identify -verbose, как оказалось, отображает профиль не всегда (например, когда в нём данные в YAML).
16 Ответы
Паранойя не дремлет, поэтому всегда лучше иметь бэкап всех своих проектов, чтобы в случае какого-либо казуса ничего не потерялось. А лучше два бэкапа....

В качестве одного у меня есть свой сервер Gitea, на котором хранятся разные проекты или просто скрипты и заметки, он же выкачивает с GitHub в режиме зеркала те проекты, которые изначально хостятся там.

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

Для этого можно овспользоваться простым скриптом, который по API дернет список всех реп, а потом просто клонирует их в каталог.

Я его подцепил на каком-то форуме, и с тех пор довольно часто пользуюсь.

Создаем каталог, куда будем клонировать, и переходим в него:

Код:
mkdir my_projects
cd my_projects

А теперь запускаем скрипт:

Код:
curl -s "https://api.github.com/users//repos?per_page=100&page=1" | jq -r '.[] | select(.name ) | select(.fork == false).ssh_url' | xargs -L1 git clone --mirror

Единственный нюанс — он не сможет выкачать боле 100 реп, но я редко у кого столько видел.

Обновить репы можно так:

Код:
find . -maxdepth 1 -type d -exec sh -c '(cd {} && echo ">>> Pull repo \"$(basename "$(pwd)")\"" && git pull --all | grep -v "Fetching origin" | grep -v "Already up to date")' ';'

Можно добавить всю эту магию в crontab на домашнем сервере, чтобы, скажем, раз в сути в 12 ночи он делал бэкап. Можно добавить немного улучшайзеров: упаковывать в архивы по дате и так далее.
Нет ответов
Часто бывает нужно подсчитать, сколько времени занимает выполнение той или иной функции. Например, когда на это повешены метрики, отдаваемые в систему алертов, или просто для себя, когда оцениваешь эффективность своего кода.

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

В Go учли этот момент и сделали штатный механизм.

В начале нужной функции берем время начала:

Код:
start := time.Now()

Затем выполняем все нужные действия и в конце берем время окончания:

Код:
duration := time.Since(start)

Теперь просто выводим результат:

Код:
fmt.Println(duration)

В выводе будет показана понятная всем читабельная человеком цифра в наносекундах, микросекундах, миллисекундах, секундах и так далее.
13 Ответы
Вот и всё что я хотел вам сказать!

Убиваю остаток сегодняшнего дня!

Гарри Поттер и тайная комната на freebsd

сабж

[Изображение: DKVvvnM.png]