LINUXI KASUTAMINE


  1. aprill 2020, rev: N04

IT-spetsialist kasutab Linuxi korduvate tüüpiliste toimingute tegemiseks (paigaldamine, konfiguratsiooni seadistamine, varundamine, huvipakkuva info otsimine ja sellest aruannete genereerimine jne) Neid ülesandeid täidetakse sageli samm-sammult juhiste abil, mida kirjeldatakse nn HOWTO dokumentides. Selline töö muutub aga kiiresti igavaks.

Etappe on võimalik automatiseerida, kasutades käsurea ja kirjutades skripte, mis kirjeldavad sisestatavate käskude järjestust ja käitumist, kui need ebaõnnestuvad.

Kui probleemi lahenduse saavutatakse vastates ainult ühele küsimusele, kasulikuks abiliseks on interneti otsingumootor (google, yandex, duckduckgo,...).

Kui vastust saavutatakse mitme juba teadaoleva fakti (asjad, reeglid, objektid...) kombineerimisega, tuleb need eelnevalt välja õppida (korraga teada).

Ülesanne: antud 10 numbrimärki ja loendamisreegel nn positsioonisüsteemis. Iga number tähistab loendatavate objektide arvu (jäärad, tikud, keefiripudelid (huvitav, kus te olete näinud keefiri klaaspudelites?)

  0 -- tühi   5 -- IIIII
  1 -- I      6 -- IIIIII
  2 -- II     7 -- IIIIIII
  3 -- III    8 -- IIIIIIII
  4 -- IIII   9 -- IIIIIIIII
  1. algseis: tühjad kastid (igaüks mahuga 9 pudelit (3x3)) on paigutatud horisontaalselt ritta. 9999 pudeli loendamiseks piisab nelja tühja kasti paigutamisest reas.

  2. Asetage pudel esimesse vabasse kasti paremalt poolt.

  3. Kui sellest kastist paremale, kuhu sa just pudelit panid, on üks või mitu täiesti täidetud kasti, siis asenda need laost võetud tühjade kastidega ja saada täidetud kastid keefirivagunisse (98, 99...100).

  4. Kui loendatav kaup saab otsa, saadakse loendatavate pudelite arvu p.1 (4 kasti reas sinu ees) kastide arvust, nt:

  ... ... ... ...
  ... ... ... ...  = 2023
  .oo ... .oo ooo
  1. Kirjutage skript, mis illustreerib näidatud loendusalgoritmi.
  2. Muutke arvusüsteem kaheksand süsteemiks.
  3. Muutke arvusüsteem kuueteistkümnend süsteemiks.
  4. Muuda numbrisüsteem kahendsüsteemiks.

 ~

**TIHTIPEALE UNIXI KASUTAMINE ON INTERNETIS LEITUD LAHENDUSE TÕLKIMINE SKRIPTIMISKEELDE.

Tavaliselt tuleb HOWTO-dokumendi skripti keelde tõlkimise käigus välja mõelda kuidas muuta konfiguratsioonifaile skriptiga. See samm kordub sageli järgmise mustri järgi:

  1. Leidke rida, kus on "here_it"

  2. Asendage sõna "selline" sõnaga "see". Mõnikord tuleb teha mitu asendust erinevate paaride jaoks ("nii_1" asendatakse "nõnda_1", "nii_N" asendatakse "nõnda_N")

  3. Korrake p.1 ja p.2 uute otsingufragmentide jaoks failis ("see_siin_1",... "see_siin_M"), otsige stringis ("selline"), asendage stringis ("see").

  4. Salvestada tehtud muudatused, väljuda failist ja jätkata käskude täitmist.

Tekstifragmendid "siin_see...", "selline...", "sarnane..." määratletakse regulaaravaldiste abil ja seadistusfaili muutmise protsess toimub tekstiredaktori abil. Täielikult skriptipõhised tekstiredaktorid on näiteks ed, sed (mugav on kasutada perl'i sed-režiimis):

perl -pe 's/selline/see/g'

Soovitud stringi otsimiseks saab kasutada grep -P või jälle ed. Kui töötatakse "mitte päris redaktorite" abil nagu sed, awk, perl,... käsud on ühendatud torudega.

Teine sagedane muster on "do or die". See põhineb sisseehitatud skriptikeele omadusel, seda nimetatakse laiskaks hindamiseks (lazy evaluation, https://www.tutorialspoint.com/functional_programming/functional_programming_lazy_evaluation.htm). Tõepoolest milleks arvutada die funktsiooni, kui do tagastab true ja väljendi tulemus on juba teada (true):

do die tulemus näide
false xxx@ false lõppu teada saamiseks tuleb filmi lõpuni vaadata.
true xxx true - see on selge juba poole pealt, edasi ei pea lugema.

@) xxx -- ei huvita (don't care). Siinkohal on asjakohane märkida, et sh keeltes true on 0 ja false 1. Siiski:

$ expr 0 \| 0; echo $?
0
1
$ expr 0 \| 1; echo $?
1
0
$ expr 1 \| 0; echo $?
1
0
$ expr 1 \| 1; echo $?
1
0

 ~

Põhinev Reeglitele

120 unix käsku, 5 toru, 12 ed käsku annavad mitte 137 uut funktsiooni, vaid 7200 (120 x 5 x 12). Seda tuleks arvesse võtta, kui "googeldada" õiget lahendust.

 ~

Regulaaravaldised (regex)


. -- mis tahes märk

?*+ -- kordaja (? 0-1, * 0..many, + 1..many)

() -- grupp (tegu või backreference\1..\9)

[] -- tähemärkide hulk: nt [azA-Z5] tähed a, z, kõik suured ladina tähed ja number 5. Paremalt poolt avanevast nurksulust võib kasutada ka sümbolit ^ -- kõige sulgudes oleva tähemärkide eitus. Näiteks [^az] -- a ja z ei sobi.

{} -- kordaja:

^$ -- ankurid: ^ rea algus, $ rea lõpp

| -- või: (kass)|(koer)

Regulaaravaldiste kontrollmärkide (metasümbolite) lisamiseks ASCII tähemärkide tabelisse otsustati luua kaks tähemärkide ja metasümbolite tähestikku ning lülitada nende vahel ümber ussiaugumärgiga \ (escape symbol). Kasulik trikk: täitke metasümbolite tabelis olevad tühjad kohad regulaarmärkidega samas mõttes, nagu neid kasutatakse tähemärkide tabelis. Seega \a ja a on samad *1.

--

*1) You can use & in the replacement to refer to the matched text.. and a sufficiently-escaped backslash: "\\\\&"

https://unix.stackexchange.com/questions/425988/back-reference-to-the-matched-text-in-awk

--

Regulaaravaldiste õpetus siin

https://ryanstutorials.net/regular-expressions-tutorial/

Regulaaravaldiste algkursus ülessanete kogumik (kommenteeriv tekst vene keeles)

http://old.code.mu/tasks/php/regular/rabota-s-regulyarnymi-vyrazeniyami-v-php-glava-1.html

 ~

TORUD

toru kirjeldus
<< heredoc
< input from
` `
> write to
>> append to
2>&1 redirect stderr to stdout

 ~

ed

command format: ,command

1 the number of the first line
. current line number
$ the number of the last line

Nr. command description
1 // goto and print
2 s///g search and replace
3 c change the whole line
4 d delete
6 a append (after, 0a at the top)
7 p print
8 n print numbered
9 . exit insert mode
10 w write
11 q quit
12 Q force quit

Näided

d sama mis .d      \
,n sama mis 1,$n   \
-3,+3n             \

/regex_from/,/regex_to/s/search_regex/replace/g

 ~

Commands


adduser
awk
bg
cat
cd
chgrp
chmod
chown
chroot
clear
cp
date
dd
df
diff
dmesg
du
env
expr
fdisk
fg
find
for
free
fsck
gcc
gdb
grep
gzip
head
history
hostname
if
ifconfig
init
insmod
ip
job
kill
killall
ld
ldd
ln
ls
lsmod
lspci
lsusb
make
mkdir
mkfifo
mkfs
mkswap
modprobe
more
mount
mv
nice
nslookup
od
passwd
paste
patch
ping
poweroff
printf
ps
pwd
reboot
rm
rmmod
route
sed
seq
service
shutdown
sort
ssh
strip
su
sudo
swapoff
swapon
sync
systemctl
tail
tar
tee
test
time
top
touch
tr
traceroute
umount
uname
uniq
useradd
userdel
wc
wget
which
while
who
whoami
xxd

Translated with www.DeepL.com/Translator (free version)

Almost every command has configuration keys. The most useful ones can be found in the TL;DR documentation, or here

about Unix, 2012

and here:

https://ryanstutorials.net/linuxtutorial/

It is also useful to ask for help from busybox or play with the Unix history tapes:

about Unix, 2012

work on the PDP-11 simulator

magnetic tapes with Unix


** KOKKUVÕTE TEEMAL "USING UNIX" (LAISATE JAOKS. AGA NAGU KA "UNIXI PAIGALDAMISE" PUHUL, TÖÖ PEAB OLEMA PIKK, LIHTNE JA IGAV NING ANDMA AINULT PAAR PUNKTI OMA TULEMUSELE)****


Commands (120)


Täida puudiv tekst (...)

...

  1. command clear.
    Eesmärk:
    
    ..............
    
    

kasulikud võtmed:

...................

kasutamisnäided

...................
```
  1. env

...

 ~

Regular expressions


Give working examples of regular expression metacharacter usage, and specify where you can try them: Alpine console, Bullseye,...

  1. any character
  2. Repeaters
  3. Square brackets, ^ and - within []
  4. Round brackets
  5. Reverse references \1...\9 and |.
  6. Curly brackets and comma
  7. Anchors ^ and $.
  8. Lazy and greedy ?

 ~

Editing text.


Write the shortest possible script that gets text B from text A.

 ~

Appendix A. Working with TLDR


We start by installing the man package

apk add man-db man-pages

man is too long, let's install tldr (too long don't read)

We need to accumulate help on important Unix commands in the report.txt file. Let's do this in Alpine.

sudo apk add npm
sudo npm install -g tldr
tldr sed
tldr ls
tldr tree

You need to create a report file for SUMMARY-USEUNIX.md with tldr information about the listed commands.

  1. Select the necessary commands from the list of commands above. Create a script gettldr.
# cat raw | perl -pe 's/[ |\\]//g' | perl -pe 's/^(.*)$/echo "---"\necho "# \1"\necho "~~~"\ntldr \1/g" > gettldr
# chmod +x gettldr
# ./gettldr
  1. Log in PuTTY, including ESC terminal codes. Increasing the buffer length will also be useful:
PuTTY Configuration -> Window -> Lines of Scrollback 10000
  1. Now we can process the resulting log to format the text in html. see tips `MBQ.

As a result, we get a properly formatted file portfolio.log containing a fairly brief summary of the selected commands.


ИСПОЛЬЗОВАНИЕ LINUX


1 апреля 2020, rev: N04

В качестве шутки предлагаю следующий текст:

Кастинг -- тест на принадлежность к определенной касте.

кто? какой?
начальник может нагнуть админа
админ может оставить девелопера без необходимых ресурсов
девелопер может сделать так, что будет нечем юзать
юзер может сказать ламеру правду
ламер ничего не может

IT будут использовать Linux для многократного выполнения типовых операций (установка, настройка конфигурации, резервное копирование, поиск интересующей информации и формирование отчетов на ее основе и т. п.) Часто такие задачи решаются выполнением пошаговых инструкций, описываемых так назывемыми HOWTO документами. Однако, такая работа быстро надоедает.

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

Когда решение проблемы достигается при получение ответа на один единственный вопрос, удобным помощником является интернет-поисковик (google, yandex, duckduckgo,..)

Если ответ достигается комбинацией нескольких уже знакомых вам фактов (вещей, правил, объектов..), то предварительно нужно вызубрить их наизусть (знать одновременно).

Задача: есть 10 цифр и правило счета в так назывемых позиционных системах. Обозначению каждой из цифр поставлено в соостветствие некоторое количество подсчитываемых объектов (баранов, спичек, бутылок с кефиром (интересно, где это вы видели кефир в стеклянных бутылках?))

  0 -- пусто     5 -- IIIII
  1 -- I         6 -- IIIIII
  2 -- II        7 -- IIIIIII
  3 -- III       8 -- IIIIIIII
  4 -- IIII      9 -- IIIIIIIII
  1. init: Пустые ящики на 9 бутылок каждый (3x3) поставлены горизонтально в ряд. Для подсчета 9999 бутылок достаточно поставить в ряд четыре пустых ящика.

  2. укладываем бутылку в первый доступный ящик справа.

  3. Если справа от ящика, куда мы только что поставили бутылку, стоят один или больше полностью заполненных ящиков, заменим их на пустые ящики, взятые со склада, а заполненные отправим в фургон кефировоза (98, 99.. 100).

  4. Когда подсчитываемый товар иссякнет, количество подсчитываемых бутылок получим из ряда ящиков выставленных в п.1, например:

  ... ... ... ...
  ... ... ... ...  = 2023
  .oo ... .oo ооo
  1. Написать скрипт, иллюстрирующий показанный алгоритм счета.
  2. Изменить систему счисления на восьмеричную.
  3. Изменить систему счисления на шестнадцатиричную.
  4. Изменить систему счисления на двоичную.
  5. Изменить систему счисления на троичную.

 ~

ЧАСТО, ИСПОЛЬЗОВАНИЕ UNIX СВОДИТСЯ К ПЕРЕВОДУ НАЙДЕННОГО В СЕТИ СПОСОБА РЕШЕНИЯ ПОСТАВЛЕННОЙ ЗАДАЧИ НА ЯЗЫК СКРИПТА.

Обычно, при переводе HOWTO документа на язык скрипта, приходится изменять файлы настройки (configuration files). На этом шаге работы часто повторяется следующий фрагмент действий (паттерн, шаблон):

  1. Найти строку в которой есть "вот_это"

  2. Заменить в найденной строке "такое" на "эдакое". Иногда в найденной строке нужно сделать несколько замен для разных пар ("такое1" на "эдакое1",.. "такоеN" на "эдакоеN")

  3. Повторять п.1 и п.2 для новых фрагментов поиска в файле ("вот_это1",.. "вот_этоM"), поиска в строке ("такое"), замены в строке ("эдакое").

  4. Сохранить произведенные изменения, выйти из файла и продолжить выполнение команд.

Фрагменты текста "вот_это..", "такое..", "эдакое.." определяются с помощью регулярных выражений, а процесс изменения файла настройки осуществляется с помощью текстового редактора. К текстовым редакторам, полностью управляемым скриптом, относятся ed, sed (удобно использовать perl в режиме sed):

perl -pe 's/такое/эдакое/g'

Для поиска нужной строки можно использовать grep -P или опять же ed. В случае работы через "не совсем редакторы" типа sed, awk, perl,.. команды соединяются трубами (pipes).

Другой, часто встречающийся паттерн, это "do or die" (сделай или умри). Он основан на встроенной возможности языка скрипта, называемой lazy evaluation (Ленивые вычисления, https://habr.ru/post/131910/). Действительно зачем вычислять функцию die, если do вернула нам true и результат выражения и без того известен (true):

do die result example
false xxx@ false чтобы узнать финал, нужно досмотреть фильм до конца
true xxx true уже с половины книги все ясно, дальше можно не читать..

@) xxx -- don't care, то есть все равно, "быть или не пчела". Здесь уместно отметить, что в sh языках true это 0, а false это 1. тем не менее:

$ expr 0 \| 0; echo $?
0
1
$ expr 0 \| 1; echo $?
1
0
$ expr 1 \| 0; echo $?
1
0
$ expr 1 \| 1; echo $?
1
0

Замечание: Будьте внимательны при пересечении газона, сплошь усеянного брошенными граблями (lazy evaluation).

 ~

Основанный на правилах

120 команд unix, 5 труб, 12 команд ed даст не 137 новых возможностей а 7200 (120 x 5 x 12). Это следует учитывать при "загугливании" нужного решения.

 ~

Регулярные выражения (regex)


. -- любой символ

?*+ -- повторитель (? 0-1, * 0..много, + 1..много)

() -- группа (действие либо обратная ссылка backreference \1..\9)

[] -- набор символов: например [azA-Z5] буквы a, z, все заглавные латинские буквы и цифра 5. Справа от открывающейся квадратной скобки также можно использовать символ ^ -- отрицание, всего, что в скобках. Например [^az] -- a и z не подходят.

{} -- повторитель: {3} ровно 3 раза {3,7} от 3 до 7 раз {,2} до 2х раз, {4,} не менее 4х раз.

^$ -- якоря: ^ начало строки, $ конец строки

| -- или: (cat)|(dog)

Чтобы управляющие символы (метасимволы) регулярных выражений добавить в таблицу символов ASCII было решено создать два алфавита символов и метасимволов и переключаться между ними символом червоточины \. Полезный прием: Свободные места в таблице метасимволов заполнить обычными символами в том же понимании, в котором их используют в таблице символов. Таким образом, \a и a это одно и то же*1.

--

*1) You can use & in the replacement to refer to the matched text.. and a sufficiently-escaped backslash: "\\\\&"

https://unix.stackexchange.com/questions/425988/back-reference-to-the-matched-text-in-awk

--

Учебник по регулярным выражениям здесь

https://ryanstutorials.net/regular-expressions-tutorial/

Задачник по регулярным выражениям здесь

http://old.code.mu/tasks/php/regular/rabota-s-regulyarnymi-vyrazeniyami-v-php-glava-1.html

 ~

Tpубы

труба описание
<< heredoc
< input from
` `
> write to
>> append to
2>&1 redirect stderr to stdout

 ~

ed


формат команды: ,command

1 номер первой строки
. номер текущей строки
$ номер последней строки

Nr. command description
1 // goto and print
2 s///g search and replace
3 c change the whole line
4 d delete
6 a append (after, 0a at the top)
7 p print
8 n print numbered
9 . exit insert mode
10 w write
11 q quit
12 Q force quit

Примеры

d то же, что .d
,n то же что и 1,$n
-3,+3n
/regex_from/,/regex_to/s/search_regex/replace/g


Команды:


adduser
awk
bg
cat
cd
chgrp
chmod
chown
chroot
clear
cp
date
dd
df
diff
dmesg
du
env
expr
fdisk
fg
find
for
free
fsck
gcc
gdb
grep
gzip
head
history
hostname
if
ifconfig
init
insmod
ip
job
kill
killall
ld
ldd
ln
ls
lsmod
lspci
lsusb
make
mkdir
mkfifo
mkfs
mkswap
modprobe
more
mount
mv
nice
nslookup
od
passwd
paste
patch
ping
poweroff
printf
ps
pwd
reboot
rm
rmmod
route
sed
seq
service
shutdown
sort
ssh
strip
su
sudo
swapoff
swapon
sync
systemctl
tail
tar
tee
test
time
top
touch
tr
traceroute
umount
uname
uniq
useradd
userdel
wc
wget
which
while
who
whoami
xxd

Почти у каждой команды есть ключи настройки. Самые полезные ключи можно найти в документации TL;DR, либо здесь

про Unix, 2012

и здесь:

https://ryanstutorials.net/linuxtutorial/

кроме того полезно спросить помощь у busybox либо поиграть с историческими лентами Unix:

про Unix, 2012

работа на симуляторе PDP-11

магнитные ленты с Unix


СВОДНАЯ РАБОТА ПО ТЕМЕ "ИСПОЛЬЗОВАНИЕ UNIX" (ДЛЯ ЛЕНТЯЕВ. ВПРОЧЕМ, ТАКЖЕ, КАК В СЛУЧАЕ С ТЕМОЙ "УСТАНОВКА UNIX", РАБОТА ДОЛЖНА БЫТЬ БОЛЬШОЙ ПО ОБЪЕМУ, ПРОСТОЙ И СКУЧНОЙ, И ПРИНОСЯЩЕЙ МАЛО ПУНКТОВ)


Команды


Заполнить недостающий текст.

...

  1. команда clear
    предназначение:
    
    ..............
    
    полезные ключи настройки:
    
    ...................
    
    примеры использования
    
    ...................
    
  2. env

...

 ~

Регулярные выражения


Привести работающие примеры использования метасимвола регулярного выражения, и указать в чем их можно проверить: консоль Alpine, Buster,..

  1. Любой символ
  2. Повторители
  3. Квадратные скобки, ^ и - внутри []
  4. Круглые скобки
  5. Обратные ссылки \1..\9 и |
  6. Фигурные скобки и запятая
  7. Якоря ^ и $
  8. Лень и жадность ?

 ~

Редактирование текста.


Написать максимально короткий скрипт, получающий из текста A текст Б.

 ~

Приложение А. Работа с TLDR


Начнем с установки man пакета

apk add man-db man-pages

man слишком длинный, давайте установим tldr (too long don't read)

Нужно накопить в файл report.txt помощь по важным командам Unix. Сделаем это на Alpine.

sudo apk add npm
sudo npm install -g tldr
tldr sed
tldr ls
tldr tree

Необходимо создать файл отчета для SUMMARY-USEUNIX.md, где будет информация tldr о перечисленных командах.

  1. Выберем необходимые команды из списка команд выше. Создадим скрипт gettldr
# cat raw | perl -pe 's/[ |\\]//g' | perl -pe 's/^(.*)$/echo "---"\necho "# \1"\necho "~~~"\ntldr \1/g' > gettldr
# chmod +x gettldr
# ./gettldr
  1. Прописывать журнал в PuTTY, включая ESC коды терминала. Также полезно будет увеличить длину буфера:
PuTTY Configuration -> Window -> Lines of Scrollback  10000
  1. Теперь мы можем обработать полученный журнал для форматирования текста в html. см. tips **MBQ**

В результате мы получаем правильно отформатированный файл portfolio.log содержащий достаточно краткую справку о выбранных командах.