Ubuntu : mettre à jour son système

Pour voir la version de votre Ubuntu :

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.3 LTS
Release: 14.04
Codename: trusty

Vous pouvez vérifier les périodes de support des différentes versions d’Ubuntu sur le site officiel.

Récupérer la liste des mises à jour disponibles 

$ apt-get update
Get:1 http://security.ubuntu.com trusty-security InRelease [64.4 kB]
Ign http://archive.ubuntu.com trusty InRelease
Get:2 http://archive.ubuntu.com trusty-updates InRelease [64.4 kB]
Get:3 http://security.ubuntu.com trusty-security/main amd64 Packages [410 kB]
Hit http://archive.ubuntu.com trusty Release.gpg
[...]

 

Mettre à jour les paquets installés

$ apt-get upgrade

Mettre à jour les paquets ainsi que les dépendances

$ apt-get dist-upgrade

Commandes de base pour PostgreSQL

C’est toujours pratique d’avoir sous la main une liste de commandes de base de postgresql pour les tâches quotidiennes.

Lister les bases de données

psql=> \l
                              List of databases
     Name     |  Owner   | Encoding | Collation  |   Ctype    |   Access privileges
--------------+----------+----------+------------+------------+-----------------------
 test         | test     | UTF8     | fr_FR.UTF8 | fr_FR.UTF8 |
(...)

Lister les tables

psql> \dt *

... 
public | metrics | table | charles
public | news    | table | charles
...

 

Créer une base de données postgres

psql> CREATE DATABASE sport WITH ENCODING 'UTF8' OWNER=charles ;

Syntaxe complète

CREATE DATABASE db_name
    OWNER =  role_name
    TEMPLATE = template
    ENCODING = encoding
    LC_COLLATE = collate
    LC_CTYPE = ctype
    TABLESPACE = tablespace_name
    CONNECTION LIMIT = max_concurrent_connection
  • db_name: le nom de la base de données. Ce nom est unique sur le serveur.
  • role_name: le rôle propriétaire de la base. Le rôle par défaut est celui de l’utilisateur qui exécute la commande.
  • template: le modèle de base pour la création de votre base. Par défaut, PostgreSQL utilise le template « template1 »
  • encoding: l’encodage de la base. Par défaut, c’est celui du template.
  • collate: définit les règles de collation. Ces règles agissent sur le tri (ORDER BY) des chaînes de caractères. Par défaut c’est celui du template qui est utilisé.
  • ctype: définit les classes de caractères (chiffre, minuscule, majuscule, …).  Par défaut, celui du template est utilisé.
  • tablespace_name: définit le tablespace , c’est à dire l’espace de stockage, où la base va être stockée. Par défaut, celui du template est utilisé.
  • max_concurrent_connection: définit le nombre de connexion simultanées sur la base. Par défaut, -1 est utilisé, qui signifie pas de limite.

 

Lister les contraintes d’une table

 

SELECT
    tc.constraint_name, tc.table_name, kcu.column_name, 
    ccu.table_name AS foreign_table_name,
    ccu.column_name AS foreign_column_name
FROM
    information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
WHERE tc.table_name='meals';

 

 constraint_name | table_name | column_name | foreign_table_name | foreign_column_name
-----------------+------------+-------------+--------------------+---------------------
 meals_pkey      | meals      | id          | meals              | id

Sauvegarder une base de données

 

$ pg_dump -U charles sport > sport.dump.sql

 

Importer un dump

 

$ psql -U charles sport < sport.dump.sql

 

Sauvegarder toutes les bases de données postgresql

 

$ pg_dumpall > all.dump.sql

 

Sauvegarder une table en particulier

 

$ pg_dump --table matches -U charles sport -f sport.matches.dump.sql

 

Supprimer toutes les tables d’une base

 

psql -U <user> -t -d <database> -c "SELECT 'DROP TABLE ' || n.nspname || '.' || c.relname || ' CASCADE;' FROM pg_catalog.pg_class AS c LEFT JOIN pg_catalog.pg_namespace AS n ON n.oid = c.relnamespace WHERE relkind = 'r' AND n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
pg_catalog.pg_table_is_visible(c.oid)" >/tmp/droptables
psql -U <user> -d <database> -f /tmp/droptables

 

Exporter une requête en .csv

 

psql> COPY (SELECT * FROM ingredients) TO '/tmp/export.csv' WITH CSV HEADER;

 

Pour plus d’informations, la documentation officielle en français.

Apache: compresser les logs générés par cronolog

Dans un article précédent, j’expliquais comment utiliser cronolog avec Apache pour créer des fichiers en fonction de la date.

On obtient des fichiers classés de la sorte :

