Kolik trilobitu ma jeden trilobyte?
Linux hacks
Zde najdete par tipu, jak efektivne pouzivat Linux. Uvazte, ze tyto tipy jsou od cloveka, ktery ma pet 21" monitoru pripojenych k jednomu pocitaci, na nich zhruba 60-80 terminalu, firefox a nekolik xpdf. Zadne krychle, zadne pozadi (stejne neni videt), minimum klikacich programu ... tento navod se tyka prevazne terminalu.
synchronizace clipboardu mezi vice Xky
Fluxbox
Fluxbox je lightweight windowmanager, ktery beha i na pentiu 120 se 16MB RAM. Da se v nem nastavit pozadi (nejakym programem - asi sluzba xserveru), ma extra menu na leve, prostredni a prave tlacitko (coz nepouzivam), nema problemy s klavesovymi zkratkami a hlavne ma taby. Co je takovy tab? Predstavte si okno - treba xterm. Ma nejake dekorace (treba zadne) po stranach a dole a nahore ma listu s titulkem a tlacitky na minimalizaci, maximalizaci, zavreni a existenci na vsech plochach. Ted si otevrete druhe takove okno - treba xpdf. Jedno z nich chytnete mysi za listu prostrednim tlacitkem, odtahnete ho kamkoliv nad to druhe a pustte. Nahle mate jedno okno s jednou listou, ctyrmi tlacitky ... a cast s titulkem je rozdelena na pulky a v kazde je jeden z titulku. Pocet oken je asi neomezeny (nenarazil jsem na limity), akorat s rostoucim poctem se zmensuje viditelna cast titulku okna.
Prepinani jde nastavit na kliknuti mysi, nebo na najeti mysi (me oblibene, avsak pro neznale dost matouci - take pri tom jde porovnavat obsah dvou terminalu jako blinkmikroskopem - staci je dat vedle sebe a prejizdet mysi pres rozhranni na liste), pripadne klavesnici tab vlevo a tab vpravo a v novem fluxboxu (verse 1.1.1) i primym skokem na dany tab (podle cisla). Ovladani na najeti mysi je extremne rychle a ve spojeni s focusem okna na najeti mysi velice pohodlne.
Klavesove zkratky jdou definovat skoro na cokoliv, asi nejdulezitejsi je neco na pusteni xtermu - treba wokno+x.
cat .fluxbox/keys
...
# skok na konkretni tab - wokno a cislo
Mod4 1 :Tab 1
Mod4 2 :Tab 2
...
#otevrit terminal
Mod4 x :Exec xterm
...
#prepinani virutalnich ploch - alt a F1,F2,...
Mod1 F1 :Workspace 1
Mod1 F2 :Workspace 2
...
Fluxbox toho umi jeste vic, ale to nepouzivam, takze to nemuzu povazovat za duvod, proc je efektivni pouzivat fluxbox.
screen
Screen je prehistoricky UNIXovy program, ktery zvlada neuveritelne veci. Jeho hlavnim smyslem je umoznit mit na jednom terminalu vice virtualnich terminalu. Jednou jeho velmi pohodlnych vlastnosti je automaticky detach pri padu spojeni (hodi se na GPRS :-)). Staci nove ssh, screen -r a jsme presne tam, kde jsme skoncili.
V zakladnim nastaveni clovek nepozna, zda je ve screenu, nebo ne a navic ma zabranou klavesovou zkratku ctrl-a (skok na zacatek radky - lze ocenit zvlaste na notebooku, kde je home Fn+leva sipka a Fn je tak daleko, aby nesel zmacknout jednou rukou spolecne s sipkou a v te druhe ruce je zrovna caj ...). Terminaly se prepinaji Ctrl-a 0 az Ctrl-a 9 a dal uz to primo nejde (jen pres menu), novy se vytvari Ctrl-a c (jako create), zabiji Ctrl-a k (kill) a do posledne navstiveneho se lze vratit Ctrl-a Ctrl-a. Umyslny detach vyvolame Ctrl-a d a help je Ctrl-a ?.
Prvni, co jsem udelal bylo premapovani Ctrl-a na F1. Proc zrovna F1? Jednak funkcni klavesy vubec nepouzivam. Na nekolik z nich jsem si namapoval nejaka makra ve vimu, ale ani ta moc nepouzivam. V mc lze pouzit i esc-cislo a pro prepinani pracovnich ploch se pouziva nekolidujici Alt-F*. Druhak mi nestaci primy pristup na prvnich 10 terminalu, takze je logicke pokracovat dalsimi funkcnimi klavesami. F1-0 az F1-9, F2-0 az F2-9, F3-0 ...
cat ~/.screenrc
#F1 jako command key - zde se jmenuje k1
bindkey -k k1 command
escape ^~~
#hardstatusline - vidime jake mame terminaly (alespon prvnich par, ktere se vejdou na jeden radek) a kde jsme.
hardstatus alwayslastline
hardstatus string "%{= wk} %-w%{= bW} %n %t %{= wk}%+w %="
#vytvori sel2 na klavese F2
bindkey -k k2 command -c sel2
#vyselectuje 14. okno na F2-3 - ostatnich 10 az 80 (dle libosti) prikazu vygenerujeme analogicky treba smyckou for
bind -c sel2 3 select 14
Tim nam zbyva posledni problem tohoto reseni - podle delky titulku okna a velikoti terminalu jsou videt titulky zhruba prvnich 10-14ti oken a dal uz nic. Vyuzijme dalsi vlastnosti screenu - umi vice prihlaseni k jedne session:
screen -x
Otevreme si (treba na vedlejsim monitoru) svisly xterm (asi tak 10-20 sloupcu a potrebny pocet radek), v nem screen -x a F1-", coz zobrazi menu. Menu se updatuje okamzite, takze mame predstavu o tom, kde je co.
Titulek do screenu propasujeme escape sekvenci:
echo -ne "\033k$1\033\\"
kterou se vyplati umistit do promptu tak, aby byl videt pracovni adresar (pokud mozno ne cela cesta - to je pak neprehledne).
S
S je muj skript na ssh. Nebavi me neustale vypisovat username, nebo se starat o to ve ktere jsem siti a jak se dostanu na kterou masinu. Navic sam nastavi titulek xtermu, nebo screenu. Nema konfiguracni soubor, ani nic takoveho, rekonfiguruje se zmenou skriptu ... a zatim neni dopsany.
Jeho smyslem je usetrit par klaves. Treba misto rucniho nastavovani titulku screenu/xtermu a psani 'ssh -X root@anothername.site.tld' staci 'S \#machine1'. Lenost je mocna carodejka.
cat ~/bin/S
#!/bin/bash
if echo "$1" | grep '@' > /dev/null; then
SSH_USER="$( echo "$1" | sed 's/\(@\).*/\1/' )"
SSH_MACHINE="$( echo "$1" | sed 's/.*@//' )"
else
if echo "$1" | grep '^#' > /dev/null; then
SSH_USER="root@"
SSH_MACHINE="$( echo "$1" | sed 's/^#//' )"
elif echo "$1" | grep '^1' > /dev/null; then
SSH_USER="user1@"
SSH_MACHINE="$( echo "$1" | sed 's/^1//' )"
elif echo "$1" | grep '^2' > /dev/null; then
SSH_USER="user2@"
SSH_MACHINE="$( echo "$1" | sed 's/^2//' )"
else
SSH_USER=""
SSH_MACHINE="$1"
fi
fi
# some machines can't be reached from outside simply, or must be reached by differrent ways
# from differrent places
DEFAULT_IFACE="$(/sbin/route -n | grep '^0.0.0.0' | sed 's/.* \([^ ]*\) *$/\1/')"
echo "Default route is going to: $DEFAULT_IFACE interface."
IP="$(/sbin/ifconfig "$DEFAULT_IFACE"|grep 'inet addr:'|sed 's/.*inet addr:\([0-9.]*\).*/\1/')"
if [ "$DEFAULT_IFACE" = 'ppp0' ]; then
OUTSIDE=1
fi
if [ "$DEFAULT_IFACE" = 'eth0' ]; then
if echo "$IP"|grep '192.168.1.' >/dev/null; then
NET1=1
elif echo "$IP"|grep '10.0.0.' >/dev/null; then
NET2=1
elif echo "$IP"|grep '192.168.2.' >/dev/null; then
NET3=1
else
OUTSIDE=1
fi
fi
if [ "$SSH_MACHINE" = 'machine1' ]; then
if [ "$OUTSIDE" = '1' ]; then
SSH_MACHINE='anothername.site.tld'
fi
if [ "$NET3" = '1' ]; then
SSH_MACHINE='anothername.site.tld'
fi
fi
if [ "$SSH_MACHINE" = 'anothername.site.tld' ]; then
if [ "$NET1" = '1' ]; then
SSH_MACHINE='machine1'
fi
fi
# what should be on screen or xterm descr
if echo "$SSH_USER" | grep '^root@' > /dev/null; then
TITLE_USER="#"
elif echo "$SSH_USER" | grep '^user1@' > /dev/null; then
TITLE_USER="1"
elif echo "$SSH_USER" | grep '^user2@' > /dev/null; then
TITLE_USER="2"
else
TITLE_USER="$SSH_USER"
fi
if [ "$TERM" = 'screen' ]; then
echo -ne "\033k$TITLE_USER$SSH_MACHINE\033\\"
elif [ "$TERM" = 'xterm' ]; then
echo -ne "\033]0;$TITLE_USER$SSH_MACHINE\007"
else
echo "SSH: $TITLE_USER$SSH_MACHINE"
fi
echo "user:$SSH_USER, machine:$SSH_MACHINE, iface:$DEFAULT_IFACE, ip:$IP, title:$TITLE_USER"
ssh -X "$SSH_USER$SSH_MACHINE"
Pokracovani bude, az budu mit cas ho napsat :-).