Посты по тегу: bash

HTTP сервер для раздачи статики одной строкой

Иногда надо быстро поднять http сервер для отдачи какого-то одного или нескольких файликов.

Тут собраны несколько способов, как одной строкой запустить http сервер для раздачи статических файлов.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted

$ twistd -n web -p 8000 --path .

or

$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Ruby

$ ruby -run -ehttpd . -p8000

asdf

$ gem install adsf   # install dependency
$ adsf -p 8000

Sinatra

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

Perl

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Plack

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

PHP > 5.4

$ php -S 127.0.0.1:8000

busybox httpd

$ busybox httpd -f -p 8000

Консольные полезности 7

й, где была использована вспышка. Требуется ImageMagick

identify -format "%f F:%[EXIF:Flash]\n" *.jpg | egrep " F:(0|16|24|32)$"

Показать в файле символы табуляции

cat -T example.txt

Показать процессы httpd исключив сам grep

ps auxww | grep "[h]ttpd"

Список 20 самых больших по объему файлов/каталогов в текущем каталоге

du -ma | sort -nr | head -n 20

Удалить все письма из очереди Postfix за 11 декабря

mailq | awk '/^[0-9A-F]+ .+ Dec 11 /{print $1}' | xargs -n 1 postsuper -d

Сканировать внутренню сеть на хочты с открытым 22 портом

nmap --open -p T:22 192.168.1.0/24

Автоматически установить публичный ключ на удаленный хост

ssh-copy-id 'user@remotehost'

Использование -w в diif позволит игнорировать разницу в табах и пробелах

diff -w index.html bookexample/index.html

Поиск по файловой системе без спуска в /sys и /proc

find / \( -path /proc -o -path /sys \) -prune -o -print

Консольные полезности 6

Переименовать файл короткой командой:

mv foo.{old,new}

Показать количество НЕуспешных запросов (не 2хх, 3хх HTTP коды ответа)

awk '$9!~/^[23]/{print $4}' access_log | cut -c1-12 | uniq -c

Создать каталог и сразу перейти в него

mkdir dir && cd $_

Запустить скрипт из крона только если он еще не работает

*/3 * * * * if [[ -z $(pgrep offlineimap) ]]; then offlineimap -u quiet; fi

Проверить как давно работает процесс

ps -p PID -o pid,cmd,etime

scp не несколько удаленных хостов

parallel -j0 scp file.txt {}:/dstDir ::: user@srv1 user@srv2

Вывод dmesg в режиме реального времени и в "человеческом" виде (цвет, даты и т.п.)

dmesg -wH

Ого файла

sed '9417q;d' dbdump.sql

Текущее время в UTC:

date -u

Отцензурировать все email в report.txt

sed -r -i 's/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-z]{2,30}\b/xxx@yyy.zzz/' report.txt

wc имеет опции для подсчета символов, слов или строк:

wc -c
wc -w
wc -l

Объединить несколько pdf в один для печати

convert 1.pdf 2.pdf 3.pdf all.pdf

Суммировать числа из третьего столбца файла data.txt

awk '{s+=$3} END {print s}' data.txt

Вывести самую длинную строку из файла

awk 'length > max { max=length;maxline=$0 } END { print maxline; }' quotes.txt

Отсортировать вывод df, оставив заголовок вверху

df -hP | awk 'NR==1;NR>1{print|"sort -k5rn"}'

Разделить файл на несколько по 50 строк

split --lines=50 foo.txt

Проверить какая память установлена в компьютере не открывая его

dmidecode -t 17 
lshw -short -C memory

lftp: зеркалируем локальные и удаленные каталоги

lftp — программа для передачи файлов в сложных условиях ftp, http и других соединений. lftp имеет встроенную поддержку зеркалирования всего дерева каталогов. Она так же может зеркалировать в обратном режиме, т.е. сделать зеркало локального каталога на сервере, загрузив все файлы. Еще одна интересная возможность: зеркалирование двух удаленных серверов по протоколу FXP, если он доступен на серверах.

Синтаксис

mirror
mirror options
mirror -c
mirror -R

Пример: Как сделать зеркало удаленного каталога (скачать файлы)

Для начала необходимо подключиться к удаленному серверу:

