Толик Панков
hex_laden
............ .................. ................
Page Summary

November 2020
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Back Viewing 0 - 20  
Типа великий пост.

ДЛЯ:
0. Связи
1. Личных сообщений
2. Флуда
3. Срачей
4. ....
666. PROFIT
История, описание, FAQ этого блога.
Блогополезности
Список личных фриков и забаненных
Написать письмо:hexxladen[inu]inbox.lv
Другая контактная информация есть в профиле
Поиск по блогу:


Другие ресурсы:

Дружественные проекты:
Сайт сообщества свободомыслящих Том Хаоса by Paperdaemon Жизнедеятельность депутата Семенова Сергея Сергеевича Федеральный список экстремистских материалов Семенов Сергей Сергеевич. Секреты депутата. Открыто для доступа из РФ

Current Mood: дверь запили
Current Music: панк-рок
САТАНИНСКИЕ ГЛУБИНЫ теперь в формате DOC и с оглавлением.

По многочисленным просьбам одного читателя, наслаждайся.

Скачать с mega.nz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/15/sataninskie-glubiny-teper-v-formate-doc-i-s-oglavleniem/

Преобразование имени раздела и устройства в формат SYSLINUX

Преамбула


Меня спрашивают, а где на практике можно применить "номер буквы в алфавите", про получение которого в bash-скрипте было недавно написано. Вот пример такого практического применения. Известно, что в Linux дисковые устройства представлены в виде /dev/sda, /dev/sdb, /dev/sdc и т.д., а разделы диска в виде /dev/sda1, /dev/sda2...
SYSLINUX, точнее его модуль chain.c32, который может передавать управление другим загрузчикам, использует другой формат:

hdD P
где:
D - номер устройства (диска) в BIOS
P - номер раздела на диске
Отсчет дисков ведется с 0, разделов - с 1 (0 - главная загрузочная запись диска)
Например, hd0 2 - загрузка должна производиться со 2 раздела первого диска, hd1 1 - с 1 раздела второго жесткого диска, hd3 0 - необходимо передать управление главной загрузочной записи (MBR) четвертого диска.

Вот часть конфига syslinux.cfg, где chainloading используется для загрузки Windows со второго раздела на первом жестком диске:

LABEL windows
   menu label Microsoft Windows 7
   kernel modules/chain.c32
   append hd0 2


Некоторые минусы


- Минус, связанный с BIOS. Если вдруг порядок устройств в BIOS поменяется, то загрузчик SYSLINUX "заблудится" и попытается передать управление не туда.
- Некоторые линуксы меняют порядок именования жестких дисков, т.е. /dev/hda может и не соответствовать первому загрузочному диску. Тут уже зависит от конкретного дистрибутива.

Первый минуса можно избежать, используя вместо номера диска MBR ID, но это уже тема для отдельной заметки.

Получаем ID для chain.c32


Я организовал это в отдельной функции get_sysl_hd(), чтобы было удобно утащить в другой скрипт, буде понадобится. Первый параметр функции - имя устройства, например, /dev/sda1

1. Получаем имя устройства без пути к нему.
T_DN=`basename $1`

2. Можно проверить, соответствует ли имя устройства формату имени дисков, а то вдруг нам CD-ROM подсунули :)
Имя диска начинается с первой буквы s или h на некоторых пожилых дистрибутивах, далее следует буква d, далее - латинская буква a-z, потом могут следовать цифры (номера разделов). Можно сообразить вот такое простенькое регулярное выражение:

^[sh]d[a-z][1-9]*$

Далее пропускаем результат работы basename через grep, и проверяем выхлоп в переменной. Если переменная пустая, подсунули что-то не то.

T_DN=`basename $1|grep '^[sh]d[a-z][1-9]*$'`
if [ -z "$T_DN" ]; then
	return 1
fi


Но на самом деле, эта проверка не очень-то и нужна, можно пропустить этот пункт

3. Получаем третью букву в имени диска с помощью команды expr:
expr substr pos len

где:
substr - операция получения подстроки
pos - позиция символа в строке (отсчет ведется с единицы)
len - длина подстроки

T_3LET=`expr substr $T_DN 3 1`

4. Получаем номер буквы в алфавите. Я воспользовался вторым копия из ранее описанных способов.

