Blog o programování

Vítejte na mém blogu. Tento blog řeší některé scripty v PHP nebo nastavení linuxových serverů. Vše co jsem musel řešit v určitých chvílích a těžko hledal na netu. Pokud jsem našel řešení, je zde na tomto blogu popsané, abych pomohl dalším, kteří budou řešit obdobné problémy.

W4 Design Rss

PHP - odečítání a přičítání času 2

Posted by admin | Posted in Programování | Posted on 30-06-2010

V tomto článku si ukážeme jak odečítat časy.
Pokut například potřebujeme zjistit kolik dnů zbývá do konce měsíce, nebo kolik dní již uplynulo od začátku do dnes.

Datum můžeme buď zadat přímo, nebo si ho vygenerujeme příkazem date.
Tento příklad nám ukáže, kolik dnu uplynulo od 1.6.2010

$cas1="2010-06-01";
$ted=date("Y-m-d");
$dnu=round((strtotime($cas2) - strtotime($ted)) / (60 * 60 * 24))*-1;

Debian - Změna času a časového pásma

Posted by admin | Posted in Linux | Posted on 12-01-2010

Aktuální čas na serveru je jednou z nejdůležitějších věcí.

Na serveru máme:
- systémový čas
- HW čas
- časové pásmo

Časové pásmo se nastavuje při instalaci ale pokud se již dostanete k serveru který je už nainstalován, nastavete nejprve časové pásmo

ln -sf /usr/share/zoneinfo/Europe/Prague /etc/localtime

Pak si nastavete systémový čas:

date -s '2010-01-12 16:35:33'

a na závěr nastavte hw čas

hwclock -w

uvedený příkaz nastaví HW čas podle systémováho.

Debian - nmap

Posted by admin | Posted in Linux | Posted on 28-08-2009

Instalace:
apt-get install nmap

výpis portů na kterých naslouchají démoni
nmap –IP-adresa

Debian - SSH vzdálená správa počítače

Posted by admin | Posted in Linux | Posted on 28-08-2009

SSH se používá na vzdálenou správu počítačů (něco jako telnet) šifrovaným přenosem. Nechá se jeho pomocí i šifrovaně kopírovat soubory, přesměrovat komunikaci přes šifrovaný kanál a vzdáleně spouštět příkazy. Skládá se z serverové a klientské části.

Chování serveru řídí soubor /etc/ssh/ssh_config