lftp ftp.example.com

Введите имя пользователя и пароль:

lftp ftp.example.com:~> user user@example.com

Пример вывода:

Password:
lftp user@example.com@ftp.example.com:~>

Введите ls, чтоб увидеть список файлов:

lftp ftp.example.com:~> ls

Пример вывода:

-rw-r--r--    1 80       www      36809419 Jun 24 23:59 2012-06-24.log.gz
-rw-r--r--    1 80       www      100912271 Jun 25 23:59 2012-06-25.log.gz
-rw-r--r--    1 80       www      102926055 Jun 26 23:59 2012-06-26.log.gz

Для зеркалирования всех файлов в текущий каталог введите:

lftp ftp.example.com:~> mirror

С командой mirror вы можете указать исходный каталог и каталог назначения. Если каталог назначения будет оканчиваться на слеш («/»), то имя исходного каталога будет добавлено к каталогу назначения.

lftp ftp.example.com:~> mirror source destination

или

lftp ftp.example.com:~> mirror logs/ /data/logs

Я очень рекомендую использовать опцию, которая позволяет продолжить скачивание, если вдруг соединение оборвалось:

lftp ftp.example.com:~> mirror -c source destination

или

lftp ftp.example.com:~> mirror --continue

Чтоб скачать только новые файлы (не работает с -c):

lftp ftp.example.com:~> mirror -n

или

lftp ftp.example.com:~> mirror --only-newer

Вы можете ускорить загрузку файлов используя опцию параллельной загрузки:

lftp ftp.example.com:~> mirror -p

Чтоб указать количество потоков, введите:

lftp ftp.example.com:~> mirror --parallel=10

Пример: как сделать обратное зеркалирование (загрузка файлов)

Для создание обратного зеркала каталога вам необходимо передать опцию -R или —reverse команде mirror. Для начала вам необходимо подключиться к серверу, как было показано в предыдущем примере.

Сменить локальный каталог:

lftp ftp.example.com:~> lcd /home/silver/project/lftp

Пример вывода:

lcd ok, local cwd=/home/silver/project/lftp

Для загрузки дерева файлов и каталогов на сервер:

lftp ftp.example.com:~> mirror -R

или укажите локальный и удаленный каталоги:

lftp ftp.example.com:~> mirror -R /home/silver/project/lftp /var/www/html

Для выхода из FTP сессии:

lftp ftp.example.com:~> quit

Консольные полезности 5

Пинг с префиксом в виде времени:

$ stdbuf -i0 -o0 ping 192.168.42.1 | while read l; do echo "[$(date '+%H:%M:%S')] $l"; done

В bash, выполнить предыдущю команду с заменой foo на bar:

$ ^foo^bar

Показать процессы по потреблению питания (полезно для ноутбуков):

$ sudo powertop

Не очищать экран при выходе из less:

alias less='less -FX'

Принудительная проверка диска после перезагрузки:

Читать далее...

25 примеров использования утилиты find

Краткое описание find

Утилита find позволяет искать по:

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

Если файл был найден, то мы можем сделать следующее:

  • просмотреть или отредактировать
  • сохранить
  • удалить или переименовать
  • сменить права доступа
  • любое другое действие

Немного примеров:

Простой поиск

1. Поиск всех обычных файлов

$ find Symfony -type f
Symfony/web/.htaccess
Symfony/web/app.php
Symfony/web/app_dev.php
Symfony/web/robots.txt
...

2. Поиск всех каталогов

$ find Symfony -type d
Symfony/
Symfony/web
Symfony/web/bundles
Symfony/web/bundles/webprofiler
...

3. Поиск по имени файла или каталога

$ find Symfony -name '*config*';
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

4. Поиск по имени (регистронезависимый)

$ find Symfony -iname '*config*';
...
Symfony/.../Loader/ConfigurationLoader.php
Symfony/.../ConfigurationResource.php
...
Symfony/app/config
Symfony/app/config/config_prod.yml
Symfony/app/config/config.yml
...

Поиск на основании размера

5. Найти все файлы, размер которых 300MB

$ find . -size 300M

6. Найти все файлы, размер которых больше 300MB

$ find . -size +300M