S_CODE=`printf '%d' \'$T_3LET`
A_CODE=`printf '%d' \'a`
SYSL_ID="hd"`expr $S_CODE - $A_CODE`


5. Получим номер раздела, удалив sed'ом все латинские буквы с начала имени устройства в переменной $T_DN:

T_VOLNUM=`echo "$T_DN" | sed 's/^[a-z]*//'`
if [ -z "$T_VOLNUM" ]; then
	T_VOLNUM=0
fi


Если переменная окажется пустой, значит нам подсунули устройство, без указания раздела - необходимо сослаться на MBR. Присваиваем T_VOLNUM значение 0.

6. Добавляем полученные данные в переменную SYSL_ID

SYSL_ID="$SYSL_ID $T_VOLNUM"

7. Пример вызова функции:

if [ -z "$1" ]; then
    echo "Use "`basename $0` "<device>"
    exit
fi

get_sysl_hd "$1"

if [ $? -ne 0 ];then
    echo "Bad device name!"
else
    echo "$1: $SYSL_ID"
fi


Скрипт целиком


На PasteBin
На GitHub

Источники

1. Syslinux (Русский)
2. Работа со строками
3. BASH: Получить номер буквы в латинском алфавите, более элегантное решение. Копия

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/15/preobrazovanie-imeni-razdela-i-ustrojstva-v-format-syslinux/

Tags: , ,
Замечательные опечатки.

В околошкольной крипипасте:

сжечь ему эту погонь

Интересно, кого полагалось сжечь, местного военкома, или даже целого министра обороны?

За "погонью" идет ее сестра "серень", наверное, весьма зловонное растение.

На участке бабушки вовсю цвела серень

И, наконец, финалист нашего сегодняшнего хит-парада, мужыкальный, прям-таки инструмент из теста по музыке - сексофон.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/11/zamechatelnye-opechatki-6/

Случай в магазине

Как у поэта Лесина о природе зла/добра.

Стою в магазине я, в очереди на кассу, пробиваю себе вкусный бич-пакет Биг-Бон, нравятся они мне очень.
По передо мной стоит "сердобольная" тетушка, из серии тех проклятых "сердоболов", которые будут поудобнее укладывать человека с переломом основания черепа до приезда скорой, вызывать скорую мирно отдыхающему пьянице, или рассказывать про вред ГМО и прививок, ежили их, наконец, догнало мракобесие в терминальной стадии.

- Вот зачем вы эту гадость покупаете, в этих бич-пакетах одна химия! Купите лучше макарон простых!
- Женщина, милая, вот вы приходите домой, включаете свет. Так вот, в лампочке - физика! Если у вас телефон с компьютером есть - в них математика и ее подруга информатика, а у вас самой внутри - биология. Если дома есть кот, то сразу две биологии в одной квартире! Знаете, жить вообще страшно, куда ни плюнь, везде какая-нибудь наука...

Один из немногих моментов, когда я узрел подтверждение гипотезы, что человек, однако, своего рода компьютер. Я увидел BSOD в реальности. А у кассирши, явный перегруз модуля "корпоративной вежливости".

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/10/sluchaj-v-magazine/

BASH: Получить номер буквы в латинском алфавите, решение "в лоб".

Вот еще одно решение задачи про номер буквы в латинском алфавите (это подойдет и для русского, нужно просто изменить паттерн). Решение не очень красивое, зато дико простое.

#!/bin/bash
alf="abcdefghijklmnopqrstuvwxyz" #переменная, хранящая паттерн
b=`expr index $alf $1`
echo "$1 is $b"


Чтоб нумерация начиналась с 0, меняем строку
b=`expr index $alf $1`
на
b=`expr index $alf $1 - 1`

Примечание: параметр index команды expr позволяет получить индекс строковой последовательности: index <где_найти> <что_найти>

Готовый скрипт с проверками


На PasteBin
На GitHub

Остальные варианты решения той же задачи.


1. С помощью операторов for и if Копия
2. С помощью printf Копия

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/08/bash-poluchit-nomer-bukvy-v-latinskom-alfavite-reshenie-v-lob/

Tags: ,
BASH: Получить номер буквы в латинском алфавите, более элегантное решение.

В комментариях предложили более элегантное решение этой задачки.

#!/bin/bash

