Snippets tagged "sysadmin"
Bannir les cronmails
Si vous utilisez crontab, vous recevez sans doute souvent des emails à l'adresse du propriétaire du compte avec le détail des sorties standards et d'erreurs suite à l'execution des commandes programmées.
Pour éviter ces emails, on peut systématiquement masquer ces sorties lors de l'appel à la ligne, par exemple dans un crontab :
*/10 * * * * ./myprogram 1> /dev/null 2> /dev/null
Corriger l'encodage d'un fichier MYSql
Pour corriger les caractères bizarres qui peuvent apparaitre à la place des accents après une remontée d'un fichier de dump, il est possible de fixer l'encodage pour la connexion en rajoutant au début du fichier la ligne :
SET CHARACTER SET <encodage>;
J'utilise notamment souvent UTF8 dans ce cas, le fichier provenant d'un dump effectué sous linux, et remontant dans une base en latin1.
Dump de toutes les bases d'un serveur MySQL dans des fichiers multiples
Si comme moi vous avez sous la main un serveur abritant plusieurs (dizaines, voir centaines de) bases de données, le jour où une des bases de données plante et qu'on vous demande de la restaurer, je vous souhaite bien du courage si vous n'avez qu'un résultat de mysqldump --all-databases sous la main.
Afin de pallier ce problème, j'ai écris ce script bash qui vous facilitera bien la vie !
Au programme :
sauvegarde des dump de chaque base dans des fichiers séparés compressés en gzip, eux même situés dans un dossier nommé en fonction de la date
suppression automatique du dump effectué il y a 7 jours.
Le script est destiné à être exécuté par un cron, par exemple toutes les nuits.
#!/bin/bash #paramètres de configuration du script #completer ici par le nom d'un utilisateur autorisé à dumper toutes vos bases : strMysqlUser="" #completer ici par le mot de passe de cet utilisateur : strPassword="" # completer ici par le chemin vers le repertoire de travail où va se trouver le dump # il est possible de préfixer le répertoire : # "/rep/de/travail/prefix_" donnera alors /rep/de/travail/prefix_20070505 repTravail="" #mémorisation de la date du jour et de la date d'il y a 7 jours dateActuelle=$(date +%Y%m%d) datePassee=$(date --date '7 days ago' +%Y%m%d) #Suppression de la sauvegarde d'il y a 7 jours echo "["$(date +%F\ %X)"] Suppression des dump du "$datePassee repTravailPasse=$repTravail$datePassee rm -R $repTravailPasse # début du dump echo "["$(date +%F\ %X)"] Dump du : "$dateActuelle repTravailActuel=$repTravail$dateActuelle mkdir $repTravailActuel # récupération de la liste des bdd, "tail -n +2" est présent pour ne pas récupérer le titre "Databases" renvoyé par mysql listDatabase=$(mysql --user=$strMysqlUser --password=$strPassword --exec="SHOW DATABASES;" | tail -n +2) #dump de chaque base dans un fichier for lineDatabase in $listDatabase do echo "["$(date +%F\ %X)"] Debut du dump de la base "$lineDatabase" vers "$repTravailActuel mysqldump --user="$strMysqlUser" --password="$strPassword" "$lineDatabase" | gzip > "$repTravailActuel"/"$lineDatabase".sql.gz echo "["$(date +%F\ %X)"] Dump compressé dans "$repTravailActuel"/"$lineDatabase".sql.gz" done echo "["$(date +%F\ %X)"] Fin de la sauvegarde" exit 0
Lister le matériel de sa machine
Lister toutes les informations de la machine :
$ sudo lshw
Il existe la possibilité d’exporter le résultat dans une page *.html :
$ sudo lshw -html > votre_nom_de_fichier.html
via http://www.pastanque.be/splitsch/ubuntu/106/106.html et le planet ubuntu-fr (http://planet.ubuntu-fr.org)
Mailer un backup mysql comme attachement en ligne de commande
On va utiliser mutt :
$ sudo apt-get install mutt
La commande (cronable) :
$ mysqldump -uroot -p --all-databases --opt \
| bzip2 > /path/to/backup/export.sql.bz2 \
&& echo "En date du " `date` \
| mutt -s "[Nikobox] Backup MySQL total du `date | awk '{ print $2,$3,$4}'`" \
-a /path/to/backup/export.sql.bz2 you@fai.com
Sécuriser /tmp
Beaucoup de script-kiddies s'amusent beaucoup avec le répertoire /tmp, par défaut aisément accessible et donc réceptacle à executables falacieux de tous poils.
Voici une méthode permettant de remplacer ce point de montage par un nouveau, de 40Mo mais dont la particularité sera de ne pas autoriser l'execution de programmes (héhé) :
# create a 40MB block device which will be the /tmp file system cd /root dd if=/dev/zero of=/root/tmpMnt bs=1024 count=40000 mkfs.ext3 -F /root/tmpMnt # mount it at /tmp mv /tmp /tmp.backup mkdir /tmp mount -o loop,noexec,nosuid,rw /root/tmpMnt /tmp chmod 0777 /tmp # make it so it is used on boot up if ! grep -qai tmpMnt /etc/fstab ; then echo "/root/tmpMnt /tmp ext3 loop,noexec,nosuid,rw 0 0" >> /etc/fstab fi # check your syntax is ok mount -a # check that programs in /tmp will not run cp /bin/ls /tmp/ /tmp/ls
Pour remonter /tmp avec droits d'execution :
# umount /tmp # mount -o loop,rw /root/tmpMnt /tmp
Et remonter la partition sans les droits d'execution :
# umount /tmp # mount -o loop,noexec,nosuid,rw /root/tmpMnt /tmp
Exclure un paquet d'un dist-upgrade
Wajig permet de bloquer un paquet via sa sous-commande hold :
$ sudo apt-get install wajig
$ sudo wajig hold <package_name>
$ sudo apt-get update
$ sudo apt-get dist-upgrade
Ici le paquet <package_name> ne sera pas mis à jour.
Avec aptitude, vous pouvez conserver un paquet en faisant :
$ aptitude hold package_name
et enlever le drapeau « hold » avec
$ aptitude unhold package_name
Donner les pouvoirs d'administration système à un utilisateur
En admettant l'existance d'un utilisateur toto :
$ sudo adduser toto admin
L'utilisateur toto sera automatiquement ajouté aux sudoers et pourra donc executer le commande sudo en s'identifiant au moyen de son mot de passe.
Compter le nombre d'occurence d'un terme dans un répertoire
Dans tous les fichiers de type texte, calcul du nombre d'occurence d'une chaîne de caractère avec grep et wc :
$ grep -r require_once /path/to/scan | wc -l
1454
On peut aussi exclure certaines ressources ou répertoires, avec grep -v :
$ grep -r require_once /path/to/scan | grep -v .svn | wc -l
735
Turn on Bash Smart Completion
Just edit /etc/bash.bashrc
Uncomment the following lines, by removing the # in the beginning of the lines:
#if [ -f /etc/bash_completion ]; then # . /etc/bash_completion #fi
Now, resource the modified file :
$ source /etc/bash.bashrc
Then try to tape apt-cache [TAB][TAB]
You will have this result in replacement of the habitual list of files and directories of your current path :
$ apt-cache
add dotty dumpavail pkgnames rdepends show showsrc unmet
depends dump gencaches policy search showpkg stats xvcg
It works with a lot of functions like cd (it will provide only directories), apt-get,...
It also enable code completion when using the sudo command.
Isn't it useful ?
Nota : The tip I give here is to activate Smart Completion for all users. If you want to activate it for only one user (or if you want to activate it but doesn't have write rights to /etc/bash.bashrc) you can modify your ~/.bashrc file and uncomment the same lines as described upper and resource it with
$ source ~/.bashrc
Can't start server: Bind on TCP/IP port: Cannot assign requested address
Des fois, MySQL c'est chiant. Merci IRC !
<n1k0> help <n1k0> je dois installer un server mysql5 sur une ubuntu lts server toute fraiche <n1k0> apt-get install mysql-server-5.0 <n1k0> et là c'est le drâme <n1k0> il me sort ...failed or took more than 6s. <n1k0> Please take a look at the syslog. <n1k0> /usr/bin/mysqladmin: connect to server at 'localhost' failed <n1k0> error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)' <n1k0> Check that mysqld is running and that the socket: '/var/run/mysqld/mysqld.sock' exists! <n1k0> dans le syslog, j'ai : <n1k0> [ERROR] Can't start server: Bind on TCP/IP port: Cannot assign requested address <n1k0> netstat, ps et lsof me montrent qu'aucun autre mysql ne tourne <n1k0> j'ai tenté --reinstall --purge, rien n'y fait <Yann2> et si t'essaie de démarrer le serveur? <david`bgk> port utilisé ? <n1k0> j'ai même rebooté la machine (!) <n1k0> port 3306 libre <Yann2> avec sudo /etc/init.d/ ? <n1k0> rien n'y fait <Yann2> meme message d'erreur? <n1k0> ouais <david`bgk> et /var/run/mysqld/mysqld.sock existe ? <n1k0> non justement <n1k0> mais d'ou vient le bleme ?? <worf|work> dans /etc/mysql/my.cnf regarde quel est le bind-adress <worf|work> si y en a un etc... <n1k0> j'ai aussi ^G/usr/bin/mysqladmin: connect to server at 'localhost' failed <[NikO]> j'adore les boulets sur msn, ils m'ajoutent dans leur contact, et ils me font 't'es ki ?' <n1k0> dans le syslog <worf|work> netstat -an | grep 3306 <worf|work> regarde si y a un truc qui listen aussi <n1k0> bind-address : 127.0.0.1 <worf|work> il doit servir qu'en local ce mysql ? <worf|work> ou d'autres machines devront s'y connecter ? <n1k0> rien n'ecoute <n1k0> non c'est du local pur <worf|work> dans ps y a aucun mysqld ? <n1k0> non <worf|work> tapes : safe_mysqld <worf|work> ou mysqld_safe <worf|work> (si ça existe) <n1k0> command not found <n1k0> ah <n1k0> Starting mysqld daemon with databases from /var/lib/mysql <n1k0> mysqld_safe[4716]: started <n1k0> STOPPING server from pid file /var/run/mysqld/mysqld.pid <n1k0> mysqld_safe[4729]: ended <n1k0> gné <worf|work> ls -la /var/lib/mysql <n1k0> total 20532 <n1k0> drwxr-xr-x 3 mysql mysql 4096 2007-01-10 13:35 . <n1k0> drwxr-xr-x 22 root root 4096 2007-01-10 13:21 .. <n1k0> -rw-r--r-- 1 root root 0 2007-01-10 13:21 debian-5.0.flag <n1k0> -rw-rw---- 1 mysql mysql 10485760 2007-01-10 13:35 ibdata1 <n1k0> -rw-rw---- 1 mysql mysql 5242880 2007-01-10 13:35 ib_logfile0 <n1k0> -rw-rw---- 1 mysql mysql 5242880 2007-01-10 13:21 ib_logfile1 <n1k0> drwxr-xr-x 2 mysql root 4096 2007-01-10 13:21 mysql <worf|work> ça m'a l'air pourtant pas mal <n1k0> Le truc qui m'inquiète c'est : <worf|work> chown mysql:mysql /var/lib/mysql <n1k0> http://www.debianforum.de/forum/viewtopic.php?t=59014&sid=f89fc839052a659222b63b77b55572d5 <n1k0> et surtout http://www.linuxforums.org/forum/servers/41668-mysql-problems-_-solved-_.html <n1k0> Genre personne y comprend rien <n1k0> le chown a rien changé <worf|work> dans ton my.cnf vire ton bind-adresse <n1k0> ok <n1k0> ça marche ! <n1k0> bouarf <worf|work> ton interface loopback est pas en bon état :) <n1k0> yep <worf|work> ferme ton 3306 avec un firewall <worf|work> et pi toute façon quand tu fais tes GRANT restreint les ensuite à l'ip de la machine. <Rik24d> david`bgk: je parlais bien évidemment des négo entre apple et les opérateurs <worf|work> ifconfig lo <worf|work> ça dit quoi ? <n1k0> lo Link encap:Local Loopback <n1k0> LOOPBACK MTU:16436 Metric:1 <n1k0> RX packets:0 errors:0 dropped:0 overruns:0 frame:0 <n1k0> TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 <n1k0> collisions:0 txqueuelen:0 <n1k0> RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) <worf|work> c le script réso qui pue <worf|work> ifconfig lo UP <Rik24d> n1k0: http://paste.inertie.org ;) <david`bgk> paste.inertie.org :p <david`bgk> arf <n1k0> Rik24d, flemme + mode panic = excusez moi <neuro`> Quelqu'un qui torche en rewrite rules ici ? <david`bgk> c'est juste que c'est nouveau mais personne l'utilise ;) <n1k0> YEAH <n1k0> merci mille fois worf|work <worf|work> verifie tes scripts de démarrage <n1k0> I owe you a beer, quand tu veux <worf|work> c'est pas normal que lo soit pas UP <worf|work> et ça doit etre ça qui merde, pas mysql <n1k0> yep <n1k0> mais là le truc tourne, je peux installer ma demo <n1k0> je ferai un gros check up cet aprem <n1k0> merci encore <worf|work> de rien
Utiliser la JVM de Sun au lieu de GCJ
Vérifier la présence de la mchine virtuelle Java de Sun :
$ update-java-alternatives -l
java-1.5.0-sun 53 /usr/lib/jvm/java-1.5.0-sun
java-gcj 1041 /usr/lib/jvm/java-gcj
La mettre par défaut :
$ sudo update-java-alternatives -s java-1.5.0-sun
Puis :
$ sudo vi /etc/jvm
Écrire tout en haut du fichier :
/usr/lib/jvm/java-1.5.0-sun
Trouver tous les fichiers modifiés récemment
To find files modified between the last x days and the last y days (x > y) in the current directory (x and y are integers) :
$ find ./ -ctime -x -ctime +y
Lancer un script au démarrage sur Ubuntu
Write a script and put it in the /etc/init.d/ directory.
Lets say you called it FOO. You then run :
$ sudo update-rc.d FOO defaults
You also have to make the file you created, FOO, executable, using
$ sudo chmod +x FOO
You can check out :
$ sudo man update-rc.d
... for more information. It is a Debian utility to install scripts.
The option "defaults" puts a link to start FOO in run levels 2, 3, 4 and 5. (and puts a link to stop FOO into 0, 1 and 6.)
Downgrader un package sous Ubuntu
On peut forcer la version d'un paquet à installer :
$ sudo aptitude install nomdupaquet=1.2.3-version2
Redirect HTTP -> HTTPS requests in a VirtualHost
<VirtualHost 100.101.102.103:80> ServerName subdomain.domain.tld DocumentRoot /path/to/docroot <IfModule mod_rewrite.c> RewriteEngine on RewriteLog /var/log/apache2/https_rewrite.log RewriteLogLevel 1 RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{SERVER_NAME} ^subdomain.domain.tld$ RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R] </IfModule> </VirtualHost> <VirtualHost 100.101.102.103:443> ServerName subdomain.domain.tld DocumentRoot /path/to/docroot SSLEngine On SSLCertificateFile /etc/apache2/ssl_conf/myservicename.crt SSLCertificateKeyFile /etc/apache2/ssl_conf/myservicename.key </VirtualHost>
Lister les process arboressentiels sous nunux
Au choix :
$ pstree
ou :
$ ps afx
Migrer un dépôt Subversion d'une machine à une autre
Sur l'ancienne machine :
$ svnadmin dump /var/lib/subversion/myproject > ~/myproject.svndump
$ scp ~/myproject.svndump new-server:
Sur la nouvelle machine :
$ svnadmin create /var/lib/subversion/myproject
$ svnadmin load /var/lib/subversion/myproject < ~/myproject.svndump
Via http://fashion.hosmoz.net/blog/post/2006/11/09/Migrer-un-depot-subversion
Compter le nombre de fichiers en fonction d'un pattern
$ ls -R /my/path/ | grep -v monpattern | wc -l
Dumper toutes les bases mysql et les réimporter
Dump :
$ mysqldump -uroot -p --all-databases --opt > export.sql
Reimport :
$ mysql -uroot -p < export.sql
Avec compression bz2 :
Export :
$ mysqldump -uroot -p --all-databases --opt | bzip2 > export.sql.bz2
Réimport :
$ bzcat export.sql.bz2 | mysql -uroot -p
Changer le nom d'une machine
En admettant que l'on veuille renommer la machine "anciennom" par "nouveaunom" :
$ sudo hostname nouveaunom
Puis remplacer anciennom par nouveaunom dans les fichiers /etc/hostname et /etc/hosts
Exporter et réimporter la liste des paquets installés
Genre pour reproduire la config d'un ancien serveur vers un nouveau serveur.
Export :
$ sudo dpkg --get-selections > selections.txt
Réimportation :
$ sudo dpkg --set-selections < selections.txt
Réinstallation des paquets :
$ sudo apt-get dselect-upgrade
Mirrorer un répertoire d'une machine à une autre via SSH
Pour synchroniser un répertoire d'une machine A vers une machine B en passant par SSH (avec preservation des droits) :
$ rsync -avz -e ssh someuser@server1.example.com:/var/www/ /var/www/
Utile également pour migrer une machine vers une autre.
