Можно сказать, что номерследующий N-ART за 2019 г.
Джва года ждал этой картинки. Нарисовано вручную, и так, скорее всего, пойдет без изменений на новую футболку #2. Разве что текст добавлю.
Остальные файлы здесь
Можно сказать, что номерследующий N-ART за 2019 г.
Джва года ждал этой картинки. Нарисовано вручную, и так, скорее всего, пойдет без изменений на новую футболку #2. Разве что текст добавлю.
Остальные файлы здесь
Вопрос был задан студенту-первокурснику преподом на зачете по 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
.
Есть и более элегантное решение.
Почему-то много написано, про то, как относительный путь преобразовать в абсолютный, или же получить абсолютный путь к текущему каталогу, а как получить относительный путь из одного каталога в другой, еле нашел.
Скажем, есть 2 каталога, известны полные пути:
/tmp/test/dir1/subidr1/startpoint
и /tmp/test/dir2/subdir2/endpoint
, надо получить относительный путь из каталога startpoint
в каталог endpoint
Проще всего получить относительный путь командой 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
qaru.site — там предлагаются и другие способы, разной степени велосипедности, например, использовать Python или получать относительный путь исключительно средствами оболочки (на мой взгляд, неудобно, и можно где-нибудь накосячить).
Навели тут на автобиографическую книгу какого-то известного ранее ЖеЖиста, охрененная штука оказалась, дико контркультурная, почти что Баян Ширянов, и собственно да, вещества и секс в книге присутствуют в полном объеме. Говорят, автор жив до сих пор, не торчит, у него жена, дети и бизнес.
Книга была в виде сайта на «Народе», но проклятые хуяндексовские цензоры ее снесли. Благо добрые люди дали ссылку на Вебархив.
Однако, у автора местами вырвиглазные фоны, прям-таки вениаминные, так что я собрал все это дело в ПДФ-ку, чтоб читать было удобнЕй!
Правда без содержания и навигации, но мне просто лень. Если кто-нибудь сделает, буду рад. А вообще, кто связывался с Флибустой — лучше сделать FB2, и залить туда.
Очередная заметка «от склероза». Товарищ is3@ljr посоветовал добавить скриншоты в 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.
В 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
Организуем это дело в виде отдельной функции 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
Иногда полезно иметь в своих скриптах элемент интерактивного взаимодействия с пользователем, например, запросить с клавиатуры некую строку (путь, пароль, имя пользователя и т.д.), или получить от пользователя подтверждение действия (Вы уверены? [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 ask YES!" else echo "User ask NO :(" fi
Вывод:
Пользователь не нажал ничего, или нажал что-нибудь кроме YyNn
:
smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:
Пользователь ответил «Нет»:
smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:
User ask NO :(
Пользователь ответил «Да»:
smallwolfie@wolfschanze:~/test/input02$ ./askyn
Run it? [Y/N]:
User ask YES :)
Скрипт на GitHub
Скрипт на PasteBin
Всем известна команда 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$
1. Команда find в Linux Копия
2. basename
3. Цикл for в bash
— Я тут бухал, теперь у меня все так хуево болит.
— А что, может болеть ХОРОШО?
Суть в чем, контора ищет себе рабочих в других регионах, объявления о работе веерно раскидываются по всевозможным сайтам, а потом вдруг получается что-то такое:
Мираторг, это хорошо разрекламированная организация. По телефону обещают 3-х разовое питание. На самом деле, один обед
Обещают бабло, но не факт, что ты попадешь на трактор и хорошо оплачиваемые работы. На учебу ты поедешь, за свой счет.
Домой попадешь в октябре. Если попадешь на трактор и через месяц захочешь домой, тебе найдут подмену, но обратно на трактор не сядешь. Там на Маниту, один работает 5 месяцев, за 30.
Жилье общага
Ты будешь приходить туда, только спать. Работа сутки, через сутки. За сутки два часа на сон, с 3 до 5. [Хотя трактористу, водителю нельзя работать более 8 часов, прим. ред.] Дольше работа двигателя на холостом ходу, считается пережог. Соответственно штраф за соляру.
Сможешь сутки, через сутки? Работаешь в поле, привозят обед и ужин. Хорошо, если работает кондей, а так ужин скисает. Один работяга, поработал в том году, потом прошел курс лечения желудка, за 40 с копейками. Теперь на таблетках.
Я поехал с напарником, он отдал чистую трудовую, чтобы не заморачиваться с увольнением. Его хватило с 29 марта до 6 апреля. 11 апреля мне оплатили 8599 руб. за 5 дней на базе по 8 часов, по наряду и 2 дня на ферме по путёвкам, по 10 и 11 часов.
Если у тебя нет семьи и не чего терять, можешь сгонять, в разведку. Может хапнешь бабла
Моя жена сказала: лучше дома за 30,чем там за обещанные «миллионы». Нам также сказали: куда вас х.. принес? Что ближе, работы нет?
Обидно, только что со службы занятости снялся, из-за этой помойки
Это вот из личной переписки.
Мираторг, мы наябываем людей!
Прикольно, ГОРФ же.
В 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. Нашел здесь
Принесли мне тут в починку компьютер с наглухо залитыми эпоксидкой USB портами (безопасность же) и поставили задачу переустановить винды, в связи с заменой сгоревшего HDD на новый. По счастью сетевой порт был, так что единственным доступным способом доставить туда винды, был PXE. Но, в данном случае, речь пойдет не о PXE.
Зная клиента, который, несмотря на солидность, периодически «придет, и молча уронит все», я подумал, что так дело не пойдет. Надо предусмотреть возможность восстановить если что, ОС прямо с компьютера. Чтоб клиент не бегал вокруг меня, если уронит винду из-за кривого ПО/рук.
Всем хорош образ загрузочного диска Acronis True Image, и копию ОС сделать может, и восстановить может, и Зону Безопасности (скрытый раздел для хранения бэкапов) создать может. Не может лишь одного — установить свой загрузчик, чтобы можно было сделать «Восстановление при загрузке».
В десктопной платной версии такая функция есть, а в Recovery CD буржуи ее вырезали. Но мы не дворяне, справимся.
Внимание! Все нижеследующее работает для компьютеров с BIOS (или в Legacy-режиме) с MBR-дисками.
— Загрузчик syslinux
. Можно взять здесь. Я пользовался версией 4.02, которая мне уже была знакома по настройке PXE-сервера. Из архива нам понадобятся только некоторые файлы, но я уже собрал готовый пакет, ссылка на который будет в конце заметки. Вместо syslinux
можно использовать какой-нибудь другой загрузчик, который умеет грузить ISO-образы (например grub2
или grub4dos
), но далее все будет про syslinux
.
Примечание: Вообще syslinux
, это набор загрузчиков на разные случаи жизни. Он включает в себя pxelinux
(для загрузки из сети), isolinux
(для создания загрузочных ISO) и extlinux
, для установки загрузчика на жесткий диск. Но, с 4 версии постановили extlinux
и syslinux
считать одним и тем же [1], так чтоб никого не путать, далее буду называть все syslinux
‘ом
— Какой-нибудь маленький live-дистрибьютив Linux. Я использовал уже довольно пожилой Puppy Slacko 5.5 Rus, немного модифицированный когда-то давно под работу с tcplay
— Собственно сам образ Acronis True Image Recovery CD. Использовал старый, от Acronis True Image 2011, потому что он довольно небольшой (122 Мб против 522 от Acronis True Image 2015, например). Поскольку это софтина проприетарная, пользуйтесь гуглем и торрентами.
Я все делал на чистом диске, так что мне было просто.
В начале диска создаем основной раздел EXT2 или EXT3, в котором будет установлен загрузчик, лежать образ Acronis True Image, а у меня еще и дистрибьютив Puppy Slacko, чтоб чуть что можно было загрузиться в обход основной ОС. Делаем с помощью любимого менеджера дисков (я пользовался Acronis Disk Director).
Структура разделов должна выглядеть как-то так:
Желательно сделать раздел для нашего будущего загрузчика в начале диска, чтоб потом не было эксцессов. Когда экспериментировал с этим делом первый раз, Acronis, при создании Зоны безопасности, нагло передвинул раздел, и все пошло прахом.
Syslinux, на самом деле, можно ставить и в логические разделы, только это сопряжено с большими телодвижениями (см. в источниках в конце заметки).
Установим Windows на свободное место. Установщик Windows 7 и выше сам создаст необходимые разделы под свой загрузчик (bootmgr
и настройки) и основной раздел с ОС. После установки Windows структура диска должна выглядеть так:
Сборка пакета для установки загрузчика
Просьба линуксоидам камнями не кидаться, «пакет», в данном случае, не совсем то, что подразумевается под пакетом в терминах Linux-систем. В данном случае, это набор файлов, который необходим для установки syslinux
на целевой машине. Я делал это на «большом» Линуксе, но можно делать это и на том же самом Puppy (и даже в Windows, хотя на практике я не проверял). Ленивые могут пропустить этот шаг, готовый пакет будет в конце заметки.
1. Создаем в удобном месте подкаталог, например slinstall
, там будет готовый набор файлов для целевой машины.
2. В другой подкаталог распаковываем архив с syslinux
(например, syslinux-4.02.tar.gz
), в нашем примере подкаталог будет называться sysl-distr
3. Копируем в каталог slinstall
файл extlinux
из каталога sysl-distr/extlinux
— это установщик загрузчика.
4. Создаем в каталоге slinstall
подкаталог mbr
и копируем туда файлы sysl-distr/mbr/mbr.bin
и distr/mbr/altmbr.bin
5. Создаем в каталоге slinstall
подкаталог modules
и копируем туда модули загрузчика.
Syslinux, на самом деле, не просто загрузчик, а, можно сказать, целая маленькая операционная система. Функции загрузчика расширяются модулями — файлами специального формата, которые загрузчик может выполнять, примерно как ОС исполняемые файлы. Файлы эти имеют расширение c32
(*.c32
). Минимальный набор модулей для нашей задачи — модуль отображения меню menu.c32
и модуль chain.c32
— он передает загрузку другим (не-Linux) операционным системам, загрузчикам, или просто в нужный раздел диска. Но можно скопировать и другие модули, если захочется расширить функционал начальной загрузки. Необходимо найти нужные файлы (через поиск mc
в Linux или любым удобным способом) в каталоге sysl-distr
и скопировать их в slinstall/modules
В Линукс это можно сделать из командной строки так (находясь в каталоге sysl-distr
):
find ./ -name "*.c32"|xargs -I {} cp '{}' /home/user/slinstall/modules
где /home/user/slinstall/modules
— полный путь к подкаталогу slinstall/modules
6. В slinstall/modules
необходимо также скопировать специальный модуль memdisk
, предназначенный для загрузки ISO-образов. Обычно расположен по пути memdisk/memdisk
в каталоге с распакованным syslinux
(тут sysl-distr
).
7. Пакет готов, теперь можно запаковать его в архив, и приступать к установке загрузчика.
В Linux можно выполнить (выйдя из каталога slinstall
на уровень выше)
tar -czvf syslinux-install.tar.gz ./slinstall
Предположим, у нас есть загрузочная флешка с Puppy Linux (или другим Linux на ваш вкус), копируем на нее образ Acronis True Image, выше созданный пакет с загрузчиком, и архив с дистрибутивом самого Puppy (см. ниже, в разделе «Скачать»).
В графическом интерфейсе все можно делать мышью, я приведу ниже консольные команды. В данном примере флешка — sdb1
, а созданный ранее раздел — sda1
Внимание! Не ошибитесь в том, как именованы разделов на конкретной машине!
1. Создаем точки монтирования (пропустить шаг, если запущен графический интерфейс Puppy. Просто щелкнуть мышью по нужной иконке диска на desktop’е)
mkdir /mnt/sda1
mkdir /mnt/sdb1
2. Монтируем диски (пропускается из графического интерфейса):
mount -t ext3 /dev/sda1 /mnt/sda1
mount -t vfat /dev/sdb1 /mnt/sdb1
Может быть нужным заменить ext3
на ext2
и/или vfat
на ntfs
в зависимости от используемых файловых систем.
3. Создаем директорию для образа Acronis True Image Recovery CD на разделе sda1
и копируем образ.
mkdir /mnt/sda1/acronis
cp /mnt/sdb1/loader.iso /mnt/sda1/acronis/
4. Копируем и распаковываем дистрибутив Puppy (если он нужен)
cp /mnt/sdb1/puppy-slacko-rus-5.5-hexmod.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf puppy-slacko-rus-5.5-hexmod.tar.gz
rm puppy-slacko-rus-5.5-hexmod.tar.gz
5. Копируем и распаковываем пакет установки syslinux
:
cp /mnt/sdb1/ syslinux-install.tar.gz /mnt/sda1/
cd /mnt/sda1
tar -xvf syslinux-install.tar.gz
rm syslinux-install.tar.gz
syslinux
производится не на устройство, а на заранее смонтированный раздел. Загрузчик нельзя устанавливать в корень диска, необходимо создать для него каталог, например /boot/syslinux
. Не перепутайте разделы диска, куда устанавливаете загрузчик! Раздел с загрузчиком должен иметь файловую систему FAT, ext2, ext3, ext4 или Btrfs
1. В любимом менеджере дисков делаем раздел EXT2/EXT3 активным.
2. Загружаемся, если еще не, в live-дистрибьютив Linux.
3. Создаем точку монтирования и монтируем раздел (если еще не сделано)
mkdir /mnt/sda1
mount -t ext3 /dev/sda1 /mnt/sda1
4. Создаем каталог для загрузчика:
mkdir -p /mnt/sda1/boot/syslinux
ключ -p
указывает команде mkdir
, что нужно создавать путь со всеми подкаталогами.
5. Создаем каталог для модулей и копируем их:
mkdir -p /mnt/sda1/boot/syslinux/modules
cp /mnt/sda1/slinstall/modules/* /mnt/sda1/boot/syslinux/modules
6. Переходим в каталог slinstall
и устанавливаем загрузчик:
cd /mnt/sda1/slinstall
./extlinux --install /mnt/sda1/boot/syslinux
Если все сделано верно, последняя команда выдаст сообщение:
/mnt/sda1/boot/syslinux is device /dev/sda1
В каталоге /mnt/sda1/boot/syslinux
должен находиться файл ldlinux.sys
, кстати, неудаляемый. В [1] написано, как его, если что, удалить.
Syslinux, внезапно, сам не умеет прописываться в MBR диска, да и в загрузочный сектор раздела. Так что если перезагрузиться сейчас, то получим при загрузке сообщение Boot error
и глухое зависание. MBR, к сожалению, придется править вручную, с помощью команды dd
.
Внимание! Команду dd
не зря называют Disk Destroyer, будьте с ней очень осторожны! При ошибке легко можно похерить не только MBR, но и таблицу разделов, и данные на диске!
MBR находится в первых 440 байтах на диске.
1. Переходим в каталог slinstall
:
cd /mnt/sda1/slinstall
(естественно, точка монтирования должна быть создана, а раздел примонтирован).
1. Создаем копию текущей MBR:
dd if=/dev/sda of=old.mbr bs=440 count=1
В текущем каталоге должен появиться файл old.mbr
размером 440 байт. Можно, и даже желательно, указать и какой-нибудь другой путь к файлу old.mbr
, сохранив его, например, на флешке:
dd if=/dev/sda of=/mnt/sdb1/old.mbr bs=440 count=1
2. Устанавливаем MBR syslinux
:
dd bs=440 count=1 conv=notrunc if=mbr/mbr.bin of=/dev/sda
Примечания:
Краткое пояснение по команде dd
:
bs=<число>
— сколько байт необходимо прочитать.
count=<число>
— число уазывает на то, сколько раз будет прочитано количество байт, указанное в параметре bs=
if=<путь к устройству или файлу>
— откуда будут прочитаны данные
of=<путь к устройству или файлу>
— куда будут записаны данные
Осталось сделать загрузочное меню.
Вот пример загрузочного меню, главное, правильно установить раздел с загрузчиком винды — в syslinux отсчет разделов ведется с единицы (0 — MBR жесткого диска), отсчет дисков с ноля, и надо помнить, что единица таймера загрузки syslinux равна 0.1 секунде.
ui modules/menu.c32 PROMPT 0 menu title Local boot LABEL windows menu label Microsoft Windows 7 kernel modules/chain.c32 append hd0 2 timeout 1000 TEXT HELP Loading Windows 7 ENDTEXT LABEL recovery menu label System recovery kernel modules/memdisk initrd ../../acronis/loader.iso append iso raw LABEL slacko menu label Puppy Linux Slacko 5.5 kernel ../../slacko/vmlinuz initrd ../../slacko/initrd.gz
Осталось загрузиться с жесткого диска, создать зону безопасности Acronis и сделать бэкап первых трех разделов в нее
1.Syslinux (Русский)
2. Comboot/chain.c32
3. Syslinux wiki
puppy-slacko-rus-5.5-hexmod.tar.gz
syslinux-install.tar.gz
syslinux-mini.tar.gz
По случаю понаезда к нам означенного в заголовке товарища.
У него, однако, вышла книга стихов. Давно вышла, но до редакции дошла только сейчас, посему исправляю досадное упущение и нагло пиарю товарища на сайте.
В.Б. активный УФОшник и член нашего общества «Дельта». Как и все поэты и УФОшники, ебанут наглухо, но в правильную сторону. Старые стихи есть на LJR в блоге hronos@ljr, можете ознакомиться (из ГОРФ через прокси или VPN).
Видео с презентации книги:
https://www.youtube.com/watch?v=4VCnKEF68wE
Саму книжку можно взять на «Озоне», купите, поможете автору.
Slackware, почему-то загружается по умолчанию с отключенной цифровой клавиатурой, еще и благополучно плюет на опцию Boot Up Numlock в BIOS, благо все это, как оказалось, легко поправить. Раньше было не так актуально, но завелся на работе ноут с полноценной клавой с цифровым блоком. Так что заметка опять же от склероза.
Надо помнить, что у нас как минимум 6 терминалов (которые переключаются по CTRL+ALT+F1 — F6), можно активировать цифровую клавиатуру для всех шести, таким вот простым скриптом:
#!/bin/bash for TTYNUM in 1 2 3 4 5 6; do /usr/bin/setleds -D +num < "/dev/tty$TTYNUM"; done
Сохраняем, например в /etc
, под именем, скажем, numlockon
, и дописываем в /etc/rc.d/rc.local
Можно вообще не делать отдельный файл, а прямо в rc.local
записать все в одну строку:
for TTYNUM in 1 2 3 4 5 6; do; /usr/bin/setleds -D +num < "/dev/tty$TTYNUM"; done
Кому почему-то первая версия не подходит, можно попробовать версию с ArchLinux вики, там активируется NumLock на консолях от tty0
до tty9
.
И даже такой вот говнокод, который оставлю тут ради эгеге, не знаю зачем оно может понадобиться.
Скачиваем и собираем утилиту numlockx
, она есть в репозиториях sbopkg
, например.
Потом останется прописать ее в автозагрузку для конкретного пользователя. Тут расскажу про XFCE, остальные будут в источниках.
1. Заходим в Applications —> Settings —> Session and Startup
2. Переходим на вкладку Application Autostart, нажимаем кнопку Add.
3. Заполняем название, описание, вписываем в соответствующее поле саму команду numlockx
:
4. Готово, закрываем все приложения и перезагружаем иксы:
1. man setleds
2. Activating Numlock on Bootup (Русский)
Да, эта информация есть много где в сети, но в некоторых версиях почему-то кое что пропущено, так что эта заметка из серии «от склероза».
Известно, что страница входа в админ-панель по умолчанию носит имя wp-login.php
(например tolik-punkoff.com/wp-login.php
), и в нее ломятся всякие противные боты и школохацкеры, с целью поломать сайт. Далее простой способ, как защитить сайт от этого. Всегда так делаю, вместе с другими мерами безопасности, конечно же. Из которых самый главный — регулярный бэкап.
Плюсы:
+ Дополнительные плагины не нужны.
+ Делается просто
Минусы:
— Для многопользовательского блога не подходит, но если админов немного — вполне (просто надо раздать всем ссылку на новую страницу входа).
— После глобального обновления WordPress будет слетать, и все придется делать снова.
1. Разлогиниваемся на сайте.
2. Скачиваем по FTP с сайта файлы
wp-login.php
wp-includes/general-template.php
3. Делаем резервную копию этих файлов.
4. Копируем wp-login.php
под каким-нибудь другим именем (ctulhu.dot.com.php
, 47767deedbeaf6587.php
, в общем сами придумайте что-нибудь уникальное).
5. Открываем получившийся файл в любимом текстовом редакторе (редакторе Far’а, mcedit’e, Notepad++) запускаем поиск и замену. Ищем wp-login.php
, меняем на новое имя странички входа. Сохраняем изменения
6. Повторяем предыдущий пункт для файла general-template.php
7. В файл wp-login.php
заменяем содержимое на следующий код:
<?php header('Location: http://natribu.org', true, 301); ?>
8. Убираем виджет авторизации с сайта.
9. Закачиваем измененные файлы обратно на FTP, заменяя старые версии.
К сожалению, если вы введете адрес yoursite.com/wp-admin
, то вас, и злоумышленника, перебросит на страницу авторизации. Самое простое решение — перекрыть доступ со всех IP, кроме доверенных, например, создав а каталоге wp-admin
файл .htaccess
со следующим содержимым:
order deny,allow
allow from 6.6.6.6
deny from all
где вместо 6.6.6.6
IP с которого будете заходить на сайт в админ-панель.
Повторюсь, заметка от склероза, на полноту и абсолютную правильность не претендует.
1. Копируем файл 90-keyboard-layout.conf
из /usr/share/X11/xorg.conf.d/
в /etc/X11/xorg.conf.d/
2. Смотрим варианты переключения клавиатуры:
grep "grp:.*toggle" /usr/share/X11/xkb/rules/base.lst
Выдаст примерно вот такой список:
grp:toggle Right Alt grp:lalt_toggle Left Alt grp:caps_toggle Caps Lock grp:shift_caps_toggle Shift+Caps Lock grp:alt_caps_toggle Alt+Caps Lock grp:shifts_toggle Both Shift keys together grp:alts_toggle Both Alt keys together grp:ctrls_toggle Both Ctrl keys together grp:ctrl_shift_toggle Ctrl+Shift grp:lctrl_lshift_toggle Left Ctrl+Left Shift grp:rctrl_rshift_toggle Right Ctrl+Right Shift grp:ctrl_alt_toggle Alt+Ctrl grp:alt_shift_toggle Alt+Shift grp:lalt_lshift_toggle Left Alt+Left Shift grp:alt_space_toggle Alt+Space grp:menu_toggle Menu grp:lwin_toggle Left Win grp:win_space_toggle Win Key+Space grp:rwin_toggle Right Win grp:lshift_toggle Left Shift grp:rshift_toggle Right Shift grp:lctrl_toggle Left Ctrl grp:rctrl_toggle Right Ctrl grp:sclk_toggle Scroll Lock
Выбираем понравившийся вариант, правим /etc/X11/xorg.conf.d/90-keyboard-layout.conf
Например, для раскладки en/ru с переключением по Ctrl+Shift.
Section "InputClass" Identifier "keyboard-all" MatchIsKeyboard "on" MatchDevicePath "/dev/input/event*" Driver "evdev" Option "XkbLayout" "us,ru" #Option "XkbVariant" "" Option "XkbOptions" "grp:ctrl_shift_toggle,terminate:ctrl_alt_bksp" EndSection
В российской редакции случайно произошел хронопрорыв в СССР
А вот не надо было совок и альтернативную физику обсуждать.
Собственно, рюмку «Шипра» я даже выпил на спор с Лехой, который имел честь посетить наш славный городок.
«Шипр», тащемта, абсолютно аутентичный, честно спертый с объекта во время ремонта.
В ЕС приняли цензурирующий Интернет говнозакон, и вообще, очебурашивание Интернета по всему миру идет полным ходом. ГОРФ, изначально скопировав, простите за каламбур, законы о копирайте у запада, а потом добавив туда коктейль из мнимой безопасности и черносотенных скреп, пока идет второй, или даже третьей (вперде, как минимум, КНДР и КНР). Евросовок пока отстает, посмотрим, что будет.
Но, не понаслышке зная скачки, ваш покорный слуга все-таки полагает, что неопытная, но рьяно начавшая заезд лошадь, все-таки скачки не выигрывает. И тут дело не в лошади (быдлочасти народа), и не в жокее (правительстве), а в неумелом расходе сил. Т.е. в распиле, откате, или даже просто раздолбайстве. Если от первого и второго можно попытаться избавиться, и то не факт, но с третьим с каждым годом будет все лучше и лучше (для правительства, конечно, хуже).
Не буду растекаться мысию по древу, просто расскажу старый случай из практики.
В 2010 году меня позвали в качестве сисадмина в одну государственную организацию, которой необходимо было срочно переходить на «электронный документооборот» с налоговой, Федеральным Казначейством, Пенсионным Фондом и кучей других контор. Заодно в силу вступил закон о персональных данных, и т.д., и т.п.
В результате в один не прекрасный день приехал директор с совещания в министерстве, и сказал, «Родина сказала «Надо!», ищите специалиста».
Буду краток — надо «уже вчера», а все инструкции писаны для москвы, где есть гигабитные каналы интернета, хорошие провайдеры и прочее и прочее…
У меня был непролазный лес, сгнившие столбы телефонных линий, которых пугался ADSL, мобильный интернет, обеспечивающий соединение, когда Марс в противостоянии с Сатурном, и если Венера в Стрельце, а Луна в Козероге.
Так вот, к чему я веду. Правительство, вместо того, чтобы сначала обеспечить и организовать инфраструктуру, все проверить, внедрить оптимизированное стандартное ПО (про ПО, с которым я работал, лучше не буду — даже zadolba.li порвется), просто раздало всем бумажку — надо было вчера.
Ладно, кто старое помянет, тому коннектор из порта. Все-таки сейчас не 2010, а 2019.
Решил я купить на прошедший Новый Год лотерейный билет. Купил заранее, на официально одобренном сайте государственной лотереи, как честный законопослушный гражданин.
В день розыгрыша захожу на сайт, и вижу следующую картину:
Вижу эту же картину еще 3 часа подряд (проверял и засекал).
А ведь это не политический «чебурнет», это живые деньги тех людей, которым государство запретило играть в автоматы (безотносительно того, хорошо это или плохо в принципе). Государство просто решило — если нельзя побороть (а склонность к азартным играм побороть может только сам игрок), то надо возглавить.
Вот и возглавили, как смогли. Я думаю, если бы у сайта ***тритопора, ****88***, казинопукан или других подобных «пиратских» сервисов произошел обвал исключительно из-за наплыва клиентов, которые ринулись проверять свой выигрыш, то сисадмин, как минимум, был бы распят владельцами сервиса, и даже без всяких трусиков. А вообще, такого бы не случилось.
Так что надежда на завтра остается. Распиздяйство и некомпетентность вполне могут победить высокодуховную скрепность.
Верю и надеюсь, что самой популярной в мире страной, станет республика, где в конституции будет прописано, что государство не имеет права вмешиваться в деятельность Интернета, кроме как ради предотвращения угроз для самого Интернета — борьба со спамом, вирусами, ботнетами и физическим повреждением каналов, а вся контент-политика определяется только владельцами сайтов. Причем хостер, т.е. фактический владелец «земли», может тоже прописать в условиях использования, что контент-политика определяется клиентом самостоятельно, а хостеру не до этого. Получится этакий цифровой Дикий Запад, и это будет хорошо.