code=`printf '%d' \'$1`
a_code=`printf '%d' \'a`
answer=$( expr $code - $a_code )
echo $answer


Разберем код подробно.


1. printf - команда, выводящая текст (обычно на экран), с учетом заданной форматирующей строки. Подробнее о команде printf можно почитать в источниках, а вообще башевский printf, является аналогом printf из C++, и ее рекомендуют для замены древней команды echo в bash-скриптах.

Первым параметром является строка, описывающая формат, в данном случае '%d' означает, что нужно вывести десятичное число.
Второй параметр - выводимая строка.
Перед вторым параметром добавляется символ ' (одна одинарная кавычка): Интерпретируется как кодовый номер этой буквы в текущей кодировке [1], одинарную кавычку экранируем символом \.

Таким образом, в переменной code окажется код первого символа из первого параметра командной строки скрипта.

2. Далее, таким же образом, получаем код первой буквы в алфавите.
3. В итоге, получаем номер буквы в алфавите, посчитав выражение с помощью оператора expr [2]

Примечания


1. Этот код не будет работать на некоторых довольно странных устройствах, где кодовая таблица латинского алфавита представляет собой перемежающиеся заглавные и строчные буквы: AaBbCcDd и т.д. (или aAbBcCdD...)
2. Чтобы отсчет букв шел с единицы, необходимо изменить выражение answer=$( expr $code - $a_code ) на

answer=$( expr $code - $a_code + 1 )
3. С кириллицей этот способ не сработает, используйте предыдущий

По вкусу можно добавить проверки, как в предыдущем скрипте.

Готовый скрипт


На GitHub
На PasteBin

Дополнительно


1. Статья про printf
2. Описание оператора expr

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/04/bash-poluchit-nomer-bukvy-v-latinskom-alfavite-bolee-elegantnoe-reshenie/

Tags: ,
Котопанк Шредингера.

Можно сказать, что номерследующий N-ART за 2019 г.

Джва года ждал этой картинки. Нарисовано вручную, и так, скорее всего, пойдет без изменений на новую футболку #2. Разве что текст добавлю.



Остальные файлы здесь

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/04/kotopank-shredingera/

BASH: Получить номер буквы в латинском алфавите.

Преамбула


Вопрос был задан студенту-первокурснику преподом на зачете по Linux. Студент на вопрос не ответил и вчера ушел на пересдачу, впрочем, задав вопрос мне. Думаю, формулировка задания понятна. Я, кстати, сначала тоже запарился, и начал выдумывать всякие дикие варианты с получением кода символа, преобразованием кода символа в номер буквы латинского алфавита, потом подумал, что иметь секс с локалью (разбирайся еще, юникод не юникод) не стоит, и родил вот такое простое решение с помощью цикла for и оператора if.

Решение


Нужную букву будем брать из параметра командной строки скрипта.

#!/bin/bash

#get number of latin letter in alphabet
#use nlett <letter>, e.g nlett a

SNUM=1

for SYMB in {a..z}; do
    if [[ "$SYMB" == "$1" ]]; then
	break
    else
	let "SNUM=SNUM+1"
    fi
done

echo "$1 is $SNUM"


Перебираем в цикле все буквы от a до z, нашли нужную - выводим номер, не нашли - увеличиваем счетчик $SNUM.
Чтобы отсчет шел с 0, просто присваиваем начальному значению счетчика 0:
SNUM=0

Дополнительная проверка


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

SFND=`echo $1|grep '^[a-z]$'`
if [ -z "$SFND" ]; then
    echo "Error: in first parameter must be one small latin letter!"
    exit 1
fi


И заменить в цикле и далее $1 на $SFND.

Скрипт целиком


На PasteBin
На GitHub

Есть и более элегантное решение.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/04/bash-poluchit-nomer-bukvy-v-latinskom-alfavite/

Tags: ,
Получение относительного пути в Linux

Преамбула


Почему-то много написано, про то, как относительный путь преобразовать в абсолютный, или же получить абсолютный путь к текущему каталогу, а как получить относительный путь из одного каталога в другой, еле нашел.

Пример


Скажем, есть 2 каталога, известны полные пути:
/tmp/test/dir1/subidr1/startpoint и /tmp/test/dir2/subdir2/endpoint, надо получить относительный путь из каталога startpoint в каталог endpoint