7. Найти все файлы, размер которых меньше 300MBкаталоги

$ find . -empty

Поиск по дате

GNU/Linux хранит последнюю дату следующих операций:

Операция Значение Опции find
access чтение содержимого файла -atime, -amin
modification изменение контента файла -mtime, -mmin
change of status смена имени файла или атрибутов (права доступа, владелец, ...) -ctime, -cmin

Чтоб узнать даты файла можно использовать команду stat:

$ stat index.php
...
Access: 2016-06-02 22:53:22.813885684 -0500
Modify: 2016-05-08 12:12:12.971073193 -0500
Change: 2016-05-08 12:12:12.971073193 -0500

10. Найти файлы с датой доступа менее 15 дней назад

$ find . -atime -15

11. Найти модифицированные файлы более 7 дней назад

$ find . -mtime +7

12. Найти измененные файлы в промежутке от 2 до 6 минут назад

$ find . -cmin +2 -cmin -6

Поиск основанный на имени пользователя или группы

13. Найти файлы пользователя sedlav

$ find . -user sedlav -type f

14. Найти файлы, которые относятся к группе flossblog

$ find . -group flossblog -type f

15. Найти файлы, где владелец имет uid между 500 и 1000 (исключая 500 и 1000)

$ find . -uid +500 -uid -1000 -type f

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

16. Найти все файлы, которые не принадлежат ни одному пользователю

$ find . -nouser

17. Найти все файлы, которые не принадлежат ни одной группе

$ find . -nogroup

Поиск на основании прав доступа

find позволяет искать файлы, которые может читать (-readable), писать (-writable) или запускать (-executable) текущий пользователь или файлы, которые имеют определенные права

18. Найти все файлы, которые может читать текущий пользователь

$ find . -readable

19. Найти все файлы, которые может записывать текущий пользователь

$ find . -writable

20. Найти все файлы, которые может запускать текущий пользователь

$ find . -executable

Поиск файлов с определенными правами доступа

-perm PMODE

  • PMODE может быть числовым или символьным
  • PMODE может иметь префикс / или -
  • Если PMODE не имеет префикса / или -, тогда права файла должны точно соответствовать PMODE
  • Если PMODE имеет префикс -, то права файла должны содержать PMODE
  • Если PMODE имеет префикс /, то права файла должны содержать любой из битов указанных в PMODE (символьные права не допустимы)
Права Числовое обозначение Символьное обозначение
Чтение 4 r
Запись 2 w
Запуск 1 x

Примеры:

21. Найти все файлы, владелец и группа которых имеют права на чтение и запись, а остальные могут только читать
$ find -perm 664
22. Найти все файлы, владелец и группа которых имеют права на чтение и запись, а остальные могут только читать

Примечание: - перед правами указывает на то, что будут найдены так же все файлы с правами: 777, 666, 776

$ find . -perm -664
23. Найти все файлы, которые может модифицировать (записывать) любой пользователь
$ find . -perm /222

Расширенный поиск

24. Поиск на основе регулярных выражений по каталогам на 1 уровень ниже

Найти все каталоги одним уровнем ниже каталога project (не рекурсивный поиск), которые не пусты, не оканчиваются на цифру, old backups, bkp или содержат слова backup, copy, new с последующим одинм из символов -_. .

$ PATTERN='.*/((.*([0-9]|old|ba?c?ku?ps?))|(..*)|(copy|new|backup|back|)[-_.].*)$';
$ find project -maxdepth 1 -mindepth 1 -regextype posix-egrep ! -iregex  $PATTERN  ! -empty -type d

25. Комбинируем find, xargs и grep

Это очень удобный пример для сложного поиска. Пример, найдем слово ireg во всех php файлах в project:

$ find project -name '*.php' -type f -print0 | xargs -0 grep -l ireg

Оригинал статьи

Консольные полезности 4

Последние добавленные файлы логов

ls -ltr /var/log | tail

Скопировать права с одного файла на другой

chmod --reference=foo.txt bar.txt

Удалить дубли строк

awk '!seen[$0]++' app.logfile

Хак для cd (смена каталога)

CDPATH=/etc:/usr/local/etc 
cd httpd # cd to /etc/httpd 
cd foo # cd /usr/local/etc/foo