Port 22 port, na kterém poslouchá ssh
Protocol 2 protokol, jaký je použitý (ssh1 nebo ssh2), oba protokoly-Protocol 2,1
AddressFamily any jaká rodina adres může využívat SSH (any-všechny, inet-IPv4, inet6-IPv6)
ListenAddress 0.0.0.0 na jaké sítovce bude naslouchat (zadáme její IP)
ListenAddress :: je možno definovat více sítovek
AllowGroups Povolené skupiny, kteří se mohou přihlašovat. Skupiny se oddělují čárkou pořadí při uvedení kombinace povolovacích/zakazovacích direktiv je DenyUsers, AllowUsers, DenyGroups, nakonec AllowGroups.
AllowUsers povolení uživatelé, oddělují se čárkou(SSH2), nebo mezerou(SSH1). Fungují zde žolíkové znaky. Můžeme použít kombinaci uživatel@umístnění (jarda@192.168.0.1, nebo jarda@192.168.0.*, nebo *@192.168.0.*)
DenyUsers platí stejná pravidla jako pro AllowGroups
DenyGroups platí stejná pravidla jako pro DenyGroups
AllowTcpForwarding yes povoluje směrování portů TCP
AuthorizedKeysFile .ssh/authorized_keys adresář , kde se hledají klíče
Banner nejaka/cesta defaultně vypnuto. Cesta uvedená k souboru tento zobrazí před autentizací
ChallengeResponseAuthentication yes specifikuje jaká sutentizace je povolena. Ve freebsd to zajištuje PAM. Volby, které toto chování mohou ovlivnit jsou PasswordAuthentication a PermitRootLogin
Ciphers specifikuje jaké šifrování je povoleno pro SSH2. Jednotlivá šifrování se oddělují čárkou
ClientAliveInterval číslo nastavení počtu sekund, než bude poslána zpráva při nečinnosti
ClientAliveCountMax číslo nastavení maximálního počtu zpráv při nečinnosti
Compression delayed určuje , jaká komprese bude použita- volby jsou yes, delayed, no
ForceCommand příkaz spustí zadaný příkaz, bude ignorovatjakýkoliv příkaz od klienta
HostKey určuje cestu k adresáři obsahujícím privátní klíče. Default je /etc/ssh/ssh_host_key pro SSH1, a /etc/ssh/ssh_host_dsa_key pro SSH2
IgnoreRhosts yes ignoruje soubory ~/.rhosts a /etc/hosts.equiv (vtahuje se i na ~/.shosts a /etc/shosts.equiv)
IgnoreUserKnownHosts no ignoruje se databáze známích hostitelů
KeyRegenerationInterval 3600 ve verzi SSH1 je dočasný server key automaticky regenerován po této době (v sec.)
LoginGraceTime 2m doba, do kdy se musí uživatel od navázání spojení úspěšně přihlásit
LogLevel INFO nastavení ukecanosti logu možnosti: QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, a DEBUG3
MaxAuthTries číslo specifikuje kolik pokusů o neúspěšné připojení bude tolerováno
MaxStartups číslo specifikuje kolik současných neautorizovaných spojení bude povoleno
PasswordAuthentication no zda je povolena autentizace heslem
PermitEmptyPasswords no povoluje přihlásit na účty, která mají prázdná hesla
PermitOpen určuje, na který TCP port forwarding je povolen. Možnosti:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
PermitRootLogin no povoluje přímé připojení roota
PermitTunnel zda bude tun forwarding povolen. Pokud je nastaveno na no, root nemá povolené připojení. Hodnoty:
point-to-point (layer 3)
ethernet (layer 2)
PermitUserEnvironment no určuje, zda ~/.ssh/environment a environment= nastavení v ~/.ssh/authorized_keys budou vykonány SSH demonem
PidFile /var/run/sshd.pid umístnění PID souboru
PrintLastLog yes určuje, zda SSH demon by měl vytisknou datum a čas posledního přihlášení usera
PrintMotd yes určuje, zda se bude po přihlášení zobrazovat /etc/motd
RSAAuthentication yes stejné jako následující (starší volba)
PubkeyAuthentication yes povolení autentizace veřejnými klíči
RhostsRSAAuthentication no kontroluje soubor ~/.rhosts a /etc/hosts.equiv zda se klient může připojit. Je možno použít i soubory ~/.shosts a /etc/shosts.equiv a “r” soubory smazat
Subsystem sftp /usr/libexec/sftp-server nastavuje externí subsystém. Udává se cesta k němu. Většinou jde o sftp (dostupné pouze pro ssh2). můžeme si ale nadefinovat vlastní příkaz, jehož argumentem bude cesta k programu, scriptu, nebo jednoduchý příkaz.
ServerKeyBits 768 určuje jakou délkou klíče budou šifrovány dočasné klíče, minimum je 512
StrictModes yes Kontroluje přístupová práva důležitých adresářů a souborů (musí být vlastníkem root nebo uživatel a skupina nebo ostatní nesmějí mít právo zápisu). Kontroluje se Home adresář uživatele, soubory ~/.rhosts , ~/.shosts, ~/.ssh a ~/.ssh/authorized_keys
SyslogFacility AUTH určuje zařízení přebírající logy od sshd. Možnosti:DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7
TCPKeepAlive yes TCP bude posílat zprávy pro udržení spojení
UseDNS yes určuje, zda se bude demon vyhledávat a kontrolovat jestli vzdálený klient má resolvovatelný název k IP
UseLogin no určuje, zda se bude demon login je použit interaktivní login session
UsePAM yes zapíná rozhraní PAM.
X11DisplayOffset 10 specifikuje číslo obrazovky dostupné pro sshd při X11 forwardingu. Toto zabranuje kolizi se skutečným X11 serverem.
X11Forwarding yes udává, zda X11 forwarding je povolen či nikoliv
X11UseLocalhost yes udává, zda sshd nabinduje X11 na loopback či jinou adresu
XAuthLocation /usr/X11R6/bin/xauth určuje cestu k xauth programu