Команда realpath.


Проще всего получить относительный путь командой realpath со следующими параметрами:

realpath --relative-to="ОТКУДА" "КУДА"
где:
ОТКУДА - стартовый каталог
КУДА - конечный каталог

Выполнение команды
realpath --relative-to="/tmp/test/dir1/subidr1/startpoint" "/tmp/test/dir2/subdir2/endpoint"
выведет на экран относительный путь:
../../../dir2/subdir2/endpoint

Если каталог не существует, будет отображена ошибка:
realpath: /tmp/test/dir2/subdir2/endpoint: No such file or directory

Утилита realpath входит в пакет coreutils, поэтому есть везде, кроме старых и совсем урезанных дистрибутивов:

Тестовый скрипт


#!/bin/bash

#get relative path example
#start path: /tmp/test/dir1/subidr1/startpoint
#end path: /tmp/test/dir2/subdir2/endpoint

START="/tmp/test/dir1/subidr1/startpoint"
END="/tmp/test/dir2/subdir2/endpoint"

mkdir -p "$START"
mkdir -p "$END"

cd "$START"
echo -n "Start directory:"
pwd

RP=`realpath --relative-to="$START" "$END"`
echo "Relative path: $RP"

echo "CD to relative path:"
cd "$RP"

echo -n "End directory:"
pwd


На PasteBin
На GitHub

Источник


qaru.site - там предлагаются и другие способы, разной степени велосипедности, например, использовать Python или получать относительный путь исключительно средствами оболочки (на мой взгляд, неудобно, и можно где-нибудь накосячить).

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/06/02/poluchenie-otnositelnogo-puti-v-linux/

Tags: ,
САТАНИНСКИЕ ГЛУБИНЫ

Навели тут на автобиографическую книгу какого-то известного ранее ЖеЖиста, охрененная штука оказалась, дико контркультурная, почти что Баян Ширянов, и собственно да, вещества и секс в книге присутствуют в полном объеме. Говорят, автор жив до сих пор, не торчит, у него жена, дети и бизнес.

Книга была в виде сайта на "Народе", но проклятые хуяндексовские цензоры ее снесли. Благо добрые люди дали ссылку на Вебархив.

Однако, у автора местами вырвиглазные фоны, прям-таки вениаминные, так что я собрал все это дело в ПДФ-ку, чтоб читать было удобнЕй!

Правда без содержания и навигации, но мне просто лень. Если кто-нибудь сделает, буду рад. А вообще, кто связывался с Флибустой - лучше сделать FB2, и залить туда.

Скачать бесплатно без СМС с Mega.nz

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/31/sataninskie-glubiny/

Как добавить картинку в readme на GitHub

Очередная заметка "от склероза". Товарищ [info]is3 посоветовал добавить скриншоты в readme проекта ASCII-капчи, а я ж, как обычно, мануалы читаю в последнюю очередь, и даже не знал о такой возможности. А она есть.

1. Грузим картинки на GitHub, желательно в отдельный каталог, например screnshoots. Лучше грузить скрины в сам репозиторий, хотя GitHub позволяет вставку картинок и с других сайтов.

2. Добавляем следующий код в README.md:

