Архив рубрики: Linux

Решено! Rust — не собирается под musl — ругаeтся на openssl в Linux.

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

При сборке cargo вам вывалит что -то подобное:

OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  run pkg_config fail: pkg-config has not been configured to support cross-compilation.

  Install a sysroot for the target platform and configure it via
  PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a
  cross-compiling wrapper for pkg-config and set it via
  PKG_CONFIG environment variable.

  --- stderr
  thread 'main' panicked at /home/.cargo/registry/src/index.crates.io-6f17d22bba15001f/openssl-sys-0.9.102/build/find_normal.rs:190:5:


  Could not find directory of OpenSSL installation, and this `-sys` crate cannot
  proceed without this knowledge. If OpenSSL is installed and this crate had
  trouble finding it,  you can set the `OPENSSL_DIR` environment variable for the
  compilation process.

  Make sure you also have the development packages of openssl installed.
  For example, `libssl-dev` on Ubuntu or `openssl-devel` on Fedora.

  If you're in a situation where you think the directory *should* be found
  automatically, please open a bug at https://github.com/sfackler/rust-openssl
  and include information about your system as well as this message.

  $HOST = x86_64-unknown-linux-gnu
  $TARGET = x86_64-unknown-linux-musl
  openssl-sys = 0.9.102

У меня такая фигня пошла, когда я решил добавить Sentry в свой проект.

Решение следующее:

Выполняем команды:

sudo apt-get update
sudo apt-get install -y musl-dev musl-tools linux-headers-$(uname -r)

sudo ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/x86_64-linux-musl/asm && ln -s /usr/include/asm-generic /usr/include/x86_64-linux-musl/asm-generic && ln -s /usr/include/linux /usr/include/x86_64-linux-musl/linux
sudo mkdir /musl
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1f.tar.gz
tar zxf OpenSSL_1_1_1f.tar.gz 
cd openssl-OpenSSL_1_1_1f/
CC="musl-gcc -fPIE -pie -static -idirafter /usr/include/ -idirafter /usr/include/x86_64-linux-gnu/" ./Configure no-shared no-async --prefix=/musl --openssldir=/musl/ssl linux-x86_64
make depend
make -j$(nproc)
sudo make install

Экспортируем переменные окружения:
export PKG_CONFIG_ALLOW_CROSS=1
export OPENSSL_STATIC=true
export OPENSSL_DIR=/musl

Пробуем выполнять сборку:
cargo build --release --target=x86_64-unknown-linux-musl

RabbitMQ — отправка и чтение очереди через curl

Данный запрос можно делать даже из bash в Linux так как используются стандартные инструменты.

Все необходимое (обменник, очереди) можно создать через WEB-интерфейс RabbitMQ Managment. Предполагаем , что они уже созданы.

Отправляем сообщение в очередь.

В примере ниже :

vhost — имя хоста (exchanges)

delivery_mode 2 — записываем в режиме когда данные очереди сохраняются даже после падения сервера (сохраняются на диск)

routing_key — имя нашей очереди

payload — в данном случае строка , которую мы передаем в сообщении

%2F/amq.default — имя обменника внутри хоста

curl -s -u user:password -H "Accept: application/json" -H "Content-Type:application/json" -X POST -d'{
    "vhost": "Test_Virtual_Host",
    "properties": {
        "delivery_mode": 2,
        "headers": {}
    },
    "routing_key": "testqueues",
    "payload":"/dfgdfgfd/dfgdfg/dfgdfgfdg.dat",
    "headers": {},
    "props": {},
    "payload_encoding": "string"
}' http://127.0.0.1:15672/api/exchanges/%2F/amq.default/publish

Читаем сообщение.

curl -s -u user:password -H "content-type:application/json" -X POST -d'{
"count":2,
"ackmode":"ack_requeue_false",
"encoding":"auto",
"truncate":5000
}' http://127.0.0.1:15672/api/queues/%2F/testqueues/get

Удалить обменник через curl.

curl -s -u admin:1234567890 -X DELETE http://127.0.0.1:15672/api/vhosts/Test_Virtual_Host

