Htpasswd – zrušení autentizace pro specifickou složku

Pokud potřebujete k určité části webu přistupovat pod heslem, tak asi nejrychlejší a nejjednodušší cesta vede přes serverovou autentizaci. K tomu budeme potřebovat soubory .htaccess a .htpasswd.

Postup je např. na http://tools.dynamicdrive.com/password/, kde si můžete rovnou i vygenerovat soubory s přístupovými údaji.

Já řešil spíše opačný problém, … a to jak část takto zabezpečeného webu zpřístupnit.

Např. http://ftp.domena.cz/ (máte zabezpečené heslem), ale http://ftp.domena.cz/pub/ už by jste chtěli zpřístupnit veřejně.

Řešení je velmi snadné. Stačí do složky /pub/ vložit soubor .htaccess, s tímto kódem:

Satisfy Any
Order Allow,Deny
Allow from all

Git – problémy s koncem řádků

Pokud se Vám po push(nutí) kódu na github změny v kódu projevují asi takto:

-<!DOCTYPE html>
-<html lang="cs">
-    <head>
-        <meta charset="utf-8">
-    </head>
-
-    <body>
-
-        <div id="nejakydiv">
-        </div>
-
-    </body>
-</html>
+<!DOCTYPE html>
+<html lang="cs">
+    <head>
+        <meta charset="utf-8">
+    </head>
+
+    <body>
+
+        <div id="nejakydiv">
+            <!-- Pridany dva radky -->
+            <p>Nejaky text</p>
+        </div>
+
+    </body>
+</html>

místo (správně) takto:

<html lang="cs">
    <head>
        <meta charset="utf-8">
    </head>

    <body>

        <div id="nejakydiv">
+            <!-- Pridany dva radky -->
+            <p>Nejaky text</p>
        </div>

    </body>
</html>

Zřejmě jeden programátor má nastavené znaky pro koncové řádky jako LF (linux) a druhý CRLF (windows). Nejvhodnější v rámci týmu je vždy se domluvit.

Pro automatický převod na crlf (windows zakončení řádků) proveďte příkaz:

git config --global core.autocrlf true

Viz: https://help.github.com/articles/dealing-with-line-endings

Toto nastavení můžete také editovat ručně v:

%USERPROFILE%/.gitconfig

.gitconfig by pak měl vypadat nějak takto:

[user]
	email = vas@email.tld
	name = Jmeno prijmeni
[core]
	autocrlf = true

Bash – vypsání uživatelů ve skupině

Včera jsem si potřeboval překontrolovat jaké uživatele jsem zařadil do určité skupiny. Strýček google mi nenabídl nějaké rychlé řešení a tak jsem si napsal vlastní skriptík.

#!/bin/bash

echo -ne "Zadejte jmeno skupiny: "; read group_name
if [ -z "$group_name" ]
then
    echo "Nic jste nezadali."
else
    var_group="$(cat /etc/group | grep ^$group_name: | awk 'BEGIN{FS=":"} {print $4}')"
    echo "Ve skupine "${group_name}" jsou tito uzivatete: ($var_group)";
fi

Ubuntu – manuální korekce času

Nastavení data a času dle našeho zadání:

sudo date -s "31 JAN 2012 20:00:00"

Vypsání data a času nastaveného na našem (desktopu/serveru):

date

Vypsání našeho časového pásma

cat /etc/timezone

Správné nastavení časového pásma pro ČR je:

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

Stažení přesného času pro ČR ze serverů CZ.NIC:

sudo ntpdate ntp.nic.cz

Občas se stane že jsme za firewallem, tak stačí příkaz:

sudo date -s "$(wget -S "http://www.google.com/" 2>&1 | grep -E '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' | head -1l | awk '{print $1, $3, $2, $5 ,"GMT", $4 }' | sed 's/,//')"

Selenium – google chrome

Pokud se vám stane že při spuštění skriptu např.:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('http://google.com/')
time.sleep(3)
browser.quit()

vyskočí tato hláška:

Traceback (most recent call last):
  File "./test.py", line 7, in <module>;
    browser = webdriver.Chrome()
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/webdriver.py", line 59, in __init__
    self.service.start()
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/chrome/service.py", line 66, in start
    "ChromeDriver executable needs to be available in the path. "
selenium.common.exceptions.WebDriverException: Message: ChromeDriver executable needs to be available in the path. Please download from http://chromedriver.storage.googleapis.com/index.html and read up at http://code.google.com/p/selenium/wiki/ChromeDriver

Můžete vyzkoušet můj skript, který by měl vše vyřešit 🙂 .

#!/bin/bash
  
[ "x$USER" != 'xroot' ] && echo "Please run as root." && exit 1
 
# B: COMPONENTS INSTALL
function fceGoogleChrome() {
    if [ ! -s "/etc/apt/sources.list.d/google-chrome.list" ]; then
        sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
        wget -O - "https://dl-ssl.google.com/linux/linux_signing_key.pub" | sudo apt-key add -
        sudo apt-get update 
    fi
    sudo apt-get install google-chrome-stable -y
}
 
function fceCheckInstaled() {
    if ! dpkg-query -s $prog > /dev/null 2>&1; then
        echo $prog "not installed"
        read -p "Do you want to install (y/n)? "
        if [[ "$REPLY" == "Y" ||  "$REPLY" == "y" ]]; then
            if [[ $prog == "google-chrome-stable" ]]; then
                fceGoogleChrome
            else
                sudo apt-get install $prog -y
            fi
        fi
    fi
}
 
progArray=("unzip" "curl" "wget" "python-pip" "google-chrome-stable")
for prog in ${progArray[@]}
do
    fceCheckInstaled
