Linux. Задачи на bash.

Попались мне как то на глаза задачки для собеседования на Linux админа, показались мне интересными и я предлагаю их решение скриптами на bash c использованием coreutils, если у кого то есть более изящные решения, то отпишите в комментариях.

Так же в продолжении темы предлагаю другие статьи по данной рубрике «Задачи на bash»

Вопрос 1
Написать простейший скрипт на Bash, который должен принимать в качестве аргумента любую строку и удалять из /home/ файл с именем, соответствующим переданной строке без необходимости отвечать утвердительно на вопросы системы. Так же должны быть выполнены условия, при которых скрипт не удалит все файлы при передаче в качестве параметра «*» и удалит файлы, имена которых начинаются с «-«.

Пример запуска скрипта:

$ deleter.sh -s # должен удалить файл /home/-s
$ deleter.sh *  # должен ничего не делать
Решение
#!/bin/bash
 
rmfile=$1
dirrm=/root/t
scr=`echo $0 `
 
if [ ${rmfile} = "deleter.sh" ]
then
    echo "ничего удалять не будем"
else
    case $rmfile in
        "-") rm -f ${dirrm}/* ;;
        *) rm -f ${dirrm}/${rmfile}
    esac
fi

Вопрос 2
Написать скрипт, который из /etc/passwd выведет домашнюю директорию для пользователя www-data, пример файла /etc/passwd:

sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
messagebus:x:102:105::/var/run/dbus:/bin/false
Решение
#!/bin/bash
 
user=www-data
 
homedir=`grep $user "/etc/passwd" | cut -d: -f6`
echo $homedir

или

#!/bin/bash
user=www-data
awk -F: '{if ($1==user) print$6}' user=$user /etc/passwd

Вопрос 3
Написать скрипт, который выведет top 5 процессов, которые потребляют больше всего памяти и процессора в системе.

Решение
#!/bin/bash
ps -aeo pid,size | sort -rhk 2 | head -n 5

Вопрос 4
Написать скрипт, который выведет всех потомков процесса по его PID.

Решение
#!/bin/bash
 
pid=$1
ps --ppid=${pid}

Вопрос 5
Написать скрипт, который для всех файлов во временной директории, которые были созданы за текущий месяц, и не изменялись в течение недели при нахождении в них строки test поменяет ее на tset.

Решение
#!/bin/bash
 
day=-`date +%d`
 
find /tmp/ -type f -mtime $day -atime +7 | xargs sed -i -e "s/test/tset/"

Вопрос 6
Написать скрипт, которые выведет на экран все файлы, размер которых больше 50 Мб в директории /var/log

Решение
#!/bin/bash
find /var/log -type f -size +50M

Вопрос 7
Написать скрипт, который в качестве первого параметра принимает команду, которую нужно выполнить, а в качестве остальных параметров адреса серверов, на которых эта команда должна выполниться.

Решение
#!/bin/bash
 
user=root
server=$*
nserver=$#
server=(`echo $server`)
 
while [ "$nserver" -gt 1 ] ; do
    ((nserver--))
    echo ${server[$nserver]}
    ssh ${user}@${server[$nserver]} $1
done

Вопрос 8
Написать скрипт, который в качестве параметров принимает адреса серверов и выдает адрес сервера, на котором свободной памяти осталось менее 100 Мб в формате server name|free memory

Решение
#!/bin/bash
 
user=root
servers=$*
 
for server in `echo $servers`
do
    a=(`ssh ${user}@${server} free | grep Mem`)
 
    #a=(`free | grep Mem | cut -f 4-6`)
    freemem=${a[3]}
    if [ ${freemem} -lt  1024000 ]
    then
        echo $server "|" $freemem
    fi
done

Вопрос 9
Написать скрипт, которые для указанного доменного имени, получит все А записи и выведет на экран те сервера, которые недоступны.

Решение
#!/bin/bash
 
ip=(`nslookup $1 | grep Address: | egrep -o "[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]\.[12]?[0-9]?[0-9]" | xargs echo` )
 
for i in `echo ${ip[*]}`
do
    ping -c1 $i > /dev/null || echo $i' bad server!'
 
done

UPD 12.11.2015

#!/bin/bash
dnsa=$(host -t A $1 | awk '{print $4}' | tr "\n" " ")
for ip in ${dnsa[*]}
do
ping -c2 $ip > /dev/null || echo $ip is not available
done

Вопрос 10
Написать скрипт, который с адреса зайдя по адресу http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/autobuilds/ определит stage3 архив последней сборки, скачает его и распакует его в директорию /mnt

Решение
#!/bin/bash
wget http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/autobuilds/latest-stage3.txt
lastd=/`egrep -ro [0-9]+/stage3-amd64-[0-9]+.tar.bz2 latest-stage3.txt`
paket=`egrep -ro stage3-amd64-[0-9]+.tar.bz2 latest-stage3.txt`
echo $lastd
wget http://mirror.yandex.ru/gentoo-distfiles/releases/amd64/autobuilds${lastd}
tar xf $paket -C /mnt