restart SSH: /etc/init.d/ssh restart

Pokud měníte port na kterém SSH poslouchá nezapomeňte tento port povolit ve firewallu

Debian - spuštění, zastavení a restart služby CRON

Posted by admin | Posted in Linux | Posted on 04-05-2009

Spustění restart nebo zastavení CRONa provedete těmito příkazy:

Spuštění:

# /etc/init.d/cron start

nebo

$ sudo /etc/init.d/cron start

Zastavení:

# /etc/init.d/cron stop

nebo

$ sudo /etc/init.d/cron stop

Restart:

# /etc/init.d/cron restart

nebo

$ sudo /etc/init.d/cron restart

Debian - zmena datumu

Posted by admin | Posted in Linux | Posted on 22-04-2009

Pokud nemáte nastaven ntpdate a chcete změnit datum nebo čas na serveru, použíjte tento příkaz:

date --set 2010-12-25
date --set 12:35:0

PHP - Hezké URL

Posted by admin | Posted in Programování | Posted on 13-04-2009

Především kvůli vyhledávačům, ale zčásti i kvůli uživatelům je populární používat přátelská URL. Místo clanek.php?id=12 se tedy používá např. kde-nas-najdete/. Přepis URL může zajišťovat např. mod_rewrite, vytváření správných URL je vhodné nechat na zkušeném uživateli, často se ale generují jednoduše z nadpisu – nejsou pak sice tak úderné, jak by mohly být, ale zase s tím je nejméně práce.

Přestože URL může obsahovat znaky s diakritikou (což používá např. Wikipedia), bývá zvykem ji odstranit a v URL nechat jenom písmena, čísla a oddělovač. Pro ten se nejčastěji používá pomlčka, protože podtržítko Google chápe jako spojovník (mysql_fetch_assoc bere jako jedno slovo, mysql-fetch-assoc jako tři).

Odstranění diakritiky se obvykle provádí vytvořením funkce obsahující výčet znaků s diakritikou a jejich varianty bez diakritiky. Následný převod zajišťuje např. funkce strtr. To není příliš elegantní – převodní tabulku jednak musíme ručně vytvořit a pokud se nechceme spokojit se znaky obvyklými v češtině, ale chceme převádět např. i cizí jména, bude poměrně obsáhlá a dá hodně práce, aby počítala se všemi znaky.

Mnohem elegantnější řešení nabízí funkce iconv sloužící k převodu kódování. Pokud k cílovému kódování připojíme //TRANSLIT, budou se nepřevoditelné znaky aproximovat (při použití //IGNORE se ignorují, jinak převod při nalezení prvního nepřevoditelného znaku skončí). Pro spolehlivou funkčnost je potřeba nastavit proměnnou LC_CTYPE funkcí setlocale na kódování UTF-8, např. tedy cs_CZ.utf-8.

<?php
/** Vytvoření přátelského URL
* @param string $nadpis řetězec v kódování UTF-8, ze kterého se má vytvořit URL
* @return string řetězec obsahující pouze čísla, znaky bez diakritiky, podtržítko a pomlčku
* @copyright Jakub Vrána, http://php.vrana.cz
*/
function friendly_url($nadpis) {
    $url = $nadpis;
    $url = preg_replace('~[^\\pL0-9_]+~u', '-', $url);
    $url = trim($url, "-");
    $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
    $url = strtolower($url);
    $url = preg_replace('~[^-a-z0-9_]+~', '', $url);
    return $url;
}
?>

V řetězci nahradíme každou posloupnost znaků jiných než podtržítko, číslo nebo písmeno (\pL) pomlčkou, kterou ze začátku a konce řetězce následně odstraníme. Řetězec převedeme do kódování us-ascii a na malá písmena. Na závěr odstraníme všechny znaky kromě povolených (protože např. á se při transliteraci převede na ‘a).

