Table of Contents
Käsud
Swagger doc generation
How to generate static (HTML) documentation from a JSON/YAML Swagger file?
- Go to: http://editor.swagger.io
- Choose from top left menu: File → Import file
- Import your JSON/YAML description file
- Choose from top menu: Generate Client → html2 (“html2” looks a lot nicer and is more functional than “html”)
- You will be prompted with a zip file download which includes that static content (including an index.html file that has all the data)
GPG / PGP / GnuPG
# get my own public key gpg –list-keys gpg –armor –export rene@ridango.com
# crypt gpg -c myfile-to-crypt.txt
# decrypt gpg file-to-decrypt.gpg
Set IP manually
Version 1
ifconfig eth0 10.10.10.55 route default gw 10.10.10.1
Version 2
sudo vi /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
# The primary network interface
auto enp0s25
iface enp0s25 inet static
address 192.168.3.60
netmask 255.255.255.0
gateway 192.168.3.1
dns-nameservers 10.0.0.1 8.8.8.8
sudo systemctl restart networking.service
Set command to run in background
Detailed info about different options: http://unix.stackexchange.com/a/148698
# program is run indipendent of the terminal (terminal can be closed). All output is sent to nohup.out file: cd /tmp; nohup google-chrome &
MQTT
# subscribing to MQTT broker
mosquitto_sub -h 192.168.3.1 -t /vimi/system/identity/info
Git
// create new branch git checkout -b my-new-branch-name // update some files and code... // .... // stage the changes git add file-name-that-I-changed.php // commit the changes git commit -m "Message about my change" // push up the changes git push origin my-new-branch-name // go and create a pull request in Bitbucket
Convert Mercurial/Hg repo into Git and Bitbucket
cd /tmp git clone https://github.com/frej/fast-export.git mkdir xdream cd xdream git init /tmp/fast-export/hg-fast-export.sh -r /media/ssd/www/xdream.rene.ee git checkout HEAD mv .hgignore .gitignore git add .gitignore git rm .hgignore git commit -m "Migrate .hgignore to .gitignore" git remote add origin https://renebe@bitbucket.org/renebe/xdream.git git push -f --all origin
Wireshark
| Filter | Meaning |
|---|---|
| && | AND condition |
|| | OR condition |
| x == y | comparison (note the spaces before and after “ == ”) |
| tcp | TCP traffic only |
| http | HTTP requests only |
| ip.addr == 192.x.x.x | Traffic TO and FROM specific IP |
| ip.src == 192.x.x.x | Traffic FROM specific IP/source |
| ip.dst == 192.x.x.x | Traffic TO specific IP/source |
| tcp.srcport == 80 | TCP traffic FROM a specific port (UDP → udp.srcport) |
| tcp.dstport == 80 | TCP traffic TO a specific port (UDP → udp.dstport) |
| http.request.uri contains “/test/“ | Find HTTP requests that include given part |
Screen
| Command | Action |
|---|---|
| screen | Käivitab screeni |
| screen -r | Attatcheb screeni (kui ainult 1) |
| screen -d -r | Attatcheb screeni ja vajadusel deatacheb selle enne |
| screen -r [PID] | Attatcheb vastava PID-ga screeni |
| screen -list | Näitab kõiki screene |
C-a = CTRL+a
| Command | Action |
|---|---|
| C-a c | Teeb screeni all uue shelli (akna) |
| C-a d | Deattacheb screeni |
| C-a A | Screeni akna ümbernimetamine |
| C-a “ | Näitab kõiki screeni alla avatud aknaid |
| C-a ' | Võimaldab akna nime järgi sellele minna |
| C-a C-a | Avab eelmisena avatud olnud akna |
| C-a 0 | Avab akna numbriga 0 (võib olla 0-9) |
| C-a space | Avab järgmise akna (numbri järgi) |
| C-a backspace | Avab eelmise akna (numbri järgi) |
| C-a Esc | Läheb scrollimise mode-i (PgUP/PgDown). Välja saab 2xEnter |
grep | tail
# turn off grep buffering (as it tampers with “tail -f”)
tail -f access.log | grep --line-buffered "find something"
Faili crypt/decrypt
Decrypt:
openssl bf -d -in /home/rene/user.tar > user2.tar
Crypt:
openssl enc -bf -e -in user2.tar -out user.tar
Charseti convertimine
iconv -f ISO-8859-1 -t UTF-8 from.file > to.file
rpm -> deb
sudo alien --to-deb pack.rpm sudo dpkg -i pack.deb
Pakkimine
Extract
tar -xvvzf faile.tar.gz gunzip -d file.gz unzip file.zip unrar file.rar
Piltide vähendamine
mogrify -resize 800x800 IMG_*.jpg
# crop image into 180×135 size from the center
convert in.jpg -resize 180x135^ -gravity Center -extent 180x135 out.jpg
Pildil valge taust läbipaistvaks
# ainult puhas valge läbipaistvaks:
convert /tmp/switch_ubi2.jpg -transparent white /tmp/switch_ubi2_transp.jpg
# lisada ka tolerantsi hallidele toonidele (mida suurem protsent seda suurem) tolerants
convert /tmp/switch_ubi2.png -fuzz 5% -transparent white /tmp/switch_ubi2_transp.png
Pildi EXIF data muutmine
# remove all EXIF data from a file
exiftool -all= my_file.jpg
# Change the date in EXIF. NB! Note the colons instead of dashes in the date!!!
exiftool -AllDates="2023:04:22 12:51:10" my_file.jpg
Watermark teksti lisamine pildile
# Võtab kõik aktiivse kausta *.jpg nimega pildid ning lisab neile watermarkiks pildi nime (ilma laiendita) ja salvestab uued koopia pildid tase madalamsse “watermarked” nimelisse kausta
for pic in *.jpg; do convert $pic -pointsize 80 -draw "gravity south fill red text 1,11 '${pic%.*}' " ../watermarked/$pic; done
PDF to PNG
# kogu dokument lehtede kaupa piltideks
convert -density 150 input.pdf output.png
# üks konkreetne leht (18 näiteks) pildiks
convert -density 150 input.pdf[18] output.png
Video suuruse vähendamine
Vähendab video suurust 2 korda:
ffmpeg -i input.mp4 -strict -2 -vf scale=iw/2:-1 output.mp4
Video keeramine:
ffmpeg -i in.mov -vf "transpose=1" out.mov
Transpose'i parameetrid: 0 = 90CounterCLockwise and Vertical Flip (default) 1 = 90Clockwise 2 = 90CounterClockwise 3 = 90Clockwise and Vertical Flip
VIM
| Käsk | Seletus |
|---|---|
| :set encoding=utf-8 | Encoding → UTF-8 |
| :set syntax=html | highlighting-u muutmine |
| mx | rea ära märkimine, et pärast samale reale tagasi saada (x on suvaline täht) |
| 'x | viib x-ga märgitud reale tagasi |
| :marks | näitab kõigi märgitud ridade listi |
| * | leaib järmise sama sõna, mille peal hetkel kursor on |
Reavahetuste (^M) replacemine (^M tuleb teha kasutades Ctrl-V + <enter>):
:%s/^M$//g :%s/^M/ /g :%s/\n/;/g :%s/, \n/;/g <--- if you want to replace string AND line break don't forget that there usually is 1 spce inbetween tehm....
color scheme Solarized
wget http://public.rene.ee/solarized.vim -O /tmp/solarized.vim mkdir ~/.vim/colors mv /tmp/solarized.vim ~/.vim/colors vi ~/.vimrc
.vimrc
Etalon sisu ~/.vimrc
syntax enable set background=dark colorscheme solarized set encoding=utf-8 set tabstop=4 set shiftwidth=1 set nocindent set softtabstop=4 set expandtab set noerrorbells set vb set nowrap set ruler set term=xterm set viminfo='100,\"100,:20,%,n~/.viminfo set backspace=indent,eol,start au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
- peab meeles, kus kursor viimati failis oli
set ruler
set viminfo='100,\"100,:20,%,n~/.viminfo
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
- Kui backspace ei tööta:
set bs=2
Command line
grep
# grep with OR statment (NB! mind the escape char!!!) grep 'this\|that' kala.txt
# starts with 2 spaces and then an alphanumeric char grep '^ [A-Za-z]' kala.txt
awk, sort, uniq
Prindib välja leitud reast 6-nda elemendi. Read on sordidutd ning korduvaid ridu ei esine:
grep mingiasi mingifail.txt | awk '{ print $6 }' | sort | uniq
# splitib kõigepealt koolonite järgi tükkideks ja siis võtab tunni ja minuti välja. Ehk siis: [29/May/2020:03:07:01 +0300] → 03:07 # seejärel sordib ja leiab, mitu rida iga minuti kohta oli
grep "2020:03:1" /var/log/nginx/api-rid.kyivcity.gov.ua.access.log | grep Zabbix | awk 'BEGIN { FS = ":" } ; { print $2":"$3 }' | sort | uniq -c^C
Hardcode awk & print:
zgrep -E "/programme/[0-9]+/info" publicapi-2014-11-11-22.log.gz | grep -v "upstream timed out" | grep 'nginx' | awk '{ print $18 }' | awk '{ s += $1 } END { print "sum: ", s, " average: ", s/NR, " samples: ", NR }'
sum: 55454.8 average: 2.13781 samples: 25940
split
// split by any keyword without caring about the space spliting... in this example we just change the awk spilt deilimieter from default " " to "my phrase"
awk 'BEGIN { FS = "my phrase" } ; { print $2 }'
// split by a keyword, but still take only the $14 part of line....
zgrep -E "/programme/[0-9]+/info" publicapi-2014-11-11-22.log.gz | awk '{ split($14,a,"?"); print a[1] }' | sort | uniq | wc -l
for loop
# loop over numbers:
for i in {10..16}; do echo "failist $i: "; zgrep 'kalamaja ' live/publicapi-2014-02-$i-2* | wc -l; done
for i in {0000..0015}; do echo "Counting sample inside text: aaa${i}bbb"; done
# loop reading lines from a file:
for i in `cat lines.txt`; do echo "Line contents is: $i"; done
while, time, counter
wget files incrementally and print out only timinig info.
while [ 1 ]; do (time wget -O /dev/null http://www.rene.ee/file:${COUNTER}.txt) 2>&1|grep real; let COUNTER=COUNTER+1; sleep 1; done
Find & replace
#!/bin/bash if [ "$#" != "1" ]; then echo "kasutamine: cvs.sh <username>" exit 0 fi for i in `find /var/www/ipdb -name "Root"`; do sed -i s/^:pserver:.*@/:pserver:$1@/ $i; done echo "tehtud!"
Symbolic link
ln -s /target/dir /shortcut/dir
CVS
sudo -s / su export CVS_RSH=ssh export CVSROOT=rene@bsd.ee:/usr/local/robobsd
cvs co robobsd
WebWare
echo $CVSROOT export CVSROOT=:ext:rene@cvs.webware.ee:/var/lib/cvs | export CVSROOT=:ext:webdk@cvs.webware.ee:/var/lib/cvs
Digikaamera ühendamine
cat /proc/bus/usb/devices T: Bus=02 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 5 Spd=12 MxCh= 0 D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=32 #Cfgs= 1 P: Vendor=04a9 ProdID=3074 Rev= 0.01 S: Manufacturer=Canon Inc. S: Product=Canon Digital Camera chmod a+w /proc/bus/usb/002/005 // Bus/Dev gtkam
Kasutajate lisamine
useradd biker vi /etc/passwd vi /etc/group
Vahel võib olla ka
adduser kala
video striimi dumpimine
mplayer -dumpstream http://213.35.156.10/etv/23042005_saalihoki.wmv
Postgres
/etc/init.d/postgresql stop /etc/init.d/postgresql start
conf
Ligipääsu õigused:
/etc/postgresql/pg_hba.conf
# TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD # Database administrative login by UNIX sockets local all postgres trust local all webdk_dhs trust local all webdk trust local all ems_odbc trust # # All other connections by UNIX sockets local all all ident sameuser # # All IPv4 connections from localhost host all all 172.16.2.199 255.255.255.255 md5 host all all 10.1.21.58 255.255.255.255 md5 host all all 127.0.0.1 255.255.255.255 md5
Replace astring in multiple files (i.e. CVS)
replace "/usr/local/cvs" ":ext:rene@webware.ee:/usr/local/cvs" -- `find . -name "Root" -type f`
.bashrc
vi ~/.bashrc
alias ll='ls --color=auto -l' alias l='ls --color=auto -la' alias vi="vim"
SSH läbi mitme masina
~/.ssh/config faili lisada:
Host *%*
ProxyCommand ssh $(echo %h | awk -F%% '{OFS="%%"; NF--; print $0}') nc $(echo %h | awk -F%% '{print $NF}') %p
Edaspidi saab ühe käsuga läbi mitme masina ssh'd teha nii:
ssh esimene.masin.ee%teine.masin.ee ssh viimase_masina_kasutaja@esimene.masin.ee%teine.masin.ee ssh viimase_masina_kasutaja@esimene.masin.ee%teine.masin.ee%kolmas.masin.ee
SCP läbi mitme masina
Oma masinast ssh tunnel käima:
ssh -A -N -L 1234:destination.server.ee:22 -l gate_username gate.server.ee ssh -A -N -L 1234:sqldump.dtv.elion.ee:22 -l rene ybershell.estpak.ee
SCP üle tunneli:
scp -P 1234 destination_user@127.0.0.1:/dest/dir/files.txt .
psql
# save select result as CSV (run it in psql command line and don't forget the \)
\copy (select * from device) to /tmp/result.csv with delimiter ',' null as '' csv header;
psql postgres user access
# shows a list of all the tables and views with info which group has which access to it
\dp \dp ticket*
# nice list of all users and to what groups do they belong to
SELECT r.rolname, r.rolsuper, r.rolinherit,
r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
r.rolconnlimit, r.rolvaliduntil,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
# similar as above, but with less info
\du
# bulk granting of privileges to a single user or a group (it's the same thing in Postgres)
GRANT SELECT ON ALL TABLES IN SCHEMA sync TO readonlydev; GRANT SELECT, UPDATE, DELETE, INSERT ON ALL TABLES IN SCHEMA sync TO dev; GRANT SELECT, UPDATE ON ALL SEQUENCES IN SCHEMA sync TO dev;
ybershell.estpak.ee
Igasugune ssh ligipääs käib Elionis tänapäeval ybershell.estpak.ee kaudu. Selleks, et seda võimalikult mugav kasutada oleks kogume siia alla häid näpunäiteid.
alias
Nii nagu igas masinas on ka yberis mõistlik kasutada alias'i, et kiirelt ja lihtsalt jõuda sealt edasi kuhu vaja. Selleks, et aliased toimiks tuleb need kirjutada kodukataloogi .bashrc faili (vim ~/.bashrc). List aliastest, mida näiteks nutiTV inimesed võivad kasutada:
alias devel='ssh rene@194.126.108.195' alias dtv_controller='ssh erki@194.126.108.216' alias dtvapi1='ssh dtvmw@194.126.108.210' alias dtvdevelapi='ssh dtvmw@develapi.mw.elion.ee' alias logger='ssh 88.196.0.29' alias stbmng='ssh stbmng.dtv.elion.ee' alias web1='ssh dtvmw@194.126.108.221' alias web2='ssh dtvmw@194.126.108.222' alias web4='ssh dtvmw@194.126.108.194' alias web5='ssh dtvmw@194.126.108.205' alias web6='ssh dtvmw@194.126.108.208' alias web7='ssh dtvmw@194.126.108.211' alias web8='ssh dtvmw@194.126.108.212' alias web9='ssh dtvmw@194.126.108.213'
Kui lisad uue aliase, siis pead selle rakendumiseks tegema (source ~/.bashrc) või yberist korra välja logima.
ilma paroolita (ssh-key'ga) sisselogimine
Väga mõistlik on korra kätte võtta ja oma ssh public key sihtkoha masinatesse panna, et edasipdi alati kiirelt ilma parooli trükkimata neisse sisse saada.
Selleks pead kõigepealt oma masinas endale võtmepaari genereerima (kasuta tühja passphrase'i):
ssh-keygen -t rsa -b 2048
Nüüd võta enda masina kodukataloogist enda avalik võti:
vim ~/.ssh/id_rsa.pub
… ja kleebi see nendesse masinatesse kuhu ilma parooli tagumata (ssh võtmega) soovid edaspidi sisse saada .Paljudes masinates on authorized_keys fail juba olemas, siis pane enda võti sinna viimasele reale juurde. Kui faili pole, siis tee see. Vaata, et su võtmes kopeerimise tulemusel reavahetusi sees ei oleks:
vim ~/.ssh/authorized_keys
Eimesena pead oma avaliku võtme yberisse panema. Ja edasi siis kõgisse järgmistesse. NB! Alati pead kasutama enda masinas genereeritud avalikku võtit. yberis uusi võtmeid genereerida ei tohi!
Kui pärast avaliku võtme lisamist mõnda masinasse sinna sisse logimisel ikka passi küsitakse, siis tee seal:
chmod u+x ~/.ssh
Selleks, et sama võtmega ka yberist edasi saaks liikuda pead kõigepealt enda masinas käivitama ssh-agent'i (vt. all olevat peatükki) ning yberisse logides alati kasutama ssh võtit -A (ssh -A ybershell.estpak.ee).
screen
Iga normaalne inimene kasutab yberis screen'i ;)
Kuigi screen'i mõte ongi koguaeg valmis ja ootel olla, siis esmakordsel kasutamisel tuleb ta luua ning kui yberile buuti tehakse, siis paraku tuleb ta ka uuesti luua. Seega elu lihtsustamiseks on üsna mõistlik luua screeni conf, mis käivitamisel juba sinu eest õigete nimedega õiged aknad lahti võtab. Ning kui oled ssh-key'ga autentimise kõikjal käima ajanud (vt. eelmist punkti), siis võtab ta kohe ka ssh'd kõigisse vajalikesse kohtadesse üles.
Selle saavutamiseks võta yberis lahti enda screeni confi fail:
vim ~/.screenrc
ning koosta endale sobiv conf selle näite alusel (screen -t ”<akna nimi>” <akna number> <käsk, mis aknas käivitada>):
screen -t "SQL new MW (web4)" 1 ssh dtvmw@194.126.108.194 screen -t "SQL VOD" 2 ssh dtvmw@194.126.108.210 screen -t "SQL devel MW" 3 ssh 194.126.108.195 screen -t "SQL dhcp" 4 ssh dtvmw@194.126.108.210 screen -t "logger" 5 ssh 88.196.0.29 screen -t "stbmng" 6 ssh stbmng.dtv.elion.ee screen -t "MW API" 7 ssh dtvmw@194.126.108.210 screen -t "devel MW API" 8 ssh dtvmw@develapi.mw.elion.ee screen -t "web1" 9 ssh dtvmw@194.126.108.221 screen -t "web2" 10 ssh dtvmw@194.126.108.222 screen -t "yber" 11
Enne kui seda screen'i looma hakkad vaata üle:
- kas sul aliased on ilusti paigas (muid pead lisamisel pärast eraldi igas screeni aknas need aktiveerima)
- kas oled oma ssh avalikud võtmed kõigisse soovitud masinattes kopeerinud
- kas sul enda masinas ssh-agent käib ning oled yberisse loginud -A võtmega. Selleks käivita yberis käsk:
ssh-add -L
Kui kõik eelnev korras ja nüüd lihtsalt screen käsuga screeni käivitad, siis tehakse sulle kohe 11 aknaga screen, kus on ilusti olemas juba mõistlike nimedega ja sisse logitud ssh sessioonid vajalikesse kohtadesse.
Edaspidi kui soovid seda screeni yberis külge võtta, siis nagu ikka teed lihtsalt screen -rd
SSH Agent
Näide ssh-agendi kasutamisest. Kõigepealt pead enda masinas ssh-agendi tööle panema:
spirit@kriszi-l:~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-HDwqLP9643/agent.9643; export SSH_AUTH_SOCK; SSH_AGENT_PID=9644; export SSH_AGENT_PID; echo Agent pid 9644;
spirit@kriszi-l:~$ ssh-add
Enter passphrase for /home/spirit/.ssh/id_rsa: Identity added: /home/spirit/.ssh/id_rsa (/home/spirit/.ssh/id_rsa)
ssh'ga yberisse logimisel peab alati -A v6ti kaasas olema, et agendi conf kaasa liiguks
spirit@kriszi-l:~$ ssh -A ybershell.estpak.ee
nüüd logi ssh'ga ybershelli sisse ja kontrolli alljärgneva käsuga, kas sinu key on kaasas:
spirit@uus-ybershell:~$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9Jl3aQObLLzuu3oSMbzZUt+u9/8jEE2tIXFJ73+mWJxmJrECm/1qQKLn9gOLzj13CwA5SBIJrF9ugkrMCyTQAlrXrdd9uOmV0xN6y7xH2/6QJprjcPwCvVkyY3oc1OIrpMQeWcRXGBQMghrtZmt0Z/8wr0VzRTN5z+m51L2iWo59w9i4XZRmlIptoirWT2Gbyhi7DPPG9yMJKpyigMWvAiQyBZ4hL6UUdjwBu4TC+wXo0zRB6c0gaPm+E+LKnyuEB/908E4iOEV7RPXp9ZdqgF8qidUYKz6forT3PKwX59SIjOQdeMdsiMC6UgK/D4o+w077oXHX3aS/En7uIpg0zQ== /home/spirit/.ssh/id_rsa
XMLRPC client (python)
Run python in shell and type:
import xmlrpclib
server=xmlrpclib.Server('<server>')
print server.device.getInfo('serial', 'M91206FGE46')
Wiki upgrade
# create backup
cd /var/www/wiki/ tar zcpfv /home/rene/dokuwiki-backup.tar.gz /var/www/wiki
# download latest version
https://download.dokuwiki.org/ cd /tmp wget https://download.dokuwiki.org/out/dokuwiki-c67aac87d.......
# install it
tar zxvf /tmp/dokuwiki-xxxx-xx-xx.tgz 'cp' -af /tmp/dokuwiki/* /var/www/wiki/
# set right permissions
sudo find /var/www/wiki/data -type d -exec chmod 770 {} +
sudo find /var/www/wiki/data -type f -exec chmod 660 {} +