/var/log/apache2# ls -l 2016/01/
-rw-r--r-- 1 root root 4136552 Jan 1 23:59 01_blog.preprod_access.log
-rw-r--r-- 1 root root 86773599 Jan 1 23:59 01_blog.prod_access.log
-rw-r--r-- 1 root root 5314165 Jan 2 23:59 02_blog.preprod_access.log
-rw-r--r-- 1 root root 177562123 Jan 2 23:59 02_blog.prod_access.log
-rw-r--r-- 1 root root 5804359 Jan 3 23:59 03_blog.preprod_access.log
-rw-r--r-- 1 root root 159230127 Jan 3 23:59 03_blog.prod_access.log
[...]

Cronolog  ne compresse pas les fichiers qu’il écrit.

Pour faire de la place et archiver progressivement les logs, un script à base de la commande find fait largement l’affaire :

find /var/log/apache2/`date +%Y`/ -name « *.log » -mtime +1 -exec gzip « {} » « ; »

Ici, j’ai ajouté `date +%Y` dans le chemin de recherche des logs pour fonctionner avec les logs de l’année courante.

  • -mtime +1 : recherche les fichiers dont la date de modification est supérieure à 24h (1*24h)
/var/log/apache2# ls -l 2016/01/
total 579552
-rw-r--r-- 1 root root 180159 Jan 1 23:59 01_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 5723517 Jan 1 23:59 01_blog.prod_access.log.gz
-rw-r--r-- 1 root root 225293 Jan 2 23:59 02_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 9896313 Jan 2 23:59 02_blog.prod_access.log.gz
-rw-r--r-- 1 root root 241911 Jan 3 23:59 03_blog.preprod_access.log.gz
-rw-r--r-- 1 root root 9817631 Jan 3 23:59 03_blog.prod_access.log.gz
[...]

Utilisation de tar en ligne de commande

Tar est un utilitaire historique de gestion d’archives de fichiers. Un fichier .tar peut contenir un ou plusieurs fichiers.

Créer une archive d’un répertoire

$ tar cvf books.tar books/
a books
a books/.git
a books/.git/branches
a books/.git/config
a books/.git/description
a books/.git/HEAD
[...]
$ ls -l books.tar
-rw-r--r-- 1 charles staff 32256 16 jan 18:36 books.tar

 

Créer une archive compressée avec gzip

$ tar czvf books.tar.gz books/
a books
a books/.git
a books/.git/branches
a books/.git/config
a books/.git/description
a books/.git/HEAD
[...]
$ ls -l books.tar.gz
-rw-r--r-- 1 charles staff 6215 16 jan 18:37 books.tar.gz

 

Créer une archive compressée avec bzip2

$ tar cjvf books.tar.bz2 books/
a books
a books/.git
a books/.git/branches
a books/.git/config
a books/.git/description
a books/.git/HEAD
[...]
$ ls -l books.tar.bz2
-rw-r--r-- 1 charles staff 5996 16 jan 18:38 books.tar.bz2

 

Lister les fichiers d’une archive, compressée ou non

Tar détecte automatique via l’extension de l’archive si elle est compressée ou non.

$ tar tf books.tar
books/
books/.git/
books/.git/branches/
books/.git/config
books/.git/description
books/.git/HEAD
[...]

 

$ tar tf books.tar.gz
books/
books/.git/
books/.git/branches/
books/.git/config
books/.git/description
books/.git/HEAD
[...]

Extraire une archive dans un répertoire particulier

$ tar xzvf books.tar.gz -C /tmp/

Extraire un fichier particulier d’une archive

$ tar xzvf books.tar.gz books/.git/description

Options de la ligne commande

t: Liste le contenu d'une archive
v: affiche les fichiers traités sur la sortie standard
z: compresse/décompresse le contenu de l'archive avec gzip
j: compresse/décompresse le contenu de l'archive avec bz2
f: nom de l'archive à traiter
x: extraire les fichiers de l'archive

 

Ssh: utiliser une passerelle pour atteindre une machine

 

L’accès à certaines infrastructures peut-être protégé avec un whitelisting par rapport à l’adresse IP source.

Disons que vous vous trouver sur une machine A, voulez accéder à un serveur C sur lequel seule la machine B est autorisée à se connecter.

Vous pouvez indiquer automatiquement à ssh que lorsque vous vous connectez à la machine C, il faut passer par la machine B.

Dans le .ssh/config de l’utilisateur de la machine A :

 

# Passerelle
Host machineB
    Hostname 192.168.42.101
    User charlybr
# machineC via machineB
Host machineC
    User ops
    Hostname 192.168.100.73
    Port 4225
    ProxyCommand ssh machineB nc %h %p

 

Ensuite en ligne de commande :

$ ssh machineC
 Last login: Sat Jan 16 11:17:56 2016 from xxx
 ops@machineC ~ 2016-01-16 11:19:30 0 0
 $ hostname
 machineC

Cela fonctionne pareil si vous devez faire des synchronisations de fichiers via rsync :

$ rsync -av images machineC:~/public_html/