Это довольно просто. Вам необходимо создать пакет .rpm из последнего файла .tar.gz (в нашем случае stunnel 5.40). Вам понадобится инструмент rpmbuild, а также установленные компиляторы и прочее.
1) yum -y install glibc-devel kernel-headers kernel-devel gcc gcc-c++ autoconf automake make
2) yum -y install rpm-build
3) wget https://www.stunnel.org/downloads/stunnel-5.40.tar.gz
Так как файл спецификации, используемый для сборки, будет искать некоторые отсутствующие файлы, вы должны создать их вручную, иначе сборка завершится ошибкой
4) touch stunnel.logrotate; touch stunnel.init
5) ln -s /usr/share/doc/stunnel-4.29 /usr/share/doc/stunnel
6) rpmbuild -ta stunnel-5.40.tar.gz
7) rpm -Uhv /root/rpmbuild/RPMS/x86_64/stunnel*
В случае сбоя rpmbuild вы можете сделать следующее:
cd /root/rpmbuild/BUILD/stunnel-5.40/
make
make install
Выпустить stunnel -version в конце, чтобы убедиться, что у вас установлена и работает последняя версия stunnel, как в моем случае:
root@zira /root/rpmbuild/BUILD/stunnel-5.40 (33 entries, 1 hidden)
56/23483# stunnel -version
stunnel 5.40 on x86_64-redhat-linux-gnu platform
Compiled/running with OpenSSL 1.0.1e-fips 11 Feb 2013
Как уже отмечалось, оболочка, вероятно, не лучшее место для этого. Если вы действительно хотите, вот решение с использованием awk
, dc
, printf
, sed
и tr
:
#!/bin/sh
# file: swap-bits
target_order='D5679123C4EF80AB'
indices() {
printf '%s\n' "$1" \
| sed 's/./\0 1+p\n/g' \
| sed '1s/^/10o16i/' \
| dc \
| sed 's/^/substr( $0, /' \
| sed 's/$/, 1 )/' \
| tr '\n' ' '
echo
}
sed 's/^/2o16iF/' \
| sed 's/$/p/' \
| dc \
| sed 's/....//' \
| awk "{ print \"16o2i\" $(indices ${target_order}) \"pq\" }" \
| dc \
| sed 's/^/0000/' \
| sed 's/.*\(....\)$/\1/'
Это не проверяет ввод.
Переменная target_order
должна быть установлена на предпочтительную перестановку ваших 16 бит.
Функция index
принимает в качестве входных данных такую строку и выводит последовательность команд substr ($ 0, n, 1)
, которые awk
будет использовать чтобы переставить его ввод.
Основная часть скрипта начинается с использования dc
для преобразования ввода из шестнадцатеричного в двоичный. Начальные нулевые биты сохраняются путем добавления к входу префикса F и отбрасывания четырех однобитовых. Результат передается в awk
, который печатает команду, которая сообщает dc
преобразовать двоичный код в шестнадцатеричный, затем переставленный вывод, затем команду, которая сообщает dc
напечатать и выйти. Это, конечно, подается на постоянного тока
. Наконец, снова используется sed
, чтобы убедиться, что в выходных данных присутствуют ведущие нули, если это необходимо.
Вход поступает на стандартный ввод
, вывод - на стандартный вывод
, например:
$ echo B455 | ./swap-bits
CB15
perl -wMstrict -le '
my @bits = unpack "(A1)16", sprintf "%016b", hex shift;
my $bitmap = "D5679123C4EF80AB";
@bits = @bits[ map { hex } split //, $bitmap ];
$"="";
print sprintf "%04X", oct "0b@bits";
' "B455"
Результат: CB15
First we convert the input hex number into it's 16-bit binary equivalent and store the indi-
dual bits in the array @bits. The individual bits are now mapped according to the bitmap wh-
ich is generated by splitting into single bits and getting their decimal equivalents which
are the array indices of @bits. Last step involves in converting the mapped bits into their
4-digit hex counterpart.