Игнорирование в истории комманд

export HISTIGNORE="&:[ ]*:exit:ls:bg:fg:history:clear"

Удалить предыдущую строку из истории и вызов этого алиаса

alias hideprev='history -d $((HISTCMD-2)) && history -d $((HISTCMD-1))'

Поиск заражлить миллионы файлов

rsync -a -delete empty/ foo/

Усыпить процесс и перенсти его в screen

longcmd ; [Ctrl-Z] ; bg ; disown ; screen ; reptyr $( pidof longcmd )

Посмотреть SELECT'ы и ответы MySQL (не работает с Unix соккетом)

ngrep -d eth0 -i 'select' port 3306

Удалить все сообщения за 20 января из почтовой очереди Postfix

mailq |grep " Jan 20 " |awk {'print $1'} |xargs -n 1 postsuper -d

Преобразовать все в нижний регистр

tolower(){ echo ${@,,}; }

Если игра вышла и не восстановила разрешение экрана, то попробуйте это

xrandr -s 0

Нет telnet, netcat? Не беда

curl -v telnet://blt.evedder\.otv:4240

Наблюдаем за несколькими командами одновременно. Все знаки (кавычки, точки с запятой, etc) имеют значение!

watch -n 10 '{ uptime ; free ; df -h; }'

Список файлов, сгруппированный по расширениям

ls -X

Детальная статистика по дисковому разделу

vmstat -p /dev/sda6

Отсортировать список IP адресов

sort -V ipv4addrs.txt

Консольные полезности 3

Отправить первые 80 гигабайт диска на удаленный хост:

dd if=/dev/sda bs=1G count=80 |pv -s80G |pbzip2 -c |ssh user@remote 'cat > /tmp/sda-80GB.bz2'

Удалить слово перед курсором:

<Ctrl+W>

Как выйти из vim:

<ESC>:q!

Запустить htop на удаленном сервере с локальным отображением:

ssh host -t htop

Консольная утилита для чтения PDF:

pdftohtml -stdout my.pdf > my.pdf.html; elinks my.pdf.html

Архивирование множества лог файлов в параллельных потоках по количеству ядер сервера:

ls *.log | parallel xz -v

Консольные полезности 2

В Линукс найти процесс dd и вывести прогресс его работы:

kill -USR1 $( pidof dd )

Найти к какому пакету относится файл. Перед этим необходимо установить apt-file.

apt-file search /usr/bin/apxs2

Найти строки с eval( в PHP файлах в пользовательский www каталогах:

find /home/*/www -name "*.php" -exec grep --color -H -n 'eval(' {} +

Скачать файлы в диапазоне от IMG_0001.JPG до IMG_1000.JPG:

curl --remote-name http://www.example.com/images/IMG_[0001-0100].JPG

[Ctrl+\] - более "жесткая" версия Ctrl+C, посылает SIGQUIT, который убивает большинство программ. Многие до сих пор это обрабатывают. "Сильнее" только kill -9.

Найти все файлы больше 100М и вывести их с человеческими размерами:

find / -size +100M -exec ls -sh {} \;

Перейти в предыдущую ветку, где был до этого:

git checkout -

Команда mirror для использования камеры и mplayer в качестве зеркала:

mirror(){ mplayer -vf mirror -v tv:// -tv device=/dev/video0:driver=v4l2; }

Консольные полезности

Функция-разделитель:

separator(){ printf '%*s\n' $(tput cols) '' | tr ' ' -; }

Перенести процесс в другую консоль:

$ reptyr <pid>

Перевести процесс в фон и уведомить, когда он завершится:

<ctrl-z> bg ; wait %1 ; echo "done" | mail -s "done" you@example.com

Сгенерить данные персонажа для тестов:

rig

Какие сервисы используют не обновленные библиотеки:

$ sudo lsof -n | grep ssl | grep DEL

Послать запрос в unix socket:

printf "GET / HTTP/1.1\r\nHost: http://example.com\r\nConnection: close\r\n\r\n" | nc -U /tmp/unicorn.sock

Послать запрос серверу с указанием протокола HTTPS:

curl -v -H "X-FORWARDED-PROTO: https" http://localhost/