done
 
sudo pip install selenium
# E: COMPONENTS INSTALL
 
 
# B: CHROMEDRIVER INSTALL
VERSION=`curl "http://chromedriver.storage.googleapis.com/LATEST_RELEASE"`
 
case $(uname -m) in
x86_64)
    NAME="chromedriver_linux64.zip"
    ;;
i*86)
    NAME="chromedriver_linux32.zip"
    ;;
*)
    echo "ERROR: Unknown Architecture"
    exit
    ;;
esac
 
 
wget -P /tmp "http://chromedriver.storage.googleapis.com/"$VERSION"/"$NAME
 
if [ -f /tmp/$NAME ]
then
    sudo unzip /tmp/$NAME -d /usr/local/share
    sudo rm /tmp/$NAME
 
    sudo chmod +x /usr/local/share/chromedriver
 
    sudo ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver
    sudo ln -s /usr/local/share/chromedriver /usr/bin/chromedriver
else
    echo "File /tmp/"$NAME" not found"
fi
# E:  CHROMEDRIVER INSTALL

GnuPG – šifrování souborů

Klíč generujeme pomocí příkazu:

gpg --gen-key

Pokud se vám zobrazí tato hláška:

Not enough random bytes available. Please do some other work to give the OS a chance to collect more entropy! (Need 187 more bytes)

Potřebujete nainstalovat balíček:

apt-get install rng-tools

Při generování klíče pak spusťte třeba v novém okně terminálu příkaz:

rngd -f -r /dev/urandom

Ten zajistí generování náhodných bajtů které jsou použity při sestavení klíče.

Pokud vše vyšlo, nezbývá nám nic jiného než privátní klíč ještě zazálohovat.

gpg --export-secret-key -a 'postkeygnupg@domain.tld' > /mnt/d/my-private-key.asc

Chcete-li z nějakého důvodu distribuovat váš veřejný klíč světu, můžete to udělat následovně:

  • Zjistíte si jeho Key ID:
gpg --keyid-format LONG --list-keys 'postkeygnupg@domain.tld' | grep '^pub' | awk '{print $2}' | cut -d "/" -f2
  • A potom odešlete na server:
gpg --keyserver pgp.mit.edu --send-keys 4EAF8EE450EE4204

Za nějakou dobu už bude možné vyhledat váš klíč třeba na: https://pgp.mit.edu/.

Vyzkoušíme si ještě zašifrovat soubor.

gpg --encrypt --recipient postkeygnupg@domain.tld mujsoubor.txt

A nyní rozšifrovat

gpg mujsoubor.txt.gpg

Export veřejného klíče:

gpg --export -a 'postkeygnupg@domain.tld' > /mnt/d/my-public-key.asc

Importování klíče na jiný stroj provedeme:

gpg --import my-private-key.asc

Pozn.: Privátním klíčem dešifrujeme data, takže pozor kam ho nahráváte!

Toť vše, přeji příjemnou zábavu 😉

Parsování stránky v PHP

Musíme mít nainstalovanou knihovnu php5-curl.

sudo apt-get install php5-curl
sudo service apache2 restart

Vytvoříme si například soubor cURLapi.php

<?php

/* Pozn.:
 * apt-get install php5-curl 
 */

function cURL_getPage($url) {
    $curl = curl_init();

    /* BEGIN: userAgent */
    $userAgent = "Firefox (WindowsXP) - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6";
    /* END: userAgent */

    /* BEGIN: header */
    $httpHeaderArray = array(
        "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9",
        "Cache-Control: max-age=0",
        "Connection: keep-alive",
        "Keep-Alive: 300",
        "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
        "Accept-Language: en-us,en;q=0.5",
        "Pragma: "
    );
    /* END: header */

    /* BEGIN: referer */
    $refererLink = "https://www.google.com/search?q=" . $url;
    /* END: referer */

    curl_setopt($curl, CURLOPT_URL, $url);  // url
    curl_setopt($curl, CURLOPT_SSLVERSION, 3);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);  // userAgent
    curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeaderArray);  // hlavicka
    curl_setopt($curl, CURLOPT_REFERER, $refererLink);  // referer
    curl_setopt($curl, CURLOPT_HEADER, FALSE);  // zobrazi nam serverou hlavicku (TRUE/FALSE)
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);  // vrati nam webovou stranku (TRUE/FALSE)
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);  // povoli presmerovani v url (TRUE/FALSE)
    curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);  // povoli posilani referecniho odkazu (TRUE/FALSE)
    curl_setopt($curl, CURLOPT_ENCODING, "");
    curl_setopt($curl, CURLOPT_MAXREDIRS, 10);  // zastavi stahovani po 10 presmerovanich
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 120);  // timeout pro pripojeni
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);  // timeout na odpoved
    /* Proxy */
    // curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
    // curl_setopt($curl, CURLOPT_PROXY, "127.0.0.1");
    // curl_setopt($curl, CURLOPT_PROXYPORT, 9050);

    $html = curl_exec($curl);  // provede curl prikazy
    curl_close($curl);  // zavre spojeni
    return $html;  // vrati webovou stranku
}

A do indexu.php

<?php

require('cURLapi.php');
header('Content-Type: text/html; charset=utf-8'); // Vytiskne parsovany web v UTF-8

$url = "http://nejakaUrl.tld";
$page = cURL_getPage($url);

$page = htmlspecialchars($page, ENT_QUOTES); // Priprava pro strojove zpracovani - zobrazeni kodu. Zakomentovanim tohoto radku se nam webova stranka zobrazi klasicky.
echo '<pre>' . $page . '</pre>';

A krásně nám to stránku tahá 😉 , toť vše.