![Описание](http(s)://адрес_картинки.png(jpg))

3. Пример:

# Screenshoots

ASCII captcha:

![ASCII captcha](https://raw.githubusercontent.com/tolik-punkoff/ascii-captcha/master/screnshoots/test01.png)

ASCII captcha on real HTML page:

![ASCII captcha on real HTML page](https://raw.githubusercontent.com/tolik-punkoff/ascii-captcha/master/screnshoots/on_page1.png)

User send wrong code:

![User send wrong code](https://raw.githubusercontent.com/tolik-punkoff/ascii-captcha/master/screnshoots/on_page2_wrong%20code.png)


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

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/13/kak-dobavit-kartinku-v-readme-na-github/

Простой интерактив в bash-скриптах, часть 2. Списки (меню).

Преамбула


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

Сначала возьмем из скрипта по ссылке выше функцию create_list() и необходимые переменные:

FOUNDLST=""
DIR1="/home/smallwolfie/test/archives"
TARGZ=""

create_list() #$1 - dir, $2 - file mask
{
    FOUNDLST=""
    for FLE in $(find $1 -maxdepth 1 -iname $2); do
	if [ -n "$FLE" ]; then
	    FOUNDLST="$FOUNDLST"`basename $FLE`"\n"
	fi
    done
}
#тут будет функция вывода списка
#...
#создаем список
create_list $DIR1 "*.tar.gz"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR1 *.tar.gz not found"
    exit
else
    TARGZ="$FOUNDLST"
fi


Простой вариант с помощью оператора select.


Организуем это дело в виде отдельной функции ask_list(), куда первым параметром передается список, а вторым - запрос для пользователя.

1. Скопируем содержимое первого параметра в переменную $LIST_BUF, со списком придется сделать несколько преобразований:

LIST_BUF=$1

2. Список у меня в виде строк, разделенных стандартным переносом \n, так что заодно добавлю пункт Cancel, чтобы пользователь мог отказаться от выбора.

LIST_BUF="$LIST_BUF""Cancel"

3. Оператор select работает со списком значений, разделенных пробелами, так что надо символы \n заменить на пробелы:

LIST_BUF=`echo -e "$LIST_BUF"|sed 's/\n/ /'`

4. Устанавливаем подсказку ввода для пользователя, присвоив второй параметр функции специальной переменной PS3.

PS3=$2

5. Теперь используем оператор select:

echo
    select LIST_RET in $LIST_BUF; do
	if [ -n "$LIST_RET" ];then
	    break
	fi
    done


На экран будет выведен список, а пользователю будет предложено ввести номер из списка:

smallwolfie@wolfschanze: ~/test/$ ./asklist2

1) slinstall.tar.gz 3) teSt.Tar.gZ 5) Cancel
2) slmini.tar.gz 4) TEST.TAR.GZ
Select file:


Если внутри конструкции select..done не поставить break, то цикл выбора окажется бесконечным.
Значение (строка после номера) будет записано в переменную, указанную после ключевого слова select.
Если пользователь введет номер не из списка, или вообще что-то левое, то переменная $LIST_RET окажется пустой.
Здесь внутри конструкции select..done добавлена конструкция для проверки этого. Если переменная окажется пустой - пользователю будет предложено повторить ввод:

smallwolfie@wolfschanze: ~/test/$ ./asklist-select

1) slinstall.tar.gz 3) teSt.Tar.gZ 5) Cancel
2) slmini.tar.gz 4) TEST.TAR.GZ
Select file: blablabla
Select file:



Функция целиком:

ask_list() #$1 - list #$2 - header
{
    LIST_BUF=$1
    LIST_BUF="$LIST_BUF""Cancel"
    LIST_BUF=`echo -e "$LIST_BUF"|sed 's/\n/ /'`
    
    PS3=$2
    
    echo
    select LIST_RET in $LIST_BUF; do
	if [ -n "$LIST_RET" ];then
	    break
	fi
    done
    
}


Пример вызова функции:

ask_list "$TARGZ" "Select file: "

if [[ "$LIST_RET" == "Cancel" ]]; then
    echo "Cancelled by user!"
    exit
fi

echo "User select: $LIST_RET"


Результат:

smallwolfie@wolfschanze: ~/test/$ ./asklist-select

1) slinstall.tar.gz 3) teSt.Tar.gZ 5) Cancel
2) slmini.tar.gz 4) TEST.TAR.GZ
Select file: 5
Cancelled by user!


smallwolfie@wolfschanze: ~/test/$ ./asklist-select

1) slinstall.tar.gz 3) teSt.Tar.gZ 5) Cancel
2) slmini.tar.gz 4) TEST.TAR.GZ
Select file: 3
User select: teSt.Tar.gZ


Скрипт на GitHub
Скрипт на PasteBin

Второй вариант, быдлокодерский, с жирным башизмом, более длинный, но красивее смотрится на экране.

Под катом )

Источники


Взаимодействие bash-скриптов с пользователем. Часть 2

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/13/prostoj-interaktiv-v-bash-skriptah-chast-2-spiski-menyu/

Tags: ,
Простой интерактив в bash-скриптах

Преамбула


Иногда полезно иметь в своих скриптах элемент интерактивного взаимодействия с пользователем, например, запросить с клавиатуры некую строку (путь, пароль, имя пользователя и т.д.), или получить от пользователя подтверждение действия (Вы уверены? [Y/n]). Далее покажу простейшие случаи.

