| 
							
								 | 
							
							# Решения
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 1.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите .sh скрипт в котором в переменную date присваивается значение текущей даты, в переменную claim - строка "snow is white". После вызова скрипт должен выводить строку, используя переменные date и claim:
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							Ср 14 сен 2022 14:50:46 +04: The claim that “snow is white” is true if and only if snow is white.
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							Сделайте файл исполняемым для владельца и вызовите указанием полного или относительного пути к нему.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							содержимое скрипта 1.sh
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							date=$(date)
 | 
						
						
						
						
							 | 
							
								 | 
							
							claim='snow is white'
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo "$date: The claim that \"$claim\" is true if and only if $claim."
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 2.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите функцию в скрипте, которая создает каталог, путь к которому передан в качестве первого аргумента и переходит в него. Проверьте работу функции в этом же файле. Работает ли функция за пределами контекста скрипта?
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ cat 2.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							mkdir_cd () {
 | 
						
						
						
						
							 | 
							
								 | 
							
							        mkdir -p $1
 | 
						
						
						
						
							 | 
							
								 | 
							
							        cd $1
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo current dir: $(pwd)
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							mkdir_cd $1
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ ./2.sh /tmp/1/2/3/4/5
 | 
						
						
						
						
							 | 
							
								 | 
							
							current dir: /tmp/1/2/3/4/5
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							После выполнения скрипта текущая директория не изменилась. 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ mkdir_cd () {
 | 
						
						
						
						
							 | 
							
								 | 
							
							        mkdir -p $1
 | 
						
						
						
						
							 | 
							
								 | 
							
							        cd $1
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo current dir: $(pwd)
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ mkdir_cd /tmp/a/b/c/d
 | 
						
						
						
						
							 | 
							
								 | 
							
							current dir: /tmp/a/b/c/d
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:/tmp/a/b/c/d$ 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							После определения функции и вызова в оболочке изменилась.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 3.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Менее известной, но полезной может быть подстановка дескриптора файла с результатом выполнения команды. `<( CMD )` выполнит `CMD` и поместит вывод во временный файл и заменит `<()` именем этого файла. Это полезно, когда команды ожидают, что значения будут переданы через файл, а не STDIN. Например, `diff <(ls foo) <(ls bar)` покажет различия между файлами в каталогах foo и bar.
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ diff <(cat buylist) <(cat bought)
 | 
						
						
						
						
							 | 
							
								 | 
							
							1,3c1,5
 | 
						
						
						
						
							 | 
							
								 | 
							
							< salad
 | 
						
						
						
						
							 | 
							
								 | 
							
							< milk
 | 
						
						
						
						
							 | 
							
								 | 
							
							< bread
 | 
						
						
						
						
							 | 
							
								 | 
							
							---
 | 
						
						
						
						
							 | 
							
								 | 
							
							> icecream
 | 
						
						
						
						
							 | 
							
								 | 
							
							> cheese
 | 
						
						
						
						
							 | 
							
								 | 
							
							> cake
 | 
						
						
						
						
							 | 
							
								 | 
							
							> lays
 | 
						
						
						
						
							 | 
							
								 | 
							
							> beer
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 4.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Попробуйте условные выражения в скрипте в if конструкции:
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ cat 4.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							if [[ true && true ]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							then
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo "True"
 | 
						
						
						
						
							 | 
							
								 | 
							
							fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							if [[ true || false ]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							then
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo "True"
 | 
						
						
						
						
							 | 
							
								 | 
							
							fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ ./4.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							True
 | 
						
						
						
						
							 | 
							
								 | 
							
							True
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 5.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите скрипт, который проходит по всем файлам, переданным в качестве аргументов, и ищет в них строку hello. Перенаправьте grep `STDOUT` и `STDERR` в специальный файл `/dev/null`. Для каждого файла в if создайте файл с содержимым `hello`, если `grep` завершился с ошибкой.  
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ cat 5.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							for f in $@; do
 | 
						
						
						
						
							 | 
							
								 | 
							
							        grep hello $f 2> /dev/null 1> /dev/null
 | 
						
						
						
						
							 | 
							
								 | 
							
							        if [[ $? -ne 0 ]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							        then
 | 
						
						
						
						
							 | 
							
								 | 
							
							                echo "hello" > $f
 | 
						
						
						
						
							 | 
							
								 | 
							
							        fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ ./5.sh /tmp/one /tmp/two /tmp/three
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/one has no hello in it. correcting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/two has no hello in it. correcting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/three has no hello in it. correcting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ grep hello /tmp/* 2> /dev/null 
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/one:hello
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/three:hello
 | 
						
						
						
						
							 | 
							
								 | 
							
							/tmp/two:hello
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 6.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Установите пакет shellcheck и проверьте написанный вами ранее скрипт одноименной командой.
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ shellcheck 5.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							In 5.sh line 1:
 | 
						
						
						
						
							 | 
							
								 | 
							
							for f in $@; do
 | 
						
						
						
						
							 | 
							
								 | 
							
							^-- SC2148 (error): Tips depend on target shell and yours is unknown. Add a shebang or a 'shell' directive.
 | 
						
						
						
						
							 | 
							
								 | 
							
							         ^-- SC2068 (error): Double quote array expansions to avoid re-splitting elements.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							In 5.sh line 2:
 | 
						
						
						
						
							 | 
							
								 | 
							
							        grep hello $f 2> /dev/null 1> /dev/null
 | 
						
						
						
						
							 | 
							
								 | 
							
							                   ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Did you mean: 
 | 
						
						
						
						
							 | 
							
								 | 
							
							        grep hello "$f" 2> /dev/null 1> /dev/null
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							In 5.sh line 3:
 | 
						
						
						
						
							 | 
							
								 | 
							
							        if [[ $? -ne 0 ]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							              ^-- SC2181 (style): Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							In 5.sh line 5:
 | 
						
						
						
						
							 | 
							
								 | 
							
							                echo $f has no hello in it. correcting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							                     ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Did you mean: 
 | 
						
						
						
						
							 | 
							
								 | 
							
							                echo "$f" has no hello in it. correcting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							In 5.sh line 6:
 | 
						
						
						
						
							 | 
							
								 | 
							
							                echo "hello" > $f
 | 
						
						
						
						
							 | 
							
								 | 
							
							                               ^-- SC2086 (info): Double quote to prevent globbing and word splitting.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Did you mean: 
 | 
						
						
						
						
							 | 
							
								 | 
							
							                echo "hello" > "$f"
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							For more information:
 | 
						
						
						
						
							 | 
							
								 | 
							
							  https://www.shellcheck.net/wiki/SC2068 -- Double quote array expansions to ...
 | 
						
						
						
						
							 | 
							
								 | 
							
							  https://www.shellcheck.net/wiki/SC2148 -- Tips depend on target shell and y...
 | 
						
						
						
						
							 | 
							
								 | 
							
							  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 7.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите скрипт, который выполняет следующий код:
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ cat ./7.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/usr/bin/env python
 | 
						
						
						
						
							 | 
							
								 | 
							
							import sys
 | 
						
						
						
						
							 | 
							
								 | 
							
							for arg in reversed(sys.argv[1:]):
 | 
						
						
						
						
							 | 
							
								 | 
							
							        print(arg)
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ ./7.sh 1 2 3 4 5
 | 
						
						
						
						
							 | 
							
								 | 
							
							5
 | 
						
						
						
						
							 | 
							
								 | 
							
							4
 | 
						
						
						
						
							 | 
							
								 | 
							
							3
 | 
						
						
						
						
							 | 
							
								 | 
							
							2
 | 
						
						
						
						
							 | 
							
								 | 
							
							1
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 8.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Функции выполняются в текущей среде оболочке, тогда как скрипты выполняются в своем собственном процессе. 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Проверьте, что функции могут изменять переменные среды, например, изменить текущий каталог, тогда как скрипт не может. Напишите скрипт, в котором инициализируются две переменные `A` и `B`. Перед одной из них указывается `export `. Выполните скрипт и посмотрите на выдачу команды `env`. Выполните файл командой source (source --help). Какие переменные экспортировались в оболочку? 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ cat 8.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/bin/bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							A=1
 | 
						
						
						
						
							 | 
							
								 | 
							
							export B=2
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ ./8.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ env | grep -E "^A|B"
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ source ./8.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ env | grep -E "^A|B"
 | 
						
						
						
						
							 | 
							
								 | 
							
							B=2
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 9.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите сценарий bash, который запускает следующий сценарий до тех пор, пока он не завершится аварийно, записывает стандартный вывод и потоки ошибок в файлы и печатает все в конце. 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ cat random_bug_script.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/usr/bin/env bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							n=$(( RANDOM % 100 ))
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo $n
 | 
						
						
						
						
							 | 
							
								 | 
							
							if [[ n -eq 42 ]]; then
 | 
						
						
						
						
							 | 
							
								 | 
							
							  echo "Something went wrong"
 | 
						
						
						
						
							 | 
							
								 | 
							
							  >&2 echo "The error was using magic numbers"
 | 
						
						
						
						
							 | 
							
								 | 
							
							  exit 1
 | 
						
						
						
						
							 | 
							
								 | 
							
							fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo "Everything went according to plan"
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ cat repeat_until_error.sh
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/bin/bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo "" > output.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo "" > error.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							i=0
 | 
						
						
						
						
							 | 
							
								 | 
							
							while true; do
 | 
						
						
						
						
							 | 
							
								 | 
							
							  bash $1 2>> error.log 1>> output.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							  if [[ $? -ne 0 ]]; then
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo Took "$i" iterations to get an error.
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo "\noutput.log"
 | 
						
						
						
						
							 | 
							
								 | 
							
							        cat output.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo "\nerror.log"
 | 
						
						
						
						
							 | 
							
								 | 
							
							        cat error.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							        break
 | 
						
						
						
						
							 | 
							
								 | 
							
							  fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							  i=$((i+1))
 | 
						
						
						
						
							 | 
							
								 | 
							
							done
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ ./repeat_until_error.sh ./random_bug_script.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							Took 37 iterations to get an error.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							output.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Everything went according to plan
 | 
						
						
						
						
							 | 
							
								 | 
							
							Something went wrong
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							error.log
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							The error was using magic numbers
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Бонусный балл, за то, что вы можете сообщить, сколько запусков потребовалось для сбоя сценария.
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							stud@stud15:~$ cat mean.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/bin/bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							script=$1
 | 
						
						
						
						
							 | 
							
								 | 
							
							iters=$2
 | 
						
						
						
						
							 | 
							
								 | 
							
							sum=0
 | 
						
						
						
						
							 | 
							
								 | 
							
							for i in $(seq $iters)
 | 
						
						
						
						
							 | 
							
								 | 
							
							do
 | 
						
						
						
						
							 | 
							
								 | 
							
							        failedoniter=$(bash $script | grep 'Took' | awk '{ print $2; }')
 | 
						
						
						
						
							 | 
							
								 | 
							
							        sum=$((sum+failedoniter))
 | 
						
						
						
						
							 | 
							
								 | 
							
							done
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo Done $iters trials.
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo Mean number of steps until error: $(( sum / iters ))
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							$ time ./mean.sh "./repeat_until_error.sh ./random_bug_script.sh" 1000
 | 
						
						
						
						
							 | 
							
								 | 
							
							Done 1000 trials.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Mean number of steps until error: 99
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							real    2m6,924s
 | 
						
						
						
						
							 | 
							
								 | 
							
							user    1m36,964s
 | 
						
						
						
						
							 | 
							
								 | 
							
							sys     0m29,409s
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							### 10.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Напишите скрипт, который: 
 | 
						
						
						
						
							 | 
							
								 | 
							
							- создаёт пользователя на двух машинах,
 | 
						
						
						
						
							 | 
							
								 | 
							
							- кроме домашней директории заводит папку для пользователя в `/ceph/` с нужными правами, 
 | 
						
						
						
						
							 | 
							
								 | 
							
							- создаёт ссылку в домашней директории на директорию в `/ceph/`, 
 | 
						
						
						
						
							 | 
							
								 | 
							
							- ограничивает доступ к домашней папке всем, кроме владельца, 
 | 
						
						
						
						
							 | 
							
								 | 
							
							- генерирует пользователям ключи ed25519, рассылает по машинам и регистрирует ключи для беспарольного перемещения пользователя между машинами. 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Настройка беспарольного перехода для суперпользователя между машинами
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# cat .ssh/config 
 | 
						
						
						
						
							 | 
							
								 | 
							
							Host w001
 | 
						
						
						
						
							 | 
							
								 | 
							
							        HostName 10.160.179.25
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Host w002
 | 
						
						
						
						
							 | 
							
								 | 
							
							        HostName 10.160.179.55
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# hostname -i
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.25
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15-v1:~# hostname -i
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.55
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15-v1:~# cat /etc/ssh/sshd_config | grep PermitRootLogin 
 | 
						
						
						
						
							 | 
							
								 | 
							
							PermitRootLogin yes
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15-v1:~# systemctl restart sshd
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# ssh-copy-id w002
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@10.160.179.55's password: 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Number of key(s) added: 1
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Now try logging into the machine, with:   "ssh 'w002'"
 | 
						
						
						
						
							 | 
							
								 | 
							
							and check to make sure that only the key(s) you wanted were added.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15-v1:~# cat /etc/ssh/sshd_config | grep PermitRootLogin 
 | 
						
						
						
						
							 | 
							
								 | 
							
							PermitRootLogin prohibit-password
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15-v1:~# systemctl restart sshd
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# ssh-copy-id w001
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
 | 
						
						
						
						
							 | 
							
								 | 
							
							The authenticity of host '10.160.179.25 (10.160.179.25)' can't be established.
 | 
						
						
						
						
							 | 
							
								 | 
							
							ECDSA key fingerprint is SHA256:3K1vZ3p2zlZpJabnqm3ZqwUPkmxxnIHiqYplqRLEku8.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
 | 
						
						
						
						
							 | 
							
								 | 
							
							                (if you think this is a mistake, you may want to use -f option)
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							Скрипт 
 | 
						
						
						
						
							 | 
							
								 | 
							
							```bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# cat create_user.sh 
 | 
						
						
						
						
							 | 
							
								 | 
							
							#!/bin/bash
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							help() {
 | 
						
						
						
						
							 | 
							
								 | 
							
							        echo "Usage: ./create_user.sh file_with_node_ip_addresses user_name"
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							if [[ $# < 2 ]]
 | 
						
						
						
						
							 | 
							
								 | 
							
							then
 | 
						
						
						
						
							 | 
							
								 | 
							
							        help
 | 
						
						
						
						
							 | 
							
								 | 
							
							        exit
 | 
						
						
						
						
							 | 
							
								 | 
							
							fi
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							nodes=$(cat $1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							user=$2
 | 
						
						
						
						
							 | 
							
								 | 
							
							create_user_and_link_command="useradd $user --create-home --shell=/bin/bash --key HOME_MODE=0700; \
 | 
						
						
						
						
							 | 
							
								 | 
							
							mkdir -p /ceph/$user -m 0700; \
 | 
						
						
						
						
							 | 
							
								 | 
							
							chown $user:$user /ceph/$user; \
 | 
						
						
						
						
							 | 
							
								 | 
							
							ln -s /ceph/$user /home/$user/ceph; \
 | 
						
						
						
						
							 | 
							
								 | 
							
							chown $user:$user --no-dereference /home/$user/ceph"
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							mkdir -p /root/users.ssh/$user/
 | 
						
						
						
						
							 | 
							
								 | 
							
							ssh-keygen -t ed25519 -N ""  -f "/root/users.ssh/$user/id_ed25519"
 | 
						
						
						
						
							 | 
							
								 | 
							
							sed --in-place "s/root/user/" "/root/users.ssh/$user/id_ed25519.pub"
 | 
						
						
						
						
							 | 
							
								 | 
							
							cat /root/users.ssh/$user/id_ed25519.pub > /root/users.ssh/$user/authorized_keys
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							echo "" > /root/users.ssh/$user/known_hosts
 | 
						
						
						
						
							 | 
							
								 | 
							
							for node in $nodes; do
 | 
						
						
						
						
							 | 
							
								 | 
							
							  ssh-keyscan -H "$node" >> /root/users.ssh/$user/known_hosts
 | 
						
						
						
						
							 | 
							
								 | 
							
							done
 | 
						
						
						
						
							 | 
							
								 | 
							
							 
 | 
						
						
						
						
							 | 
							
								 | 
							
							for node in $nodes; do
 | 
						
						
						
						
							 | 
							
								 | 
							
							  echo "$node" "$create_user_and_link_command"
 | 
						
						
						
						
							 | 
							
								 | 
							
							  ssh "$node" "$create_user_and_link_command"
 | 
						
						
						
						
							 | 
							
								 | 
							
							  scp -r /root/users.ssh/$user/ $node:/home/$user/.ssh
 | 
						
						
						
						
							 | 
							
								 | 
							
							  ssh "$node" "chown -R $user:$user /home/$user/.ssh && chmod 0700 /home/$user/.ssh/"
 | 
						
						
						
						
							 | 
							
								 | 
							
							done
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# cat nodes
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.25
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.55
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Проверка
 | 
						
						
						
						
							 | 
							
								 | 
							
							```
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# ./create_user.sh nodes user6
 | 
						
						
						
						
							 | 
							
								 | 
							
							Generating public/private ed25519 key pair.
 | 
						
						
						
						
							 | 
							
								 | 
							
							Your identification has been saved in /root/users.ssh/user6/id_ed25519
 | 
						
						
						
						
							 | 
							
								 | 
							
							Your public key has been saved in /root/users.ssh/user6/id_ed25519.pub
 | 
						
						
						
						
							 | 
							
								 | 
							
							The key fingerprint is:
 | 
						
						
						
						
							 | 
							
								 | 
							
							SHA256:FdusRTajDoM/7us/Tyf3VCmu/8kAWjWoYkerUGKggzg root@stud15
 | 
						
						
						
						
							 | 
							
								 | 
							
							The key's randomart image is:
 | 
						
						
						
						
							 | 
							
								 | 
							
							+--[ED25519 256]--+
 | 
						
						
						
						
							 | 
							
								 | 
							
							|   .      . =    |
 | 
						
						
						
						
							 | 
							
								 | 
							
							|o . .  .   O.o   |
 | 
						
						
						
						
							 | 
							
								 | 
							
							|Eo   o..o.+.+o   |
 | 
						
						
						
						
							 | 
							
								 | 
							
							| .. . o..=oo. . .|
 | 
						
						
						
						
							 | 
							
								 | 
							
							|     . oS+oo . ..|
 | 
						
						
						
						
							 | 
							
								 | 
							
							|      o.+.o o . .|
 | 
						
						
						
						
							 | 
							
								 | 
							
							|       ...  ooo .|
 | 
						
						
						
						
							 | 
							
								 | 
							
							|       .  ...+oo.|
 | 
						
						
						
						
							 | 
							
								 | 
							
							|       .+o.+o..+.|
 | 
						
						
						
						
							 | 
							
								 | 
							
							+----[SHA256]-----+
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.25:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.25:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.25:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.25:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.25:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.55:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.55:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.55:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.55:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							# 10.160.179.55:22 SSH-2.0-OpenSSH_8.4p1 Debian-5+deb11u1
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.25 useradd user6 --create-home --shell=/bin/bash --key HOME_MODE=0700; mkdir -p /ceph/user6 -m 0700; chown user6:user6 /ceph/user6; ln -s /ceph/user6 /home/user6/ceph; chown user6:user6 --no-dereference /home/user6/ceph
 | 
						
						
						
						
							 | 
							
								 | 
							
							id_ed25519.pub                                                                                                   100%   93   484.7KB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							id_ed25519                                                                                                       100%  399     2.8MB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							authorized_keys                                                                                                  100%   93   746.1KB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							known_hosts                                                                                                      100% 1957    12.5MB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							10.160.179.55 useradd user6 --create-home --shell=/bin/bash --key HOME_MODE=0700; mkdir -p /ceph/user6 -m 0700; chown user6:user6 /ceph/user6; ln -s /ceph/user6 /home/user6/ceph; chown user6:user6 --no-dereference /home/user6/ceph
 | 
						
						
						
						
							 | 
							
								 | 
							
							id_ed25519.pub                                                                                                   100%   93   434.1KB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							id_ed25519                                                                                                       100%  399     2.4MB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							authorized_keys                                                                                                  100%   93   625.8KB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							known_hosts                                                                                                      100% 1957    10.4MB/s   00:00    
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							user6@stud15:~$ ssh 10.160.179.55
 | 
						
						
						
						
							 | 
							
								 | 
							
							Linux stud15-1v15 5.10.0-17-amd64 #1 SMP Debian 5.10.136-1 (2022-08-13) x86_64
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							The programs included with the Debian GNU/Linux system are free software;
 | 
						
						
						
						
							 | 
							
								 | 
							
							the exact distribution terms for each program are described in the
 | 
						
						
						
						
							 | 
							
								 | 
							
							individual files in /usr/share/doc/*/copyright.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
 | 
						
						
						
						
							 | 
							
								 | 
							
							permitted by applicable law.
 | 
						
						
						
						
							 | 
							
								 | 
							
							user6@stud15-1v15:~$ ssh 10.160.179.25
 | 
						
						
						
						
							 | 
							
								 | 
							
							Linux stud15 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							The programs included with the Debian GNU/Linux system are free software;
 | 
						
						
						
						
							 | 
							
								 | 
							
							the exact distribution terms for each program are described in the
 | 
						
						
						
						
							 | 
							
								 | 
							
							individual files in /usr/share/doc/*/copyright.
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
 | 
						
						
						
						
							 | 
							
								 | 
							
							permitted by applicable law.
 | 
						
						
						
						
							 | 
							
								 | 
							
							user6@stud15:~$ 
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# ls -la /home/user6/
 | 
						
						
						
						
							 | 
							
								 | 
							
							total 28
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  3 user6 user6 4096 сен 15 11:49 .
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwxr-xr-x 13 root  root  4096 сен 15 11:47 ..
 | 
						
						
						
						
							 | 
							
								 | 
							
							-rw-------  1 user6 user6   18 сен 15 11:49 .bash_history
 | 
						
						
						
						
							 | 
							
								 | 
							
							-rw-r--r--  1 user6 user6  220 мар 27 22:40 .bash_logout
 | 
						
						
						
						
							 | 
							
								 | 
							
							-rw-r--r--  1 user6 user6 3526 мар 27 22:40 .bashrc
 | 
						
						
						
						
							 | 
							
								 | 
							
							lrwxrwxrwx  1 user6 user6   11 сен 15 11:47 ceph -> /ceph/user6
 | 
						
						
						
						
							 | 
							
								 | 
							
							-rw-r--r--  1 user6 user6  807 мар 27 22:40 .profile
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user6 user6 4096 сен 15 11:47 .ssh
 | 
						
						
						
						
							 | 
							
								 | 
							
							root@stud15:~# ls -la /ceph
 | 
						
						
						
						
							 | 
							
								 | 
							
							total 32
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwxr-xr-x  8 root  root  4096 сен 15 11:47 .
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwxr-xr-x 21 root  root  4096 сен 15 11:12 ..
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user1 user1 4096 сен 15 11:14 user1
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user2 user2 4096 сен 15 11:25 user2
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user3 user3 4096 сен 15 11:38 user3
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user4 user4 4096 сен 15 11:42 user4
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user5 user5 4096 сен 15 11:44 user5
 | 
						
						
						
						
							 | 
							
								 | 
							
							drwx------  2 user6 user6 4096 сен 15 11:47 user6
 | 
						
						
						
						
							 | 
							
								 | 
							
							``` |