Вывести из лог-файла Apache строки, которые находятся в интервале указанного времени.

Вот такая история…

По быстрому, чтобы не парить мозга с копированием кода можно просто выполнить команду:

wget https://raw.githubusercontent.com/solaryssky/PERL/main/apache_log_parser.pl && chmod 0777 ./apache_log_parser.pl

Использовать так:

./apache_log_parser.pl -s=13:00 -e=13:59 ./access.log

Linux Kali — подключаемся через RDP

Для включения RDP в Kali Linux нужно установить сервер XRDP далее включить автозагрузку

Устанавливаем cервер XRDP:

apt-get install xrdp

Запускаем и добавляем в атозапуск xrdp:

service xrdp start
service xrdp-sesman start
update-rc.d xrdp enable

Для более менее комфортной работы поменяй в настройках RDP качество изображения на 16bit и сделайте однотонную заставку на рабочий стол.

Rust — кросскомпиляция. Посмотреть набор инструментов.

Для кросскомпиляции в Rust нужно установить набор библиотек, необходимых для компиляции на определенной платформе.

Чтобы посмотреть установленные набор : rustup show

Чтобы добавит например musl , то делаем rustup target add x86_64-unknown-linux-musl

Смотрим rustup show

$ rustup show
.Default host: x86_64-unknown-linux-gnu
rustup home:  /home/dima/.rustup

installed targets for active toolchain
--------------------------------------

x86_64-unknown-linux-gnu
x86_64-unknown-linux-musl

active toolchain
----------------

stable-x86_64-unknown-linux-gnu (default)
rustc 1.40.0 (73528e339 2019-12-16)

Теперь компилируем

$ cargo run --target=x86_64-unknown-linux-musl
   Compiling cfg-if v0.1.10
   Compiling ppv-lite86 v0.2.6
   Compiling libc v0.2.66
   Compiling getrandom v0.1.13
   Compiling c2-chacha v0.2.3
   Compiling rand_core v0.5.1
   Compiling rand_chacha v0.2.1
   Compiling rand v0.7.2
   Compiling read_file v0.1.0 (/home/dima/Rust/read_file)
    Finished dev [unoptimized + debuginfo] target(s) in 36.55s
     Running `target/x86_64-unknown-linux-musl/debug/read_file`
Random u8: 252
Random u16: 4832
Random u32: 141195676
Random i32: -1677746107
Random float: 0.22141390568216823

Делаем авторизацию в Docker по ключу

  1. заходим по ssh на сервер с которого хотим прокинуть-получить авторизацию по ключу (без пароля) . Мне это нужно было, чтобы запускать скрипты в Docker, которые использовали утилиты установленные только в Docker. Проблема в том, чтобы вы не можете так просто в shell-скриптах использовать авторизацию по ssh с паролем.
  2. С сервера выполняем:  $ mkdir ~/.ssh && cd ~/.ssh
  3. Cоздаем открытый и закрытый ключ нашей локальной системы: ssh-keygen -t rsa -q -N » -f ~/.ssh/id_rsa
  4. Если в системе есть программа ssh-copy-id, то настраиваем удаленную систему на то, чтобы она авторизовывала SSH по открытому ключу: $ ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote.server
  5. В принципе все, авторизуемся первый раз по ключу : ssh localhost -p222 -i id_rsa

Дальше в скриптах можно выполнять авторизацию по ключу в Docker

Если grep:argument list too long — ищем данные в несколько потоков

Бывает, если у вас большое количество файлов и вы хотите использовать для этого стандартный grep (например: grep -h pattern ./*), то вполне можете получить сообщение : argument list too long .

Чтобы избежать этого, можно использовать find и для ускорения процесса (железо вам позволяет это делать), то можно распаралелить потоки и воспользоваться следующей командной:

find . -type f -print0 | xargs -n1000 -r0P3 grep pattern

Где:

-n1000 — одновременно максимум 1000 файлов

P3 — используем паралельно 3 процессора

pattern — ваша строка для поиска