Ввод строки


Все, кто хоть раз пользовался для создания нового пользователя скриптом adduser, наблюдали на экране следующую картину:

Login name for new user []: wolfkid

User ID ('UID') [ defaults to next available ]:

Initial group [ users ]:
...
Home directory [ /home/wolfkid ]

Shell [ /bin/bash ]

Expiry date (YYYY-MM-DD) []:


Понятно, что где-то можно (и нужно) ввести свои данные, а где-то согласиться с предлагаемыми скриптом по умолчанию (или не согласиться, ввести свое).

Вопрос, как такое сделать в своем скрипте?

В данном случае можно воспользоваться командой read.

Общий синтаксис:

read [ПАРАМЕТРЫ] [ПЕРЕМЕННАЯ]

Если имя переменной не будет указано, то, что было введено с клавиатуры попадет в специальную переменную $REPLY.

Обратите внимание: в команду read имя переменной подставляется без символа $. Т.е. если вы хотите, чтоб введенная строка оказалась в переменной VAR1, то синтаксис такой:

read VAR1

Функция для ввода строки с возможностью оставить значение по умолчанию.


Напишем функцию, которая будет принимать два параметра - строку с пояснением, что мы хотим, чтоб пользователь ввел, и строку, которая будет представлять значение по умолчанию. В случае, если пользователь что-то ввел, то функция запишет в переменную $STR_RESULT новое значение. Если же пользователь просто нажмет Enter, то в $STR_RESULT будет записано значение, переданное во втором параметре.

ask_string() #1-user ask string, #2-default variant
{
    read -r -p "$1 [$2]:"
    
    if [ -z "$REPLY" ]; then
	if [ -n "$2" ]; then
	    STR_RESULT=$2
	fi
    else
	STR_RESULT=$REPLY
    fi
}


Небольшое пояснение по используемым параметрам read:

-r - отключает режим интерпретации эскейп-последовательностей, т.е. \n, \r, \t и т.д. не будут записаны в переменную, как символы возврата каретки, перевода строки или табуляции, а будут восприниматься, как символьные последовательности - слэш и буква.
-p [СООБЩЕНИЕ] - СООБЩЕНИЕ, это строка, которая будет выведена пользователю перед тем, как он сможет ввести данные.

Пример вызова функции:

ask_string "Select path" "/home/smallwolfie/test/testdir"
echo $STR_RESULT


Вывод:
Пользователь нажал Enter, оставив значение по умолчанию:
smallwolfie@wolfschanze:~/test/input01$ ./askstring
Select path [/home/smallwolfie/test/testdir]:
/home/smallwolfie/test/testdir


Пользователь ввел другое значение:
smallwolfie@wolfschanze:~/test/input01$ ./askstring
Select path [/home/smallwolfie/test/testdir]:/tmp
/tmp


Готовый скрипт на GitHub
Готовый скрипт на PasteBin

Запрос Да/Нет


Обычный запрос Вы уверены [Y/N]. Для удобства использования (т.е. копипаста в другие скрипты) тоже можно реализовать в виде отдельной функции, которой передается один параметр - строка с вопросом для пользователя:

ask_y_n() #$1 - question
{
    echo -n "$1 [Y/N]: "
    while [ 1 -eq 1 ];do
	read -s -n1
	
	case "$REPLY" in
	    [yY])
		echo
		return 0
	    ;;
	    [nN])
		echo
		return 1
	    ;;
	esac
    done
}


Пояснения:

1. Командой echo -n "$1 [Y/N]: " выводим пользователю сообщение с пояснением, что надо нажать (Y или N). Параметр -n в команде echo запрещает ей переводить курсор на новую строку. Опцией -p команды read не пользуемся для красоты, иначе сообщение будет выскакивать при каждом нажатии клавиши, и заполнять экран.
2. Организуем бесконечный цикл:
while [ 1 -eq 1 ];do
#...
done

Единица всегда равна единице, поэтому цикл не завершится, если не будет какого-то прерывания внутри цикла.
3. В начале цикла вставляем команду read со следующими параметрами:
-s - не отображать вводимые пользователем символы на экране
-n1 - читать 1 символ, и завершаться, не дожидаясь нажатия клавиши Enter.
4. Далее в операторе case проверяем, что было нажато: если Y или y, то пользователь ответил "да", если N или n - "нет". Ну не заставлять же пользователя регистр символов отдельно проверять... Возвращаем соответствующий код возврата 0 для "да", 1 для "нет"

