Команды которые должны быть в голове, а если Вы новичок, то эти команды Вам обязательно пригодятся.
Файловые команды
ls – список файлов и каталогов в текущей директории
ls -al – форматированный список со скрытыми каталогами и файлами
чтобы посмотреть список файлов и их дату модификации:
find . -maxdepth 1 -printf "%T@ %Tc %p\n" | sort -n
отсортировать по Change:
stat --printf='%z\t%n\n' * | sort -t $'\t' -k 2
перейти в директорию /dir: cd /dir
перейти в домашний каталог: cd или cd ~/
вернуться на предыдущую директорию: cd -
pwd – показать текущий каталог
mkdir dir – создать каталог dir
показать разницу файлов в указанных директория:
diff -r dir1 dir2 - покажет файлы существующие только в dir1 and и только существующие в dir2
diff -r dir1 dir2 | grep dir1 - покажет файлы существующие только в dir1
diff -r dir1 dir2 | grep dir1 | awk '{print $4}' > difference1.txt
echo > /dir/file - пресечь файл до нулевой длинны
rm file – удалить file
rm -r dir – удалить каталог dir
rm -f file – удалить форсированно file
rm -rf dir – удалить форсированно каталог dir *
cp file1 file2 – скопировать file1 в file2
cp -r dir1 dir2 – скопировать dir1 в dir2; создаст каталог dir2, если он не существует
примеры:
скопировать файл: cp -rp /dir/file /to/dir/
скопировать директорию dir целиком: cp -rp /dir /to/dir/
скопировать только содержимое директории dir: cp -rp /dir/ /to/dir/
mv file1 file2 – переименовать или переместить file1 в file2. если file2 существующий каталог – переместить file1 в каталог file2
ln -s file link – создать символическую ссылку link к файлу file
touch file – создать file
cat > file – направить стандартный ввод в file
more file – вывести содержимое file
head file – вывести первые 10 строк file
tail file – вывести последние 10 строк file (просмотр последних записей в лог-файл: tail -f /var/log/maillog)
tail -f file – вывести содержимое file по мере роста, начинает с последних 10 строк
sed - потоковый текстовый редактор, который может не только удалять строки, но и менять значения в них:
Вот тут хорошо описано, но напишу свои примеры:
простая замена в файле (перезапишет содержимое файла): sed -i 's|это|на это|g' /в/файле.txt
заметка: перенаправление аутпута в тот же файл не работает - образуется файл с пустым содержимым
замена с экранированем: /usr/bin/sed -e "s|old\['SYSTEM'\]|new|g" /input.txt > /output.txt
Несколько замен объединены в одном файле subst.sed: sed -f subst.sed inputFileName > outputFileName
содержание файла subst.sed приблизительно может быть таким:
s|это|на это|g
s|old\['SYSTEM'\]|new|g
s|GLOBALS\['SYSTEM'\]\['config'\]\['1'\]|GLOBALS\['SYSTEM'\]\['config'\]\['server_name'\]|gВ текущей директории
sed -i -- 's/foo/bar/g' *Here’s what each component of the command does:
-i will change the original, and stands for “in-place.”s is for substitute, so we can find and replace.foo is the string we’ll be taking away,bar is the string we’ll use instead today.g as in “global” means “all occurrences, please.”* denotes all file types. (No more rhymes. What a tease.)You can limit the operation to one file type, such as txt, by using a matching pattern:
sed -i -- 's/foo/bar/g' *.txtВ текущей и дальше в глубину рекурсивно
find . -type f -exec sed -i 's/foo/bar/g' {} +To ignore hidden files (such as .git) you can pass the negation modifier -not -path '*/\.*', like this:
find . -type f -not -path '*/\.*' -exec sed -i 's/foo/bar/g' {} +This will exclude any file that has the string /. in its path. Еще пример с помощью xargs:
find /dir/ \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i "s/a\.ru/b\.ru/g"You can also limit this operation to file names that end in a certain extension, like Markdown:
find . -type f -name "*.md" -exec sed -i 's/foo/bar/g' {} +If you want to update a URL, the / separator in your strings will need escaping. It ends up looking like this…
find . -type f -exec sed -i \
's/https:\/\/www.oldurl.com\/blog/https:\/\/www.newurl.com\/blog/g' {} +You can avoid confusion and mistakes by changing the separator to any non-conflicting character. The character that follows the s will be treated as the separator. In this case, using a , or _ would do. This doesn’t require escaping and is much more readable:
find . -type f -exec sed -i \
's_https://www.oldurl.com/blog_https://www.newurl.com/blog_g' {} +Еще для замены в множестве файлов можно использовать например такой баш-скрипт:
# ************ Change Variables Here ***********
echo "*****************************************"
echo " Search and Replace in Files Version 1.1 "
echo "*****************************************"
for file in $(find . -type f -name '*.php')
do
sed -f /usr/home/replace.txt $file > tempfile
mv tempfile $file
echo "Modified: " $file
done
echo "*********** Yea! All Done! **************"
а запускать его так: /bin/bash /usr/dir/replace
find - утилита поиска файлов
примеры:
нахождение php-файлов в которые внесены изменения:
c расширением php в прошедшие 7 дней (от текущего дня): find /dir/ -type f -mtime -7 -name '*.php' -print
измененные файлы и директории за последние 10 секунд: find /dir/ -cmin +1 -cmin -10
измененные между 2500 и 2800 минутами тому назад: find -cmin +2500 -cmin -2800
c расширением php между 15 и 17 днями тому назад (от текущего дня):
find /dir/ -type f -mtime +15 -mtime -17 -name '*.php' -print
найти и удалить все файлы в директории, кроме файла file.tgz: find /dir/ ! -name 'file.tgz' -delete
найти и удалить все файлы в директории, кроме файлов file1.txt и file2.txt:
find /dir/ -type f ! -name 'file1.txt' ! -name 'file2.txt' -delete
узнать количество файлов в директории:
найти и удалить директории в глубине уровня 3, относительно указанной
find /dir/name/path/ -mindepth 3 -maxdepth 3 -type d | xargs rm -rf
xargs - выполнение любой команды используя результаты предыдущей команды
пример в котором находится директория и копируется:
ls -Art /var/www/builds/ | grep myFolder- | tail -n 1 | xargs -I{} cp -r '/var/www/builds/'{} /var/www/builds/myFolderClone
пример удаления найденных директорий:
ls /my/dir/ | grep folder-name | xargs -I{} rm -rf '/my/dir/{}'
еще один пример удаления файлов:
find /mydir/ -type f -name '*.js' -exec rm -fr {} \;
Управление процессами
ps – вывести ваши текущие активные процессы (примеры: ps ax uf | more или ps ax -u | more)
top – показать все запущенные процессы
kill pid – убить процесс с id pid (kill -s 9 SID - чтобы наверняка)
killall proc – убить все процессы с именем proc *
bg – список остановленных и фоновых задач; продолжить выполнение остановленной задачи в фоне
fg – выносит на передний план последние задачи
fg n – вынести задачу n на передний план
kill -STOP 7727 – поставить на паузу процесс 7727. The eyes will stop moving when they are paused.
kill -CONT 7727 – снять с паузы процесс 7727
Права доступа на файлы
chmod octal file – сменить права file на octal, раздельно для пользователя, группы и для всех добавлением:
Примеры:
chmod 777 – чтение, запись, исполнение для всех
chmod 755 – rwx для владельца, rx для группы и остальных.
посмотреть octal файла можно так: stat -c "%a" /path/file
примеры:
изменяем владельца и группу для директории: chown R yapro:www /usr/home/dir
изменяем владельца и группу всем дочерним директориям и файлам: chown -v -R yapro:www /usr/home/dir/
изменение прав доступа к файлам и папкам, рекурсивно: chmod -R 775 /home/dir/
использование вместе с командой поиска:
выставляем права директориям: find /home/dir/ -type d -exec chmod 775 {} \;
выставляем права php-файлам: find /home/dir/ -type f -name '*.php' -exec chmod 644 {} \;
Установить права «rwxr-xr-x» (0755) для файла: chmod u=rwx,g=rx,o=rx filename
Простой вариант установить права «rw-rw-r--»: chmod ug=rw,o=r filename
Установить права на выполнение для владельца файла, удалить права на выполнение у группы, удалить права на запись и выполнение у остальных пользователей: chmod u+x,g-x,o-wx filename
Установить рекурсивно права на чтение для всех пользователей: chmod -R a+r directory
Рекурсивно удалить атрибуты SUID и SGID: chmod -R u-s,g-s directory
locate file – найти все файлы с именем file
grep pattern files – искать pattern в files
grep -r pattern dir – искать рекурсивно pattern в dir
например найти в текущей директории и вывести пути к файлам: grep -r -l mytext ./*
command | grep pattern – искать pattern в выводе command
примеры:
grep -rl 'text' /dir/ -- рекурсивный поиск строки во всех файлах директории
grep -rl --include="*.php" "my text" /dir/ -- поиск только по файлам с расширением .php
grep -rl 'text' /path/ | grep -v '\.svn' -- поиск строки в файлах, расширение которых не заканчивается на .svn
grep pattern file.txt --поиск pattern в файле file.txt, с выводом полностью совпавшей строкой
grep -o pattern file.txt --поиск pattern в файле file.txt и вывод только совпавшего куска строки
grep -i pattern file.txt --игнорирование регистра при поиске
grep -bn pattern file.txt --показать строку (-n) и столбец (-b), где был найден pattern
grep -v pattern file.txt --инверсия поиска (найдет все строки, которые не совпадают с шаблоном pattern)
grep -A 3 pattern file.txt --вывод дополнительных трех строк, после совпавшей
grep -B 3 pattern file.txt --вывод дополнительных трех строк, перед совпавшей
grep -C 3 pattern file.txt --вывод три дополнительные строки перед и после совпавшей
grep -r pattern $HOME --рекурсивный поиск по директории $HOME и всем вложенным
grep -c pattern file.txt --подсчет совпадений
grep -L pattern *.txt --вывести список txt-файлов, которые не содержат pattern
grep -l pattern *.txt --вывести список txt-файлов, которые содержат pattern
grep -w pattern file.txt --совпадение только с полным словом pattern
grep -f patterns.txt file.txt --поиск по нескольким pattern из файла patterns.txt, шаблоны разделяются новой строкой
grep -I pattern file.txt --игнорирование бинарных файлов
grep -v -f file2 file1 > file3 --вывод строк, которые есть в file1 и нет в file2
grep -in -e 'python' `find -type f` --рекурсивный поиск файлов, содержащих слово python с выводом номера строки и совпадений
grep -inc -e 'test' `find -type f` | grep -v :0 --рекурсивный поиск файлов, содержащих слово python с выводом количества совпадений
grep . *.py --вывод содержимого всех py-файлов, предваряя каждую строку именем файла
grep "Http404" apps/**/*.py --рекурсивный поиск упоминаний Http404 в директории apps в py-файлах
grep -i 'MAIL FROM\|RCPT TO' --совпадение по "MAIL FROM" или "RCPT TO"
egrep -r '"online"|"offline"' --совпадение по "MAIL FROM" или "RCPT TO"
tail -n12345 /var/log/apache2/other_vhosts_access.log | grep -v " 200 " | grep -v " 304 " - посмотреть неудачные ответы на запросы (посмотрите так же др. классные примеры по работе с логами apache)
Системная информация
date – вывести текущую дату и время ( синтаксис: yy]mm]dd]HH]MM[.ss] )
пример установки времени на сервере (секунды вводить не обязательно):
date 1230100509.45 # в Linux и Solaris; или
date 0912301005.45 # в FreeBSD
cal – вывести календарь на текущий месяц
uptime – показать текущий аптайм
w – показать пользователей онлайн
whoami – имя, под которым вы залогинены
finger user – показать информацию о user
показать информацию о ядре:
file /sbin/init - узнать разрядность ОС (или так: getconf LONG_BIT)
реальное имя OC или на чем базируется данная OC:
cat /proc/cpuinfo – информация ЦПУ
cat /proc/meminfo – информация о памяти
df – показать инф. о использовании дисков
du – вывести “вес” текущей директории
примеры:
вес указанной директории: du -shc /dir
вес директории указанной директории : du -shc /dir/*
размеры всех всех дочерних директории и файлов: du -hc /dir
размеры всех директории (включая скрытые) в текущей директории: du -sch .[!.]* * |sort -h
free – использование памяти и swap
whereis app – возможное расположение программы app
which app – какая app будет запущена по умолчанию
sudo lshw -short – информация о всем железе
Архивация
tar cf file.tar dir – создать tar-архив с именем file.tar содержащий files
tar xf file.tar – распаковать file.tar
tar czf file.tar.gz dir – создать архив tar с сжатием Gzip
tar czf ~/архив.tar.gz /путь/к/архивируемому/каталогу/
/bin/tar -czf archive.tar.gz dir dir2/image.gif - запаковать сразу из двух мест
tar xzf file.tar.gz – распаковать tar с Gzip
tar cjf file.tar.bz2 – создать архив tar с сжатием Bzip2
tar xjf file.tar.bz2 – распаковать tar с Bzip2
gzip file – сжать file и переименовать в file.gz
gzip -d file.gz – разжать file.gz в file
примеры:
распаковываем zip-архив:
создание tar-архива: tar -cz -f "file.tgz" "/home/dir/"
распаковка tar-архива: tar -xz --directory="/usr/home/dir/" -f "file.tgz"
распаковка tar-архива в текущую директорию: tar -xzf file.tar.gz
Жесткий диск
измерить скорость жесткого диска: dd if=/dev/zero of=testfile bs=64k count=16k conv=fdatasync
Сеть
ping host – пропинговать host и вывести результат
whois domain – получить информацию whois для domain
dig domain – получить DNS информацию domain
dig -x host – реверсивно искать host
netstat - показать содержимое различных структур данных, связанных с сетью, например проверим открытый порт 9123 и какая программа его открыла:
netstat -natp | grep 9123 tcp 0 0 0.0.0.0:9123 0.0.0.0:* LISTEN 2622/java
telnet - богатая утилита, но обычно я ей проверяю открыт ли порт, например:
telnet 127.0.0.1 9123 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
Как видите, подключение установлено, а чтобы выйти (прервать подключение) нажмите одновременно две клавиши Ctrl + ] затем введите quit и нажмите клавишу Enter.
например:
netstat -an | less
или посмотрим открытые порты:
sudo lsof -i
sudo netstat -lptu
sudo netstat -tulpn
SSH
ssh user@host – подключится к host как user
ssh -p port user@host – подключится к host на порт port как user
ssh-copy-id user@host – добавить ваш ключ на host для user чтобы включить логин без пароля и по ключам
scp -r <что копировать> localhost:<куда копировать>
scp -P 22 user@server:/from/dir/file.sql.gz /to/dir/file.sql.gz - скопировать с сервера на локальный ПК
scp -P 22 /from/dir/file.sql.gz user@server::/to/dir/file.sql.gz - скопировать с локального ПК на сервер
scp /home/dir1/a localhost:/home/dir2/ - Копирование файла а из dir1 в dir2
scp -r /home/dir1/ localhost:/home/dir2/ - Копирование каталога из dir1 в dir2
wget file – скачать file
wget -c file – продолжить остановленную закачку
примеры:
скачивание файла с фтп-сервера: ftp http://site.ru/file.tgz
скачивание файла по http: wget http://site.ru/file.tgz
Почта
отправить содержимое файла на почту:
cat /dir/file | mail -s "my config" user@site.ru
отправить приатаченный файл на почту:
mail -a /dir/file -s "my config" user@site.ru
и программа mail даст возможность ввести сообщение, написали - нажимайте Ctrl+D и письмо отправится.
Cron
Просмотр логов: grep cron /var/log/syslog | tail -n 10
Клавиатурные сочетания
Ctrl+C – завершить текущую команду
Ctrl+Z – остановить текущую команду, продолжть с fg на переднем плане или bg в фоне
Ctrl+D – разлогиниться, тоже самое, что и exit
Ctrl+W – удалить одно слово в текущей строке
Ctrl+U – удалить строку
!! – повторить последнюю команду
exit – разлогиниться
man command – показать мануал для утилиты по имени command
Полный список UNIX-команд можно найти на Википедии
p.s. чтобы работать с командами было веселей (удобней), советую разукрасить консоль:
$ nano ~/.bashrc
добавьте:
PS1='\[\033[01;31m\]\u\[\033[01;33m\]@\[\033[01;36m\]\h \[\033[01;33m\]\w \[\033[01;35m\]\$ \[\033[00m\]'
иногда, вместо файла .bashrc используется файл .bash_profile
wrapper(){
start=$(date +%s)
"$@"
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Notification" "Long\
running command \"$(echo $@)\" took $(($(date +%s) - start)) seconds to finish"
}Copy this function in your ~/.bashrc and source ~/.bashrc as
. ~/.bashrcUseage
wrapper <your_command>Эта команда анализирует логи ядра (dmesg), находит записи о сетевых пакетах, отправленных на конкретный IP-адрес 192.168.201.22, вырезает оттуда MAC-адреса (или интерфейсы/порты), а затем сортирует их и убирает дубликаты:
$ dmesg | grep DST=192.168.201.22 | awk '{print $7" "$8}' | sort | uniq
SRC=10.101.21.165 DST=192.168.201.22
SRC=10.101.23.165 DST=192.168.201.22
SRC=217.150.32.25 DST=192.168.201.22Если команда ничего не вывела, это значит, что в dmesg сейчас нет записей с таким IP-адресом (например, буфер очистился или логирование заблокированных пакетов не настроено).
Чтобы логи появились, нужно запустить постоянный ping к серверу, тогда можно понять, долетают пакеты или нет.
Пошаговый разбор конвейера
dmesgiptables -j LOG)| grep DST=192.168.201.22192.168.201.22.| awk '{print $7" "$8}'iptables в этих позициях обычно находятся входящий/исходящий интерфейсы (например, IN=eth0 OUT=) либо MAC-адреса (например, MAC=00:11:22...).| sortuniq ищет только идущие подряд повторения.| uniqИсточник: 1
Комментарии