воскресенье, 30 августа 2015 г.

linux notes

www.zabrosov.ru - обширная шпаргалка по командам Линукс в примерах.
Некоторая часть из нижеописанного актуальна для ubuntu и подобных дистрибутивов.

*** Как загрузить Ubuntu без графики? [from]
В меню загрузки ОС отредактировать конфигурация заменив quiet splash на text.

*** Как избежать сохранения команды в истории bash?
Для этого нудно оставить перед ней пробел.

*** Как сохранить введённую в консоли команду без её выполнения? [se]
Ctrl + U - для запоминания
Ctrl + Y - для вставки запомненной команды

*** Если файл существует, то выполнить действие...
if [ -f filename ]; then echo "exists"; fi
Синтексис управляющих операторов [подробнее]


Цсловный оперетор
if условие; then ... else ... fi
if условие; then ... elif [ .. ] ... fi

Цикл с предусловием
while условие; do ... done


Условие может выглядеть так [подробнее]
(( `hcitool scan | wc -l` > 1 ))

diff etc
сравнивает содержимое файлов
раскрасить вывод diff [SO]:
diff old new | colordiff
Графические приложения для сравнения файлов: Kompare, Meld.
Последнее умеет делать слияние файлов.

Vim, [Vim Викиучебник]

Управление
i - перейти в режим (вставки) редактирования;
Esc - перейти в нормальный режим (режим ввода комманд)
v - пеерейти в режим выделения текста.
/ слово - поиск вперёд
? слово - поиск назад
n и N - следующее и предыдущее вхождение

yy - копировать строку
pp - вставить строку

:q - выход
:q! - выход без сохранения
:wq - сохранить и выйти
:set nu - включить номера строк
.vimrc - файл настроек.
...

***
wc <file>    - посчитать число строк, слов и размер файла в байтах


***

Напечатать DOC файл в консоли
antiword file

PDF