Пример вызова функции:

ask_y_n "Run it?"

if [ "$?" -eq 0 ];then
    echo "User replied YES!"
else
    echo "User replied NO :("
fi


Вывод:

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

smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:


Пользователь ответил "Нет":
smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:
User replied NO :(


Пользователь ответил "Да":

smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:
User replied YES :)


Скрипт на GitHub
Скрипт на PasteBin

Источники


Внутренние команды bash

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/11/prostoj-interaktiv-v-bash-skriptah/

Tags: ,
N-ART N 2 2019

Маффынка. Прислали нам такой вот арт, от нашего постоянного автора. Не знаю, как вам, но меня чем-то зацепило, посему опубликую.



Вызовет попоболь у Печальной Коровы, да и хер с ней.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/09/n-art-n-2-2019/

Linux. Получение списка файлов по маске с игнорированием регистра символов имени файла.

Преамбула


Всем известна команда ls, выводящая список файлов на консоль. Если требуется вывести только файлы с расширением .iso, то в команду подставляется маска файла: ls *.iso
И все бы хорошо, но команда ls, как и другие команды Linux, любит строгое совпадение регистра имен файлов, т.е. если в каталоге есть файлы с расширением .ISO, .Iso и .iso, то ls *.iso выдаст только те, которые с расширением именно что .iso, и проигнорирует остальные. А вот Windows регистр имен файлов глубоко пофиг, хотя, современные версии Windows и сохраняют регистр в имени файлов. Но для аналогичной линуксовой команде ls команды Windows dir, что .ISO, что .Iso, что .iso - равнозначны, и все командой dir *.iso будут выведены.

Чем воспользоваться?


Можно воспользоваться мощной командой find, которая умеет игнорировать регистр имен файлов (на самом деле, она кучу всего умеет, см. в источниках):

find <path> -maxdepth 1 -iname <mask>

где:
<path> - путь к каталогу, в котором производится поиск.
-maxdepth 1 - глубина поиска 1 - только в текущем каталоге, без параметра -maxdepth - во всех подкаталогах и ниже.
-iname - игнорировать регистр имени файла.
<mask> - маска файла

Чтобы обрезать полный путь (а find выдает полный путь к файлу(-ам)) до имени, можно воспользоваться командой

basename <path>

где

<path> - полный путь к файлу

Объединить работу двух команд можно с помощью цикла for

Решение


Создадим отдельную функцию create_list(), принимающую два параметра - путь к каталогу и маску файла, и выдающую список файлов в переменную $FOUNDLST:

create_list() #$1 - dir, $2 - file mask
{
    FOUNDLST=""
    for FLE in $(find $1 -maxdepth 1 -iname $2); do
	if [ -n "$FLE" ]; then
	    FOUNDLST="$FOUNDLST"`basename $FLE`"\n"
	fi
    done
}


Пример использования функции


DIR1="/home/smallwolfie/test/archives"
DIR2="/home/smallwolfie/test/isos"
...
create_list $DIR1 "*.tar.gz"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR1 *.tar.gz not found"
else
    TARGZ=$FOUNDLST
fi

create_list $DIR2 "*.iso"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR2 *.iso not found"
else
    ISO=$FOUNDLST
fi

create_list $DIR2 "*.zip"

if [ -z "$FOUNDLST" ]; then
    echo "$DIR2 *.zip not found"
fi

echo "*.tar.gz:"
echo -e -n "$TARGZ"
echo "-----------"
echo "*.iso:"
echo -e -n "$ISO"


Результат


Ясно, что в тестовой директории archives должны лежать архивы *.tar.gz, а в isos - образы *.iso

/home/smallwolfie/test/archives *.zip not found
*.tar.gz:
one.tar.gz
two.tar.gz
teSt.Tar.gZ
TEST.TAR.GZ
-----------
*.iso:
lamantin.iso
ariar-01-05-2019-install.ISO
smallwolfie@wolfschanze:~/test$


Готовый скрипт


На GitHub
На PasteBin

Источники