Podotýkám, že sekvence \pL, která je pro převod také podstatná, je k dispozici až od PHP 4.4.0 a 5.1.0 a funguje pouze se řetězci v kódování UTF-8 při použití modifikátoru u.

Pokud bychom stejný problém chtěli vyřešit už na straně klienta v JavaScriptu, tak se musíme spokojit s primitivnějším postupem:

<script type="text/javascript">

var nodiac = { 'á': 'a', 'č': 'c', 'ď': 'd', 'é': 'e', 'ě': 'e', 'í': 'i', 'ň': 'n', 'ó': 'o', 'ř': 'r', 'š': 's', 'ť': 't', 'ú': 'u', 'ů': 'u', 'ý': 'y', 'ž': 'z' };
/** Vytvoření přátelského URL
* @param string s řetězec, ze kterého se má vytvořit URL
* @return string řetězec obsahující pouze čísla, znaky bez diakritiky, podtržítko a pomlčku
* @copyright Jakub Vrána, http://php.vrana.cz
*/
function make_url(s) {
    s = s.toLowerCase();
    var s2 = '';
    for (var i=0; i < s.length; i++) {
        s2 += (typeof nodiac[s.charAt(i)] != 'undefined' ? nodiac[s.charAt(i)] : s.charAt(i));
    }
    return s2.replace(/[^a-z0-9_]+/g, '-').replace(/^-|-$/g, '');
}
</script>

Tento článek je převzat ze stránek: http://php.vrana.cz
Jakub Vrána, http://php.vrana.cz

PHP - Přenos proměnných

Posted by admin | Posted in Programování | Posted on 13-04-2009

V tomto článku bych rád upozornil na možné problémy s přenosem proměnných.

Přenos proměnných z formulářů

Posílá-li nějaký formulář proměnnou PHP skriptu metodou GET nebo POST, je třeba tuto proměnnou ve skriptu volat takto, v případě metody GET:

$promenna = $_GET['promenna'];

Nutné je dbát na syntaxi, podtržítkou, v hranatých závorkách proměnná bez $ a v uvozovkách. V případě metody POST:

$promenna = $_POST['promenna'];

Pokud dobře nevíme, jakým způsobem se bude proměnná předávat, můžeme použít $_REQUEST, který zahrnuje oba způsoby:

$promenna = $_REQUEST['promenna'];

Předávání proměnných do funkcí

V případě, že funkce pracuje s nějakými proměnnými, které nezískává jako vlastní parametr, je třeba je volat zvláštním způsobem:

$a = "a";
$b = "b";
$c = "c";
function fun($d){

global $a, $c;
$b = $GLOBALS['b'];
echo  $a.'-'.$b.'-'.$c.'-'.$d;
}
fun('d');

Dříve deklarované proměnné $a, $b, $c voláme buď způsobem global $a nebo $b = $GLOBALS['b']. Proč se to tak děje? Protože jinak by funkce na tyto proměnné nesáhla:

$a = "a";
$b = "b";
$c = "c";
function fun($d){
echo  $a.'-'.$b.'-'.$c.'-'.$d;
}
fun('d');

Taková funkce by vypsala pouze “—d” místo “a-b-c-d”.

Tento článek je převzat ze stránek: http://www.tvorba-webu.cz

PHP - session v PHP

Posted by admin | Posted in Programování | Posted on 10-04-2009

V tomto článku bych se rád zabýval relacemi (session) a jejich využitím v PHP. Článek který právě čtete bude orientován výlučné na teoretické pozadí problematiky, praktickou ukázkou s napojení na MySQL databázi se budeme zabývat v druhém článku.

Session neboli relace umožňuje přesnou identifikaci uživatele a pohyb na serveru. Za pomoci session jsou naprogramovány všechny web-based mailové servery. Má tedy použití všude tam, kde je zapotřebí monitorovat nebo ověřovat uživatele, například pomocí jeho IP adresy. Používá se také pro možnost vlastní úpravy vzhledu (customizing) například na vyhledávacích nebo katalogizačních serverech, kdy po vstupu na stránku server ověří vaši identitu a zobrazí informace, novinky nebo zprávy přesně podle vašeho dřívějšího nastavení. Nutno podotknout, že session jsou implementovány do PHP až od verze 4.0.