Показать PDF в консоли ][
sudo apt-get install fbi
Для просмотра пользователь должен быть добавлен в группу video:
$ sudo usermod -a -G video user
Теперь можно смотреть:
$ fbgs file.pdf
 
Собрать PDF из отдельных изображений(страниц) [SO]
convert page*.png mydoc.pdf
Вырезать из PDF файла страницы [askubuntu]
pdftk full-pdf.pdf cat 12-15 output outfile_p12-15.pdf


== latex ==
TeX-live        - core
Kile            - editor
TexMaker         - editor
texlive-latex-extra   

xneur        - PuntoSwitcher for linux
Stardict     - Context dictioary
          copy dictionaries to /usr/share/stardict/dic


***
Напечатать время в каждой строке вывода [SO]
nc localhost 30003 | awk '{print strftime("%m-%d %H:%M:%S"), $0; fflush();'
Здесь для печати времени в формате %m-%d %H:%M:%S перед каждой строкой $0 вывода nc используется скриптовый язык AWK [rus-linux, linuxgeeks].

Ещё один способ (необходим пакет moreutils)[stackexchange]
echo "foo" | ts '[%Y-%m-%d %H:%M:%S]
***
Разбить строку на поля по разделителю ':' и вывести только второе (-f 2) поле
echo email:password | cut -d ':' -f 2
***
Направить вывод команды одновременно на экран и в файл [SO, Tee]

nc localhost 30003 | tee logfile.txt


***
Сгенерировать QR-код.
qrencode "hello" -o image.png
Сгенерировать  QR-код в ASCII-арт и тут же его показать.
qrencode "hello" -t ASCII - | cat

Сеть и интернет

SSH


У каждой машины с установленным SSH сервером есть свой уникальный идентификатор - отпечаток ключа шифрования, который генерируется во вреся установки сервера. При подключении, до того как сервер запросит пароль, этот отпечаток выводится на экран. Это необходимо, чтобы удостоверится в подлинности сервера и защитить себя от MitM.

-ssh -o VisualHostKey=yes pi@192.168.2.35












Поэтому для начала нужно узнать один или несколько различных отпечатков используя программу ssh-keygen. Программе передаются два параметра -l (вывести отпечаток ключа) и -f <путь к ключу>. "Нарисовать" как и раньше отпечаток поможет ключ -v. Устаревшее шифрование алгоритмом DSA используется редко. В основном в ходу RSA и ECDSA.
Узнать отпечаток ECDSA ключа
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
Отпечатки могут быть по разному представлены (в зависимости от версии SSH [SU]), например клиентская программа напечатает в виде шестнадцатеричного числа, а сервер (комманда ssh-keygen) в base64.

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

Сгенерируем ключи
ssh-keygen
они будут сохранены в .ssh/id_rsa, откуда  потом их можно загрузить в память:
ssh-add key_file
Просмотреть загруженные ключи
ssh-add -l
***
Копировать файл по ssh на удалённый хост
scp file user@host:new_file

Посмотреть отпечаток ключа сервера
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
***
Отпечаток публичного ключа ssh-сервера (например ECDSA key fingerprint is 09:0c:2f:bb:9d:f3:69:21:5c:3c:a9:ec:dd:a2:18:16) трудно запомнить, однако его можно "рисовать" при подключении подобным образом [www.howtogeek.com]:

с помощью опции -o VisualHostKey=yes:
ssh -o VisualHostKey=yes user@host
***
Не добавлять адрес в список известных.
Иногда при подключении к серверу нет необходимости добавлять его с список доверенных (known_hosts). Один их способов, это самостоятельно указать путь для этого файла, заменив его на /dev/null (-o UserKnownHostsFile=/dev/null):
ssh -o UserKnownHostsFile=/dev/null user@some_server

***

Смотреть файлы на удаленной машине удобнее всего через файловый менеджер. Например в nautilus: File > Connect to Server... В качестве адреса использовать: sftp://user@server. Фактически будет смонтирована удалённая файловая система. Это в частности решает проблему просмотра графических и др. файлов в консоли.

*** Socks-proxy
Чтобы дать возможность обращатся локольному приложению с IP ssh сервера к другим машинам можно настроить ssh в режиме socks-прокси. Это решит и проблему открытого или недоверенного соединения с интернетом, например в случае публичного WiFi. Весь траффик будет передаватся по защищённому каналу между ssh клиентом и сервером, и в конце концов будет исходить как буд-то от машины, на которой запущен ssh сервер.
Подключемся к серверу в режиме socks прокси
ssh -D 8080 user@server
Теперь остаётся настроть локальное приложение, например браузер, на использование прокси localhost:8080.

tmux

Менеджер терминалов, аналог screen.
tmux - запустить и создать новую сессию.
tmux attach - подключится к последней сессии. Удобно при подключении по ssh вернутся в то же место, на котором закончил в последний раз.
Запущенные в tmux приложения продолжают выполнятся, даже если соединение по ssh было разорвано.
Ctrl+b, c - создать новый терминал.
Ctrl+b, 1 - переключится на терминал #1.
Ctrl+b, d - отключится
Ctrl+b, [ - включить прокрутку
Ctrl+b " - split pane horizontally.
Ctrl+b % - split pane vertically.
Ctrl+b arrow key - switch pane.
Hold Ctrl+b, don't release it and hold one of the arrow keys - resize pane.
Ctrl+b c - (c)reate a new window.
Ctrl+b n - move to the (n)ext window.
Ctrl+b p - move to the (p)revious window.

mosh

Браузер в консоли

links2 [URL]
-dump - вывести страницу на стандартный вывод

wget 

скачать файл:
wget URL -O КУДА(имя файла)

***

Измерить пропускную способность сети - iperf
Запустить сервер, по желанию указать интерфейс -s 192.168.1.9:
iperf
Запустить клиент но 10 секунд (или на N секунд -t N):
iperf -c <server_ip>

Показать использование сети каждым процессом
nethogs

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

***
VNC
http://geckich.blogspot.com/2012/09/vino-vnc-linux.html

Подключения

Подключиться к сети my_wifi используя nmcli (network manager)
nmcli connection add con-name mynewcon ifname wlan0 type wifi ssid myssid
nmcli connection modify mynewcon 802-11-wireless-security.key-mgmt wpa-psk
nmcli connection modify mynewcon 802-11-wireless-security.psk password123

Запустить HTTP сервер в любой папке [askubuntu]
python -m SimpleHTTPServer 80
python3 -m http.server
Порт (80) можно не указывать.
Это быстрый способ сделать доступным содрежимое каталога для других.

Если требуется запустить сервер для сайта, работающего на php то:

php -S 0.0.0.0:8080



Using the NetworkManager Command Line Tool, nmcli
***

How do I change the hostname without a restart?
How to spoof the MAC address of a network interface on Linux


Отправить сообщение из консоли через XMPP

Создать простой файл конфигурации в каталоге пользователя .sendxmpprc который будет содержать имя пользователя от имени которого будет отправлено сообщение, сервер и пароль:
user@jabber.com password
Права на доступ к файлу должен имть только текуший пользователь:
chmod 0600 .snedxmpp
Наконец можно отправлять сообщение (используя tls соединение -t)
echo "Hello" | sendxmpp -t reciver@jabber.com

Отправить сообщение через публичный почтовый сервер

sendEmail -f "from@server.ru" -t "reciver@server.ru" -u "Subject" -m "message" -s "smtp.server.ru" -xu "from@server.ru" -xp password
-f адрес_отправителя
-t адрес_получателя
-u тема
-s smtp сервер[:порт]
-xu имя_пользователя_для_авторизации
-xp пароль_для авторизации

*** Узнать свой публичный IP [askubuntu]

Самый простой способ сделать это - спросить IP у одного из web-сервисов. Стоит выбирать те сайты, которые выдают IP адрес простым текстом, без лишнего оформления. Используем программу curl
curl ipinfo.io/ip
curl ifconfig.me
curl icanhazip.com
curl ipecho.net/plain; echo
Если IP адрес выдаётся в одну строку, без символа переноса строки то добавим его с помощью последующего вызова echo, как это сделано в последнем примере

Геолокация по IP

geoip <IP>
#<struct GeoIP::Country request="8.8.8.8", ip="8.8.8.8", country_code=225, country_code2="US", country_code3="USA", country_name="United States", continent_code="NA">
или
geoiplookup <IP>
GeoIP Country Edition: US, United States
GeoIP City Edition, Rev 1: US, CA, California, Mountain View, 94040, 37.384499, -122.088097, 807, 650
GeoIP ASNum Edition: AS15169 Google Inc.
How to Do IP Address Geolocation Lookups

Система

Системные мониторы (консольные)
htop
glances

*** Отправить сообщение во все открытые терминалы [stackexchange]

sudo wall -n Hello

cron

Редактировать расписание:
crontab -e
Каждая запись расписания состоит из нескольких полей [wiki]:
* * * * * выполняемая команда
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (Воскресенье =0 или =7)
| | | ------- Месяц (1 - 12)
| | --------- День (1 - 31)
| ----------- Час (0 - 23)
------------- Минута (0 - 59)
* (звёздачка) обознаяает любое значение, таким образом запись
* * * * * ~/script.py 
буде означать, что скрипт в домашнем каталоге пользователя бедет запускатся каждую минуту (каждую минуту каждого часа каждого дня месяца каждого дня недели) 
Следующая комманда будет запускатся каждые пять минут
*/5 * * * * echo "Прошло пять минут"
Вместо описания времени, можно указать событие - перезагрузка (@reboot). Тогда запись длжна выгялдеть так
@reboot ~/script.py 

Есть и другой способ запускать программу переодически. Утилита watch будет запускать скрипт script.py комманду каждый 60 секунд:
watch -n 60 ~/script.py
***
who        - who is logged?
ps        - show processes

tightvncserver  - vnc server
tightvncpasswd - set password

 

Диски и разделы

df -h             # show hdd free space
fdisk -l        # list of all disks
gparted

***
Анализ занятого места на диске из консоли [SE]
ncdu

***
gsmartcontrol                - GUI smart

== smartmontools (пакет) ==
smartctl --scan                - scan for the devices
smartctl /dev/sda -x            - show info

== fix ntfs ==
ntfsprogs                - пакет
ntfsfix /dev/sda1            - Fix common filesystem errors and force Windows to check NTFS

Сделать образ диска

dd if=/dev/sdb of=disk.img bs=4k
if - диск;
of - имя файла в который будет сохранён образ;
bs - размер блоков, которыми будет производится копирование.
По-умолчанию информации о ходе операции не показывается, чтобы это исправить нужно добавить опцию [askubuntu]
status=progress
В старых версиях во время копирования никакой информации о прогрессе не показывается.

Объём скопированных данных показывает утилита dcfldd основанная на dd. Программе можно указать дополнительные опции, которые могут быть полезны, если во время копирования возможны ошибки чтения. noerror и sync - не даст программе остановится при возникновении ошибки, а нечитаемый блок (размер указан в опции bs) при копировании будет заполнен нулями.
dd if=/dev/sdb of=disk.img bs=4k conv=noerror,sycn
Для плохо читаемых дисков иметь смысл уменьшить размер блока.
Чтобы показывать состояние [askubuntu] операции нужно добавить параметр status=progress

dd if=/dev/sdb of=disk.img bs=4k conv=noerror,sycn status=progress 


По окончанию операции копирования хорошо будет сравнить хэши:
md5sum disk.img
md5sum /dev/sdb

md5sum не показывает статуса о ходе операции, поэтому вызывая её для больших объёмов данных нельзя сказать о длительности операции. Воспользуемся отдельной программой pv, [habr] которая показывает прогресс бар, скорость и другую информацию:
pv disk.img | md5sum
Чтобы сжать образ на лету используем gzip [create a compressed backup image]:
dd if=/dev/sda | gzip -9 > /mnt/external/filename.img.gz
-1 - быстрое сжатие
-9 - качественное сжатие (медленно)

Стоит отметить, что создание образа таким способом может быть очень медленным.

=== boot manager ===
startupmanager                 - gui for grub settings

***
Температура
http://www.youisbee.ru/howto/linux/86-nastrojka-lm-sensors-v-debian-ubuntu.html

***

Установить частоту, например для четырёхрядерного процессора:
for i in 0 1 2 3; do cpufreq-set -c $i -g ondemand; done

*** music

Проиграть звук из консоли:
paplay /usr/share/sounds/KDE-Im-Sms.ogg
Воспроизвести mp3 [superuser]:
mpg123 music.mp3
cmus - консольный аудиоплеер

== other ===
bc        - console calculator
gksudo <app>    - run GUI app with root

=== console ===
Alt+.        - previous param
== screen ==
Ctrl+A, S       - split the screen horizontaly
Ctrl+A, Tab     - switch the windows
Ctrl+A, c       - create new session in a windows
Ctrl+A, |       - split the windows verticaly
Ctra+A, X       - close window

== write console to the file ==
bash > <file>     - start new session and write output to the file. (No output at the screen)
bash | tee <file> - start new session and write output to the file

== history ==
!n               - execute command with position #n in history
!-n              - execute command with position #n from tail in history
!!                - выполнить последнюю комманду

Файлы и папки

Получить полное имя файла [so]:
readlink -f file.txt

Узнать объём директории:
    du -sh /home/user
-s -  напечатать только суммарный объём файлов
-р - в удобном для чтения виде

Поиск всех файлов с именем test
    find / -name test

Вернуться в домашнюю директорию:
    cd

Сделать что-либо со всеми файлами в папке, например, распаковать все zip архивы в текущей папке:
    for f in *.zip ; do unzip $f ; done

Архиваторы [help.ubuntu]
Архиваторы bzip2 и gzip не способны обрабатывать несколько файлов, поэтому файлы для архивирования часто помещают в один контейнер - несжатый архив tar,  который непосредственно уже можно сжимать.

Сжатие -c архиватором gzip -z в файл с именем z.tar.gz. Файлы которые нужно сжать указываются последнем параметром
tar -сzf z.tar.gz file1 file2 file3
Просмотр -t содержимого архива (добавить ключ -v для подробных сведениях о файлах):
tar -tf z.tar.bz
Распаковка архива:
tar -xf z.tar.bz 
или распаковка в каталог -С:
tar -xf z.tar.bz -С /extract/here

Изображения

Удалить EXIF данные и перезаписать файл [exif]
exiftool -overwrite_original -all= image.jpg
Изменить размер изображение в два раза и увеличить степень сжатия (с потерями)
convert -resize 50% -quality 80 image.jpg image-new.jpg

Железо

Средствами "из коробки" показать всю информацию о железе в одном месте и в удобном для человека виде можно, но для этого придётся запускать несколько программ и возможно обрабатывать их вывод [more, подробнее]. 
Поэтому чтобы просто и наглядно представить данные о аппаратном обеспечении нужно установить дополнительный пакет: inxi.
Программа умеет показывать многое [more], но необходимый минимум информации можно посмотреть вызвав:
inxi -Fx
dmesg - показывает буффер сообщений ядра, среди которых может быть информация о вновь подключённых устройствах.
Ключи:
-H - вывод в более читаемом виде (например использование относительного времени для сообщений);
-w - вывод в реальном времени.
lshw - консольная утилита рассказывающая о аппаратном обеспечении, можно импортировать вывод программы в html;
lshw-gtk - то же самое но с графическим интерфейсом.
Программу нужно запускать от имени сеперпользователя, иначе информация может быть скудной.

HardInfo - менне детальная информация, дружелюбный интерфейс.

lspci - печатает информацию о PCI шинах и подключённых к ним устройствах (в том числе USB).

WiFi

iw list

lspci | grep -i network
 
Узнать состояние аккумулятора наутбука
acpi -b 
Battery 0: Full, 100%
acpi -V  # вся информация
***
cat /sys/class/power_supply/BAT1/capacity
***
upower -i /org/freedesktop/UPower/devices/battery_BAT1

Антивирус

Свободный CalmAV  - обладает достаточно скромными возможностями по сравнению с популярными антивирусами. Это скорее сканер чем полноценный антивирус, хоть он и может работать в режиме демона. Поэтому для полноценной защиты его будет недостаточно.
Обновить базу (требуются права суперпользователя):
freshclam
Сканировать файл:
clamscan файл
Рекурсивно сканировать папку:
clamscan -r Downloads
При этом в вывод попадут все просканированные файлы. Чтобы напечатать только заражённые файлы необходимо использовать ключ --infected.
Графическая оболочка для антивируса - clamtk.
Об эффективности антивируса в сравнении с другими http://www.shadowserver.org/wiki/pmwiki.php/Stats/VirusYearlyStats

Программа chkrootkit предназначена для поиска руткитов. Установка, настройка и использование сканера уязвимостей chkrootkit

GPG

gpg -c <file>     - encrypt the file with password
gpg <file>        - decrypt

http://wiki.linuxformat.ru/wiki/LXF117:GPG
http://wikiadmin.net/gnupg/

***

=== windows ===
chntpw - registry editor

Регулярные выражения etc

Показать строки содержашие mytext
cat myfile | grep mytext
text1 ИЛИ text2:
cat myfile | grep -e text1 -e text2 
показать 5 строк до и после
cat myfile | grep -e text1 -С 5
Показать всё, кроме
... | grep -v some_text
Показать только текст совпадающий с шаблоном (-o)
... | grep -o some_regexp
Grep Cheat Sheet


***
Вычислить md5 хэш

echo -n "[eqyz" | openssl md5


Программирование etc

Отформатировать код на Pascal\Delphi:
ptop src.pas new_src.pas
Утилита ptop входит в состав FPC.

***
Интерпретатор JavaScript в консоли - rhino

***
Увидеть содержимое файла в шестнадцатеричном виде:
xxd файл
hexdump файл
 Иногда полезно вывести файл в виде набора значений байт. Добавим ключ -e с описанием соответствующего формата:
' [iterations]/[byte_count] "[format string]" '
Применяет строку формата format string к группам байт по byte_count штук iterations раз. format string описывается подобно формату функции printf.
hexdump -ve '1/1 "%x"' ave.txt
-v - не пропускать повторяющие данные (hexdump заменяет их сиволом *)
%x - печатать шестнадцатеричные значения

Регулярные выражения

Памятка
Регулярные выражения для валидации распространенных видов данных


=== apt-get ===
sud    apt-get install openssh-server mc vim gedit links2 git python galculator  codeblocks gnuplot deluge vlc marble stellarium lynx thunderbird  wxmaxima lazarus synaptic gnome-tweak-tool shutter blender inkscape gimp file-roller virtualbox stardict xneur texlive kile mcabber keepass2 clementine texmaker texlive-lang-cyrillic xdotool pidgin celestia cmus jabref screen stardict sshfs goldendict

apt-get install samba libpam-smbpass sshfs firefox-mozilla-build gpg gauke truecrypt 

apt-get install nmap wireshark hydra crunch aircrack-ng  metasploit mtr bkhive samdump2 chntpw dsniff sslstrip ettercap-text-only ngrep tshark dsniff ettercap-graphical ettercap-text-only

Переменные пользователя в bash

Переменная создаётся в момент присваивания значения: 
myvar=1234
myvar2='Ave Statanas'
Пробелы вокруг оператора присваивания = недопустимы.
Чтобы обратится к переменной, перед её именем нужно поставить знак $.
Печать содержимого переменной: echo $myvar2

Сылки

понедельник, 20 апреля 2015 г.

Exif

Работа с Exif данными в Linux.

Просмотр данных

exif - простая консольная утилита для извлечения\экспорта Exif данных. 
exif 1.jpg
Вывод утилиты:
EXIF tags in '1.jpg_original' ('Intel' byte order):
--------------------+----------------------------------------------------------
Tag                 |Value
--------------------+----------------------------------------------------------
Ширина изображения  |3264
Длина изображения   |2448
Производитель       |Canon
Модель              |Canon PowerShot S40
Ориентация          |Right-top
X-Resolution        |72
Y-Resolution        |72
Единица разрешения  |Дюйм
Программное обеспече|XXXXXX
Дата и время        |2025:12:20 15:01:14
Позиционирование YCb|Centered
Ширина изображения  |160
Длина изображения   |120
Сжатие              |Сжатие JPEG
Ориентация          |Right-top
X-Resolution        |72
Y-Resolution        |72
Единица разрешения  |Дюйм
Время экспозиции    |1/17 сек.
Число F             |f/2,6
Exposure Program    |Приоритет диафрагмы
ISO Speed Ratings   |320
Версия EXIF         |EXIF версии 2.2
Date and Time (Origi|2025:12:20 15:01:14
Date and Time (Digit|2025:12:20 15:01:14
Настройка компоненто|Y Cb Cr -
Скорость срабатывани|4,06 EV (1/16 сек.)
Диафрагма           |2,76 EV (f/2,6)
Яркость             |0,16 EV (3,83 кд/м^2)
Смещение экспозиции |0,00 EV
Maximum Aperture Val|2,76 EV (f/2,6)
Режим замера        |Центрально-взвешенный средний
Вспышка             |Вспышка не сработала
Фокусное расстояние |13 mm
Maker Note          |98 байт неопределённых данных
Пользовательский ком|
FlashPixVersion     |FlashPix версии 1.0
Цветовое пространств|sRGB
Pixel X Dimension   |3264
Pixel Y Dimension   |2448
Режим экспозиции    |Автоэкспозиция
Баланс белого       |Автомат. баланс белого
Scene Capture Type  |Standard
Уникальный ID изобра|LJFQ29
Индекс совместимости|R98
Версия совместимости|0100
--------------------+----------------------------------------------------------
EXIF data contains a thumbnail (10660 bytes).

Удаление и изменение

Удалить все Exif данные:
exiftool -all= <имя файла>
Имя файла должно идти после пробела. Exiftool при удалении данных создаёт резервную копию файла. Во избежание этого следует использовать ключ -overwrite_original

Изменение даты
Изменить все даты ( DateTimeOriginal, CreateDate, ModifyDate):
exiftool -AllDates="2000:01:01 12:00:01" 1.jpg

***

Заголовок, автор ключевые слова (-Author, -Keywords)
exiftool -Title="Заголовок" file.jpg
Изменить данные о камере:
exiftool -model='camera obscura' 2.jpg
exiftool -moke='Canon' 2.jpg

GPS

Отредактировать GPS данные, например установить долготу в 35° 15' 30" в западном полушарии (E):


exiv2 -M "set Exif.GPSInfo.GPSLongitude 35/1 15/1 30/1" -M "set Exif.GPSInfo.GPSLongitudeRef E" 2.jpg


При необходимости можно указать расположение места съёмки прямо на карте с помощью программы GottenGeography. Используемая карта - OpenStreetMap

***
MAT - простая утилита с графическим (и консольным) интерфейсом для удаление Exif данных.

Exif online

Просмотреть Exif данные, в том числе карту и адрес можно используя онлайн сервис Jeffrey's Exif Viewer

Извлечение изображений из PDF 

Список изображений включёных в PDF
pdfimage -list <pdf-file>

page   num  type   width height color comp bpc  enc interp  object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
Syntax Warning: Invalid Font Weight
Syntax Warning: Invalid Font Weight
   1     0 image    2480  3508  rgb     3   8  jpx    yes       21  0   300   300  631K 2.5%
   1     1 image    2480  3508  rgb     3   8  image  yes       23  0   300   300 48.3K 0.2%
   1     2 mask     4960  7015  -       1   1  image  yes       23  0   600   600 48.3K 1.1%
Чтобы извлечь все изображение следует указать путь для сохранения, например текущий каталог:
pdfimage my_pdf_file.pdf .

Алсо

exiftoolgui - утилита для работы с Exif для Windows.
exiftool способна оперировать не только Exif данными, но и например метаданными в PDF файлах, помимо множества других.

Плагины для Firefox:
FxIF - показывает данные в отельном окне
Exify - отображает данные о камере и ISO поверх изображения при наведении курсора мыши.

StackOverflow: Exif manipulation library for python

Cсылки 

Программы:
Comparison of metadata editors (wiki)
exiv2
jhead  (Windows, Linux, OS-X)
ExifTool
Phatch  (multiplatform (GUI) )
GottenGeography

ExifTool – швейцарский нож фотометаданных
Алсо
Стеганография в Linux. Как спрятать информацию внутри изображения

суббота, 13 декабря 2014 г.

python notes

#!/usr/bin/env python

Справочная система

Получить справку по имени (ключевому слову, функции, пакету, ...):
pydoc3 <имя>  
Запустить веб-сервер на свободном порту и открыть заглавную страницу документации в браузере:
pydoc3 -b

*** ipython notebook

ipython - удобная оболочка для работы с интерпретатором. Имеет подсветку синтаксиса, автодополнение и множество других преимуществ перед Python shell. Работа в этой оболочке похожа на работу в математических пакетах (Mathematica, Maxima). [IPython: замена стандартного Python shell]
ipythone notebook - удобная среда для работы с ipython в браузере. Часто используется при научных и инженерных вычислениях, интегрируется с matplotlib, позволяя отображать графики в том же окне, после вызывающего блока. 

комманда запуска: ipython notebook
зайти из браузера на сервер: http://127.0.0.1:8888

включить интеграцию matplotlib:
%matplotlib inline
При необходимости установить размер и разрешение графиков
figure(figsize = (8,4), dpi=300)  # размеры в дюймах
 
# установить размер шрифтов на графиках
matplotlib.rcParams.update({'font.size': 16}) 
В ipython notebook картинка может сжиматься до очень маленького размера, если её фактические размеры слишком велики.

***

Использовать utf-8 символы в скрипте [so]:
# -*- coding: utf-8 -*-  

***

Версия интерпретатора [so]

import sys
>>> sys.version # строка содержащая информацию о версии
>>> sys.version_info # то же самое только в кортеже 
Запустить скрипт в интерактивном режиме
Выполнить скрипт, а после открыть консоль после завершения последней операции. Таким образом, можно пользоваться результатами выполнения скрипта.
python -i script.py

***

Передать код параметром интерпретатора

python -c "print('Hello World')"

Операторы можно разделять точкой с запятой.

Установить зависимости из requirements.txt

pip install -r requirements.txt
***
Установить пакет из скрипта. Скрипт должен быть запущен с правами суперпользователя.

import pip
pip.main(['install', 'python-registry'])  # установка пакета python-registry

Профилирование [wiki]

python -m cProfile -s test <script.py>

Модуль cProfile замеряет время выполнения функций и число вызовов. Данные выводятся в табличном виде.
 14417410 function calls (14416960 primitive calls) in 7.394 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
  1000000    3.511    0.000    5.614    0.000 my-script.py:31(my_favorite_foo)

ncalls - число вызовов;
tottome - общее время работы (без учёта вызовов подпрограмм?);
percall - tottome / ncalls;
cumtime - общее время работы;
percall - cumtime / ncalls.

Подробнее: Profiling python with cProfile

vprof - несколько более медленный профилировщик, который однако выдаёт более наглядный результат. Программа создаёт в том числе тепловую карту кода, кодируя цветом время выполнения отдельных фрагментов кода.
После завершения работы python программы будет запущен веб-сервер и показаны разельтаты измерения работы программы. Страница с информацией автоматически откроется в браузере.


Отладка

Встроенный режим отладки есть во многих IDE, включая PyCharm. Однако, можно не прибегая к сторонним средствам воспользоваться встроенным интерактивным консольным отладчиком pdb. Для этого достаточно подключить его как модуль при запуске скрипта:
python3 -m pdb <script>
Программа запустится на выполнение, которое будет приостановлено после первой же инструкции. Список основных команд отладчика можно получить напечатав h. Остальные команды также лаконичны (small cheatsheet):
l - показать окрестности текущей строки
n - step over, next - выполнить следующую строку
s - step into - то же самое, только с входом в функции
c - continue - выполнять до точки останова

b - показать точки останова
b 123 - установить точку останова в строке 123
cl - удалить все точки останова
cl 2 - удалить точку останова с номером 2.



Именованные кортежи (named tuples) [doc]
from collections import namedtuple
Body = namedtuple('Body', 'm v')
b = Body(5, 7)
E = b.m * b.v**2 / 2
E = b[0] * b[1]**2 / 2
m, v = b 

Отдельные поля менять не позволяется, вместо этого можно создать новый кортеж: 
p = Point(x=11, y=22) 
p2 = p._replace(x=33)


***
Инвертировать список [SO]:
>>> L = [0,10,20,40]
>>> L[::-1]
[40, 20, 10, 0]
 
 

***

Python String Format Cookbook

Печать списков

Красиво напечатать список состоящий их строк:
print(', '.join(['one', 'two', 'three'])) 
В результате:
one, two, three
Строка для который вызывается метод join является разделитем. После последнего элемента списка разделитель не ставится.
Часто этот способ нужен для того, чтобы отформатировать на печеати числа с плавающей точкой:
lst = [11.334000000000001, 17.058000000000003, 22.782000000000004, 28.506000000000004, 34.230000000000004]
print(', '.join(map(lambda x: "%2.3f"%x, lst)))
Вывод:
11.334, 17.058, 22.782, 28.506, 34.230
Итератор map  применяет к каждому элементу списка lst функцию, что передаётся первым параметром. В примере лямбда-функция в свою чоредь, превращает каждое число из списка lst в строку, которая и передаются уже методу join.

Генераторы списков.

Лаконичный и элегантный способ создать список:
numbers = [1,2,3,4,5]
squares = [number*number for number in numbers] 
Сложить элементы двух списков попарно:
T = [21.036, 31.357, 41.489, 51.442, 61.227]
S = [11.334, 17.058, 22.782, 28.506, 34.230]
ST = [s + t for s, t in zip(S, T)]


*** 
Скрипт запущен под рутом? 
if os.getuid()==0:
    print "user is root" else:  
    print "user is not root"
На счёт переносимости этого кода есть разные мнения, как и на счёт самих способов проверить обладает ли правами суперпользователя скрипт stackoverflow.

***
Проверить синтаксис скрипта без его выполнения [SO]:
python -m py_compile script.py

Параметры скрипта

Получить параметры с которыми скрипт был запущен:
if len(sys.argv):
    param1 = sys.argv[1]


getopt
Скрипт обрабатывает ключи -h, ключи требующие параметра (параметрические) -f и -t (во втором параметре конструктора getopt за этими параметрами следует двоеточие ":"); а также длинные параметрические ключи --file и --text:
import getopt

# объявление и чтение параметров (ключей) скрипта
try:
  opts,args = getopt.getopt(sys.argv[1:],"hf:t:",["file","text"])
except getopt.GetoptError:
  print('invalid params')
 
# обработка ключей opt и их параметров arg
for opt,arg in opts:
  if opt=='-h':
    print(HELP)
  elif opt in ("-f", "--ifile"):
    ifile=arg
    # ...
  elif opt in ("-t", "--text"):
    text=arg
    # ... 

См. также optparse

***

Работа с ini файлами (файлами конфигурации) [SO]
import configparser 
config = configparser.ConfigParser()
config.read('FILE.INI')
print(config['DEFAULT']['path'])  # -> "/path/name/"
config['DEFAULT']['path'] = '/var/shared/'  # update
config['DEFAULT']['default_message'] = 'Hey! help me!!' # create with open('FILE.INI', 'w') as configfile: # save
config.write(configfile)


Регулярные выражения [tutorialspoint]
import re
line = "Ave Satanas!"
reg = re.compile("Ave, [a-zA-Z]*!")
if reg.match(line):
print("match")


Прочитать пароль со стандартного ввода
import getpass
pw = getpass.getpass()

***
Хранить пароли можно в системном хранилище, используя для этого библиотеку keyring:
>>> import keyring  
>>> keyring.set_password("system", "username", "password")  
>>> keyring.get_password("system", "username") 
'password'
 

Вычислить md5 хэш
import hashlib
print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest())

Процессы и потоки

Из-за использования Global Interpreter Lock в реализации языка CPython потоки фактически вополняются только по одному за раз. Поэтому параллельные вычисления занимают примерно столько же времени сколько и такие же но последовательные.
Выиграть от использование потоком можно только при работе с операциями ввода\вывода, когда можно разделить, например ожидание ввода и одновременное исполнение какого-либо кода [SO].

import threading
from time import clock
from math import sqrt

def foo(x):
    for i in range(50000000): x = sqrt(i)*n
    print("I'm finished: %f"%clock())
    return
t1 = threading.Thread(target= foo, args=(7,))
# запуск кода на выполнение
t1.start()
# ожидание завершения потока
t1.join()



***
Запустить процесс и посмотреть, что из этого получится. Например, попробовать извлечь файлы из запароленого 7z архива:
import subprocess
filename ="qwerty.7z"
password = "qwerty"
s = subprocess.Popen(["7z", "e", "-p"%password, filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
r = s.communicate()[0]

Процессы [doc]

Работа с процессами похожа на работу с потоками:
import multiprocessing
 
def foo(x): 
    print(x) 
 
# создание процесса p = multiprocessing.Process(target = foo, args = (1, )) 
p.start() # запуск 
p.join() # ожидание завершения 
*** Пулы процессов [link]
...
*** Queue and Pipes
...
Параллельное программирование в Python при помощи multiprocessing и shared array

 
***
Запустить приложение, которое продолжит работу после завершения скрипта:
Popen(["application"], stdout=PIPE, stderr=PIPE, close_fds=True)

***
Читать без блокировок вывод (p.stdout.readline()) процесса [stackoverflow].

***
Завершить приложение:
p = Popen(["application"], stdout=PIPE, stderr=PIPE, close_fds=True)
p.kill()
p.wait()

***
Найти процесс по имени среди запущенных в системе:
import psutil
for proc in psutil.process_iter():
if proc.name == "application":
    print("application is running") 

Сеть и Интернет

Загрузить веб страницу
from urllib import request
resp = request.urlopen("http://google.com")
resp.readline()  # содержание страницы


Библиотека для работы с XMPP (jabber) - sleekxmpp

Лёгкий (один файл) веб-фреймворк Bottle,
Легкий python веб-фреймворк: Bottle
Для тестирования можно вместо стороннего сервера использовать сервер встроеный в bottle. Функция run() запускает сервер:
from bottle import route, run 
# функция сработает при запросе страницы hello
@route('/hello') 
def hello():
    return "Hello World!" 
 
run(host='localhost', port=80, debug=True)


По-умолчанию сервер работает на порту 8080. Для пользования 80-го порта могут потребоваться права суперпользователя.

***
Собрать данные с веб-страницы 

Открыть URL в браузре по-умолчанию
import webbrowser
webbrowser.open_new('https://google.com')

Автоматизация браузера

mechanize. тестирование сайтов, заполнение и отправка форм, скачивание файлов и т.п.

selenium


Офис

reportlab
 

Математика в python

***

Pandas

Представляет богатый функционал для обработки данных.
Чтение данных из CSV файла:
pdata = pd.read_csv('file.csv', delimiter=' ')
# Получим привычные списки значений по столбцам
data = pdata.values.transpose()
 
read_csv, в отличаи от аналогичных функции numpy, по-умолчанию способена считывать сложные типы данных, такие как время. Numpy же заменит все не числа так и сохранит: Nan. Однако конвертировать, например время, из строки (как сохранит его после прочтения из csv файла pandas) в специальный формат всё же придётся.
Введение в анализ данных с помощью Pandas
Getting Started with Pandas: Kaggle's Titanic Competition

Геолокация

По публичному IP.
Будем использовать локальную БД (эту):
import GeoIP
gi = GeoIP.open('/usr/share/GeoIP/GeoIPCity.dat', GeoIP.GEOIP_STANDARD)
geo = gi.record_by_addr('8.8.8.8')
Теперь geo содержит словарь:
{'area_code': 650,
 'city': 'Mountain View',
 'country_code': 'US',
 'country_code3': 'USA',
 'country_name': 'United States',
 'dma_code': 807,
 'latitude': 37.384498596191406,
 'longitude': -122.08809661865234,
 'metro_code': 807,
 'postal_code': '94040',
 'region': 'CA',
 'region_name': 'California',
 'time_zone': 'America/Los_Angeles'}

Алсо

LearnPython.org interactive Python tutorial

Ссылки

IPython: замена стандартного Python shell
IPython: Built-in magic commands

Python: советы, уловки, хаки [eng]
Scientific Python Tips and Tricks
Программирование и научные вычисления на языке Python
Параллельное программирование в Python при помощи multiprocessing и shared array
Working with Binary Data in Python, 2015

Книги
  • Лутц М. Изучаем Python, 4-е издание, 2011, 1280 с.; (вышло 5-е издание?). В книге приводится практически полное описание языка, от простого к сложному.
  • Лутц М. Программирование на Python, том I,II, 4-е издание, 2011. Дополнение к предыдущей книге, рассматриваются популярные пакеты, посвящена практике программирования на Python.
  • Gray Hat Python: Python Programming for Hackers and Reverse Engineers; Violent Python - A Cookbook for Hackers, Forensic Analysts, Penetration Testers and Security Engineers; Книга поясвящённая вопросам информационной безопасности, практически полностью состоит из примеров.
---
Подсветка синтаксиса highlight.hohli.com