воскресенье, 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

Сылки