1. Команда find в Linux Копия
2. basename
3. Цикл for в bash

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/05/07/linux-poluchenie-spiska-fajlov-po-maske-s-ignorirovaniem-registra-simvolov-imeni-fajla/

Tags: ,
Из диалогов

- Я тут бухал, теперь у меня все так хуево болит.
- А что, может болеть ХОРОШО?

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/04/23/iz-dialogov/

Рассказывают тут про работу в "Мираторге".

Суть в чем, контора ищет себе рабочих в других регионах, объявления о работе веерно раскидываются по всевозможным сайтам, а потом вдруг получается что-то такое:

Мираторг, это хорошо разрекламированная организация. По телефону обещают 3-х разовое питание. На самом деле, один обед

Обещают бабло, но не факт, что ты попадешь на трактор и хорошо оплачиваемые работы. На учебу ты поедешь, за свой счет.

Домой попадешь в октябре. Если попадешь на трактор и через месяц захочешь домой, тебе найдут подмену, но обратно на трактор не сядешь. Там на Маниту, один работает 5 месяцев, за 30.

Жилье общага

Ты будешь приходить туда, только спать. Работа сутки, через сутки. За сутки два часа на сон, с 3 до 5.
[Хотя трактористу, водителю нельзя работать более 8 часов, прим. ред.] Дольше работа двигателя на холостом ходу, считается пережог. Соответственно штраф за соляру.

Сможешь сутки, через сутки? Работаешь в поле, привозят обед и ужин. Хорошо, если работает кондей, а так ужин скисает. Один работяга, поработал в том году, потом прошел курс лечения желудка, за 40 с копейками. Теперь на таблетках.

Я поехал с напарником, он отдал чистую трудовую, чтобы не заморачиваться с увольнением. Его хватило с 29 марта до 6 апреля. 11 апреля мне оплатили 8599 руб. за 5 дней на базе по 8 часов, по наряду и 2 дня на ферме по путёвкам, по 10 и 11 часов.

Если у тебя нет семьи и не чего терять, можешь сгонять, в разведку. Может хапнешь бабла

Моя жена сказала: лучше дома за 30,чем там за обещанные "миллионы". Нам также сказали: куда вас х.. принес? Что ближе, работы нет?

Обидно, только что со службы занятости снялся, из-за этой помойки


Это вот из личной переписки.

Еще ссылка по теме

Мираторг, мы наябываем людей!

Прикольно, ГОРФ же.

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/04/23/rasskazyvayut-tut-pro-rabotu-v-miratorge/

N-ART N 1 2019

На самом деле, тема 2003 года, и не дорисована, потому что парень, который рисовал, успел умереть, так что вот как-то так. Немного подчистил оригинал.



RAW'ы со сканера

Цветной вариант под катом. )

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/04/22/n-art-n-1-2019/

Интересный способ определить, является ли раздел активным (стоит ли флаг boot)

В Linux, с помощью dd.

Делается это вот такой огромной командой:

PARTREC=$(dd if=$DEV bs=1 count=16 status=none skip=$((0x1BE + 16 * ($PART - 1) )) | od -t x1 -A n |awk '{print $1}')

В переменную $DEV записывается устройство (например /dev/sda), а в переменную $PART - номер раздела, например 1 для /dev/sda1, потом проверяем, что накапало в $PARTREC - если там будет 00 - флаг boot для раздела не установлен, раздел неактивен, если 80 - раздел активный, если что-то еще, ну или с разделом что-то странное, или попытались установить флаг boot логическому разделу. Внезапно, gparted может такое сделать, хотя смысла в этом нет - активным разделом может быть только основной, но не логический и не расширенный.

В принципе, способ логичный - информация о флагах хранится в таблице разделов, надо только знать, как вычислить, а dd может выдернуть нужный байт откуда угодно. Далее od преобразует байт в удобочитаемую форму в шестнадцатеричном виде, забираем значение первого байта awk'ой и проверяем.




Тестовый скрипт


1. На GitHub
2. На PasteBin

Источники


1. The MBR (master boot record) and the Partition Tables. Там как раз подробное описание, как оно выковыривается.
2. Нашел здесь

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/04/21/interesnyj-sposob-opredelit-yavlyaetsya-li-razdel-aktivnym-stoit-li-flag-boot/

Tags: , ,
Back Viewing 0 - 20