Session pracuje na jednoduchém principu. Každý uživatel, který vstoupí na stránku obdrží jednoznačné číslo, budeme ho nazývat ID, resp. SID (Session ID). Často to nebývá pouze číslo, ale vyskytují se v něm i znaky, např. a3c54cd96d712021d54587d5a4b4c. Tímto číslem se tedy bude uživatel identifikovat, tz. ve všech odkazech je zapotřebí předávat tento parametr. PHP implicitně předává SID v proměnné PHPSESSID. Viz. sekce [Session] a
položka session.name v souboru php.ini. Ukládání čísla relace v URL je jeden ze způsobů, PHP nabízí kromě toho také ukládání do cookie. Já osobně preferuji raději URL, neboť ne každý uživatel má zapnutou volbu cookie ve svém prohlížeči. Session demostruje svou sílu především možností předávání de facto neomezeného počtu proměnných. Na stránkách tedy nemusíme používat tagy typu:

<input type="hidden" name="promenna" value="hodnota">

Veškerý parametr, který je předáván je pouze SID. Pokud uživatel navštíví stránku, kde používáte session, PHP automaticky (v případě, že je nastavena v souboru php.ini položka session.auto_start =1) otestuje existenci relace. Pokud neexistuje jsou všechny proměnné a relace vytvořeny. Toto lze provést také programově pomocí funkce:

session_start()

Nebo také pomocí funkce:

session_register()

Proměnné mohou být ukládány jako záznamy ve globálním sdruženém poli $HTTP_STATE_VARS nebo jako globální proměnné. Ukládání závisí na nastavení parametrů track_vars a gpc_globals (viz php.ini). Pokud je povolený parametr track_vars, jsou proměnné ukládány v poli $HTTP_STATE_VARS, volba gpc_globals naproti tomu nastavuje ukládání do globálních proměnných. Implicitně jsou oba konfigurační parametry nastavené na On.

Nyní se dostáváme k problému, jak ukládat aktivní relace na serveru. PHP nabízí dvě možnosti, jednak ukládání dat do textového souboru (položka session.save_handler = files v souboru php.ini), nebo do vlastní databáze. Druhým způsobem se budeme podrobněji zabývat v příštím článku. Ukládání do textového souboru je mnohem jednodušší, nicméně, ne příliš transparentní. Pokud se pro něj rozhodneme, musíme v souboru php.ini nastavit cestu
k adresáři (session.save_path), kde se budou uchovávat tyto souboru, implicitně je nastaven adresář /tmp. Cestu lze samozřejmě kdykoliv změnit pomocí funkce session_save_path.

Každá relace má svou životnost. Relace končí, pokud uživatel opustí korektně stránku (například se odhlásí), nebo vyprší její časový limit. Je zřejmé, že na serveru musí běžet demon, který kontroluje aktivní relace a maže již neaktivní. Relace, které nejsou již aktivní se nazývají garbage (smetí). v

Nastavení časového limitu, způsobu tvorby, zápisu, čtení a mazání relaci se provádí pomocí této funkce:

session_set_save_handler (open, close, read, write, destroy, gc)

Procedury open, close, read, write, destroy a gc (garbade collection) jsou definované funkce pro práci s relacemi. Jak již bylo řečeno, relace se inicializuje funkcí session_start(). Ukončení relace se provádí funkcí session_destroy() .

To by bylo k teoretickému pozadí session v PHP vše o a příště se budeme zabývat již praktickými kroky.

Tento článek je převzat ze serveru interval.cz

PHP - Počet souborů v adresáři

Posted by admin | Posted in Programování | Posted on 10-04-2009

Vypíše obsah zadaného souboru:

<?php
function pocet($addr){
$adresar = opendir($addr);
$num=0;while ($soubor = readdir($adresar)){$num++;}
$num = $num-2;
echo '('.$num.')';
}

pocet("http://www.domena.cz/php/");
?>