Catégorie : linux

Comment transférer des fichiers très rapidement entre deux PCs distants ?

Petite astuce très pratique : vous voulez transférer des fichiers d’un PC à un autre, sans forcément partager le répertoire, vous faire suer avec les problèmes de droits, etc. ?

Rien de plus simple, lancez un serveur local Python qui servira les fichiers de manière statique :

  • Python 2 : python -m SimpleHTTPServer
  • Python 3 : python3 -m http.server

Et à distance, tapez l’URL du PC sur lequel tourne le serveur, et hop, vous pouvez récupérer ce que vous voulez !

Exemple de python webserver
Exemple de python webserver

Windows : les loopbacks. Impossible à surveiller

Si jamais vous faites un site Internet, que vous le mettez sur localhost et que vous lancez un navigateur, il se peut que, comme moi, vous ayez envie de voir exactement ce qui se passe.

Dans ce cadre, un « espion » parfait pour cela est wireshark (analyseur de trames réseau).

Après plusieurs minutes, voire heures, vous verrez que quelles que soient vos actions, rien ne se passe.
L’explication est simple : Windows, peu importe sa version, « coupe » les arrivées réseau si elles sont en loopback = sur localhost.

Un grand merci, encore une fois, pour Windows !

Toute l’explication est là.

Il faut utiliser un outil, RawCap, qui hacke un peu Windows et génère un fichier « .pcap » compatible avec Wireshark.

Sur Linux, vous n’aurez pas ce problème typique Windows

En ligne de commande, on peut faire le dump de tout le traffic, y compris le localhost.
Il vous suffit d’utiliser l’utilitaire tcpdump, exemple :

$
$ sudo tcpdump -vv -i lo port 8000
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes

Et à partir de là il écoutera sur le port 8000. Lancez Chrome, allez sur localhost:8000 et là vous verrez :

(pour la note, même s’il n’y a pas de serveur, ce qui est le cas ici, il écoute et trace vraiment tout)

17:23:14.100160 IP6 (flowlabel 0x52956, hlim 64, next-header TCP (6) payload length: 40) ip6-localhost.44238 > ip6-localhost.8000: Flags [S], cksum 0x0030 (incorrect -> 0xfe61), seq 1512481496, win 43690, options [mss 65476,sackOK,TS val 3860198845 ecr 0,nop,wscale 7], length 0
17:23:14.100165 IP6 (flowlabel 0xe143c, hlim 64, next-header TCP (6) payload length: 20) ip6-localhost.8000 > ip6-localhost.44238: Flags [R.], cksum 0x001c (incorrect -> 0xe6c0), seq 0, ack 1512481497, win 0, length 0
17:23:14.100189 IP (tos 0x0, ttl 64, id 63584, offset 0, flags [DF], proto TCP (6), length 60)
localhost.43918 > localhost.8000: Flags [S], cksum 0xfe30 (incorrect -> 0x631e), seq 4099830766, win 43690, options [mss 65495,sackOK,TS val 1743693574 ecr 0,nop,wscale 7], length 0
17:23:14.100194 IP (tos 0x0, ttl 64, id 12132, offset 0, flags [DF], proto TCP (6), length 40)
localhost.8000 > localhost.43918: Flags [R.], cksum 0x7eb1 (correct), seq 0, ack 4099830767, win 0, length 0
17:23:14.153839 IP6 (flowlabel 0xc30e0, hlim 64, next-header TCP (6) payload length: 40) ip6-localhost.44242 > ip6-localhost.8000: Flags [S], cksum 0x0030 (incorrect -> 0xaa17), seq 1123880506, win 43690, options [mss 65476,sackOK,TS val 3860198859 ecr 0,nop,wscale 7], length 0
17:23:14.153847 IP6 (flowlabel 0xee9c9, hlim 64, next-header TCP (6) payload length: 20) ip6-localhost.8000 > ip6-localhost.44242: Flags [R.], cksum 0x001c (incorrect -> 0x9284), seq 0, ack 1123880507, win 0, length 0
17:23:14.153884 IP (tos 0x0, ttl 64, id 20755, offset 0, flags [DF], proto TCP (6), length 60)
localhost.43922 > localhost.8000: Flags [S], cksum 0xfe30 (incorrect -> 0x1c4e), seq 3564886671, win 43690, options [mss 65495,sackOK,TS val 1743693588 ecr 0,nop,wscale 7], length 0
17:23:14.153891 IP (tos 0x0, ttl 64, id 12140, offset 0, flags [DF], proto TCP (6), length 40)
localhost.8000 > localhost.43922: Flags [R.], cksum 0x37ef (correct), seq 0, ack 3564886672, win 0, length 0
17:23:19.161265 IP6 (flowlabel 0x606b8, hlim 64, next-header TCP (6) payload length: 40) ip6-localhost.44246 > ip6-localhost.8000: Flags [S], cksum 0x0030 (incorrect -> 0x1e75), seq 983670096, win 43690, options [mss 65476,sackOK,TS val 3860200111 ecr 0,nop,wscale 7], length 0
17:23:19.161281 IP6 (flowlabel 0xe0662, hlim 64, next-header TCP (6) payload length: 20) ip6-localhost.8000 > ip6-localhost.44246: Flags [R.], cksum 0x001c (incorrect -> 0x0bc6), seq 0, ack 983670097, win 0, length 0
17:23:19.161360 IP (tos 0x0, ttl 64, id 18581, offset 0, flags [DF], proto TCP (6), length 60)
localhost.43926 > localhost.8000: Flags [S], cksum 0xfe30 (incorrect -> 0xe872), seq 99211285, win 43690, options [mss 65495,sackOK,TS val 1743694840 ecr 0,nop,wscale 7], length 0
17:23:19.161372 IP (tos 0x0, ttl 64, id 13102, offset 0, flags [DF], proto TCP (6), length 40)
localhost.8000 > localhost.43926: Flags [R.], cksum 0x08f8 (correct), seq 0, ack 99211286, win 0, length 0

Linux bc : float / flottants

Plein de personnes utilisent « calc » sous Windows. C’est bien.
Mais, comme la plupart des outils Windows : Linux c’est 20x moins ergonomique, mais 20x puissant.

Bah comme Linux en général, en fait…

Let me introduce bc.

C’est le « calc » de Windows, mais en plus laid et en 20 x plus puissant que la calculatrice Windows (déjà dit).

Le seul truc bizarre de bc c’est qu’il ne fait que des calculs en entier.
En bref : bc -l et hop tout est en flottant et fonctionne.
To make a long story short: bc -l and everything is ok.

Mint et Ubuntu : une vitesse de clavier bien plus rapide que Windows

La vitesse de répétition du clavier est liée non pas au hardware (comme je l’ai cru pendant des années), mais au software, donc au système d’exploitation.

Mon ami Windows (« ami »… vous sentez l’ironie ?), qui est fait principalement pour les personnes qui pensent (à tort) qu’on est plus rapide avec une souris qu’avec un clavier, propose un délai avant de répéter les touches très long, même au minimum, et une vitesse de répétition plutôt lente, pour des personnes comme moi qui aiment aller vite.

Mon vrai ami Linux, lui, permet d’aller extrêmement vite, et c’est génial. Bon ok, il permet d’aller si vite qu’on peut faire des petites blagounettes à son camarade de classe. Alors Ubuntu a eu l’idée complètement débile (et je reste poli) de copier Windows et de limiter la vitesse de répétition, et le délai, à des temps très longs, qui se rapprochent de ceux de Windows.

Pourquoi brider tout cela ? Quel est l’intérêt de limiter sa voiture à 50km/h si elle peut aller à 200km/h (et que les autoroutes ne sont pas limitées !).

La solution : après avoir demandé ici sur stackoverflow, voici la réponse, je vous la mets en français : ouvrez un terminal et copiez-collez ce code :

Si vous êtes sur Linux en général

gsettings set org.gnome.settings-daemon.peripherals.keyboard repeat-interval 20

gsettings set org.gnome.settings-daemon.peripherals.keyboard delay 140

Si vous êtes sur Mint ou sur Ubuntu, autre solution

gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20

gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 140

Et voilà. C’est le genre de choses, quand j’ai fini de coder toute la journée, et que je reviens sur Windows pour jouer un peu, qui fait que si je dois faire autre chose que jouer, je me mets à détester Windows et rebooter rien que pour écrire mes mails (au final je reste sur Mint parce que je ne vais pas re-rebooter pour rejouer…).

Linux / shell

Shell hints / aide

Commandes « one-line »

Connaître l’architecture de sa machine dpkg --print-architecture
Chercher les fichiers qui prennent de la place ncdu
Archiver au format :

  • tar.bz2
  • %Y.%m.%d-%Hh%Mm%Ss
tar -cjf "$(date '+%Y.%m.%d-%Hh%Mm%Ss').x.tar.bz2" htdocs/*
Archiver au format :

  • tar.gz
  • %Y.%m.%d-%Hh%Mm%Ss
tar -czf "$(date '+%Y.%m.%d-%Hh%Mm%Ss').x.tar.gz" htdocs/*

Redirection de la sortie

stderr vers stdout command 2>&1
stdout vers un fichier et stderr vers un autre command > out > 2>error
stderr vers stdout (&1) puis stdout vers un fichier command >out 2>&1
stderr vers stdout (&1) puis stdout ajouter un texte et l’afficher, sans problème de buffering (seule solution trouvée qui fonctionne chez moi) echo "bonjour" 2>&1 | awk -W interactive '{ print "Site SokoBan > "$0; fflush(stdout); }'
Tout rediriger vers un fichier Exemple court :
echo "test" &> /dev/null

Exemple long :
(psql -U xx -W -h xx -d my_base -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO public; GRANT ALL ON SCHEMA public TO my_base;" &> /dev/null) && (time (pg_restore -Fc -j 16 -d my_base my_sql_file.sql &> /dev/null))

Nettoyage de disque

Comment supprimer ses vieux noyaux (= Mint, Ubuntu etc.)
Oui c’est aussi simple que ça !
sudo purge-old-kernels

pip (= pip3)

Mettre tous les packages pour une version spécifique de python (ici 3.7) sudo -H LD_LIBRARY_PATH=/usr/local/lib /usr/local/bin/python3.7 -m pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | sudo -H LD_LIBRARY_PATH=/usr/local/lib xargs -n1 /usr/local/bin/python3.7 -m pip install -U
Vider le cache complet des packages puis enchainer une mise à jour des packages
sudo rm /var/cache/apt/*.bin && sudo rm -rf /var/lib/apt/lists/* && sudo apt-get clean && sudo apt-get update && sudo apt-get upgrade -y
Ignorer pour toujours une mise à jour d’un packet (ex ici, avec Python2.7 qui n’est plus maintenu)
sudo apt-mark hold libpython2.7
Mettre à jour tous les packages puis arrêter l’ordinateur
(c’est le shutdown -h now que
j’ai longtemps cherché, sudo halt » et autres ne fonctionnent pas

sudo apt-get update && sudo apt-get upgrade -y && shutdown -h now

copy/paste vim (trailing whitespaces!)

Solution au problème : quand on copie colle sous vim avec la souris
et qu’il ajoute plein d’espaces à la fin
Note : le -b signifie « CLIPBOARD »
c’est ce qui change tout !
xsel -b -o | sed 's/[ \t]*$//' | xsel -b
Sous Mint :
– aller dans les raccourcis claviers ;
– ajouter un nouveau personnalisé ;
– ce dernier doit lancer un script séparé
mais dans un terminal = gnome-terminal -e
(sinon le code seul, en direct, ne fonctionne pas)
gnome-terminal -e /xxx/trim.copy.paste.sh

et dans le fichier trim.copy.paste.sh :

#!/bin/bash
# -b = clipboard (= selection with mouse)
xsel -b -o | sed 's/[ \t]*$//' | xsel -b
# try both:
xsel -o | sed 's/[ \t]*$//' | xsel

https

Regénérer avec acme.sh : root@inyab2:~# acme.sh --renew -d hqf.fr
Pour génerer le https, avec création de tous les certificats + mise en place des renouvellements, utiliser certbot : root@inyab:~/certbot# ./certbot-auto
Déplacer certbot dans le dossier de letsencrypt pour être plus homogène : cd /etc/letsencrypt && mv ~/certbot .
S’il y a des problèmes d’accents, ordre shell pour tout chercher : grep -r -P '[^\x00-\x7f]' /etc/apache2 /etc/letsencrypt /etc/nginx
Renouvellement automatique : cd /etc/letsencrypt/certbot && ./certbot-auto renew
Si jamais ça ne fonctionne pas, mettre toute la configuration en commentaire, puis demander à générer un certificat : cd /etc/letsencrypt/certbot && ./certbot-auto --nginx -d www.monsite.com
Autre option : faire son dossier à la main, s’assurer que nginx peut y accéder (= faire un fichier manuellement et l’ouvrir via le navigateur), et lancer certbot en précisant où déposer les certificats. cd /etc/letsencrypt/certbot && ./certbot-auto certonly -d www.ergofip.com,ergofip.com,configurateur.ergofip.com -w /web/htdocs/ergofip/htdocs/ergofip/

Changer le prompt

J’ai vu plein de choses, de discussions un peu partout, mais celle qui a fonctionné le mieux 100% sans fautes est ici, et je résume dans ce qui suit.
Séquence de caractères « non-visibles » = qu’on veut cacher, entourée par \[ et \] \[ code \]
Dans cette séquence de caractères « non-visibles », ajouter le code d’échappement qui précise qu’on veut mettre une couleur \033[X;YYm, et remplacer :
X par 0 (foncé) ou 1 (= plus clair)
YY par un code couleur
\[\033[X;YYm\]
Black \[\033[0;30m\]
Blue \[\033[0;34m\]
Brown \[\033[0;33m\]
Cyan \[\033[0;36m\]
Green \[\033[0;32m\]
Purple \[\033[0;35m\]
Red \[\033[0;31m\]
Finir par « reset à la couleur de base » \[\033[0m\]
Exemple de prompt qui affiche toutes les couleurs et qui termine par un reset à la couleur du prompt :
export PS1="\[\033[0;30m\]Black\[\033[0;34m\]Blue\[\033[0;33m\]Brown\[\033[0;36m\]Cyan\[\033[0;32m\]Green\[\033[0;35m\]Purple\[\033[0;31m\]Red\[\033[1;30m\]Black\[\033[1;34m\]Blue\[\033[1;33m\]Brown\[\033[1;36m\]Cyan\[\033[1;32m\]Green\[\033[1;35m\]Purple\[\033[1;31m\]Red\[\033[0m\]"

Déclaration de script

Shebang le meilleur
Merci stackoverflow
#!/usr/bin/env bash
La calculette version Linux = 10 fois plus puissante, ne pas oublier l'option "l" pour calculer avec des virgules (man bc) bc -l

Outils de capture d'écran

  • scrot = capture en ligne de commande
  • shutter meilleur que celui par défaut
sudo apt-get install scrot
sudo apt-get install shutter
Note : pour mettre shutter par défaut, lire la documentation ici.

Notifications scriptées sous gnome

Comment envoyer un message sous gnome (= Mint, Ubuntu etc.) #!/bin/bash
date=`(date '+%Y.%m.%d-%Hh%Mm%Ss')`
notify-send "$date: Bonjour !" "Tout le monde !"

Linux : ajouter un client sftp et le chrooter

UPDATE : voici le lien (merci Hervé !) que j’aurais dû lire avant de faire tout cela…
A vous de lire mon blog + celui qui suit et de prendre le meilleur de chacun pour aller au plus vite !

Restrict SSH User Access to Certain Directory Using Chrooted Jail


Voici ce qu’il faut savoir (et qui m’a pris le plus de temps) : pour chrooter vraiment un utilisateur, il faut lui mettre les ordres de commande minimales requises dans un dossier bin et l’autre dossier qui gère les entrées-sorties dev. Et puis ajouter configurer le serveur ssh pour préciser « que du sftp, pas de ssh ». Ce n’est presque jamais documenté dans les sites d’exemples que vous trouverez sur le Web, merci unix.stackexchange !

Dans mon cas, voici tous les ordres que j’ai faits, et qui font qu’au final tout a fonctionné. Si ça se trouve il y en a un ou deux qui sont inutiles… mais je n’ai pas le temps de tout parfaitement nettoyer, je vous dis ce que j’ai compris des ordres, à ma manière :

  • Installer une ligne de commande shell qui peut fonctionner sans aucune dépendance :
    apt-get install bash-static
  • Ajouter l’utilisateur thomas en précisant le nom du shell à lancer :
    useradd -m -c /home/thomas -s /home/thomas/bin/sh thomas
  • Changer son mot de passe :
    passwd thomas
  • S’assurer que le home de Thomas appartient bien à root et est en 755 (sinon ssh refuse la connexion) :
    chmod 755 /home/thomas ; chown root: /home/thomas
  • Créer les dossiers bin et dev :
    mkdir /home/thomas/bin
    mkdir /home/thomas/dev
    cp /bin/bash-static /home/thomas/bin/sh
  • Ensuite il faut copier puis exécuter ce code, mais je ne sais pas trop à quoi ça sert :
    cp /dev/MAKEDEV /home/thomas/dev/
    cd /home/thomas/dev/ && ./MAKEDEV
  • Enfin le plus important : configurer le serveur sshd
    vim /etc/ssh/sshd_config

    Et y ajouter ces lignes, qui précisent où chrooter et (surtout) qu’on n’autorise que le sftp :

    Match user thomas
        ChrootDirectory /home/%u
        AllowTCPForwarding no
        X11Forwarding no
        ForceCommand internal-sftp

C’est le tout dernier ordre, toute dernière ligne qui m’a fait perdre énormément de temps !

Steam : comment créer un serveur de cache local

Toute l’explication est ici, simple et claire, en anglais.

Mais je vais résumer l’idée au cas où vous ne seriez pas forcément tenté de tout lire : lorsque vous installez un jeu, le programme Steam (que j’appellerai dorénavant simplement « Steam » parce que je suis fainéant) va demander au serveur Steam de distribution de contenu le plus proche. Et ça n’est pas forcément toujours le plus proche, ce qui fait que cela risque d’être long, mais surtout, vous serez toujours limité à la vitesse de votre connexion Internet. Ici, l’article explique comment faire la demande de votre Steam en priorité à un serveur Nginx local qui servira de cache : si ce dernier n’a pas le jeu en cache, il va aller faire suivre la demande de manière classique. Bien évidemment, si vous êtes comme moi et que vous possédez plus de 500 jeux sur Steam – oui, 500, certaines personnes croient que je mens… – il vous faudra un disque de plus de un terra pour qu’il garde la plupart des jeux en cache (oui oui, vous voulez quelques exemples de jeux lourds ? Je vous en donne après), mais cela dit à chaque fois que vous voudrez réinstaller un jeu, ou si vous achetez un nouvel ordinateur portable, ou vos amis arrivent avec leur portable chez vous et vous voulez leur faire installer, tester ou éventuellement acheter un jeu sur steam dans tous les cas c’est génial. Lisez l’article ici :

how-to-build-a-local-steam-cache-server

Quelques jeux qu’il est très bon d’avoir en cache :

  1. Viking: battle for Asgard: 5Go
  2. Ys VI: The Ark of Napishtim: 3Go
  3. Styx: Master of Shadows: 7Go
  4. Stronghold Crusader 2: 3Go
  5. Risen 2 – Dark Waters: 8Go
  6. Resident Evil 4 / Biohazard 4: 12Go
  7. Rayman Origins: 2Go
  8. Project Cars: 22Go
  9. Pap & Yo: 2Go
  10. Outlast: 4Go
  11. Ori and the Blind Forest: Definitive Edition: 11Go
  12. Operation Flashpoint: Dragon Rising: 5Go
  13. Operation Flashpoint: Red River: 5Go
  14. Oddworld: new ‘n’ tasty: 8Go

J’arrête là, on en est déjà à plus de 100Go pour 13 jeux, imaginez pour plus de 500 jeux… ils ne font pas tous plus de 2Go, heureusement !

Varnish 4.x : comment faire un redirect

Après avoir passé plusieurs heures sans aucune réponse satisfaisante, j’ai enfin trouvé la solution du redirect.
Varnish n’a pas la possibilité de faire un redirect « simplement », il faut normalement laisser cela au « backend », c’est à dire au serveur derrière (Apache ou autre).
Mais moi je ne voulais pas. C’est mon droit non ?
Voici comment faire un redirect qui fonctionne :

sub vcl_recv {
    # Rediriger tous les ".fr" vers ".com"
    if (
        (req.http.host ~ "(.*)monsite\.fr$")
    ) {
        # ! error = envoyer vers la sous-routine "vcl_error"
        set req.http.x-redir = "http://www.bb.com" + req.url;
        return(synth(850, "Moved permanently"));
    }
}

L’astuce principale était : utiliser vcl_synth

D’après le code, je vous résume ce que j’ai compris : si jamais on a un status 850 qui semble être un ordre particulier, alors automatiquement changer les headers en y appliquant la redirection, et les renvoyer directement le résultat.
Donc, après la routine vcl_recv il vous suffit d’ajouter vcl_synth comme ceci :

sub vcl_synth {
    if (resp.status == 850) {
        set resp.http.Location = req.http.x-redir;
        set resp.status = 302;
        return (deliver);
    }
}

vim – astuces

Vim

Séparation par fenêtres

:split Split horizontal
:vsplit Split vertical
:res XX Hauteur fenêtre = XX lignes
:vertical resize XX Largeur fenêtre courante = XX caractères
:30winc > Vertical : 30 caractères à droite
:30winc < Vertical : 30 caractères à gauche
:30winc + Horizontal : 30 caractères à droite
:30winc - Horizontal : 30 caractères à gauche
30[CTRL]W > Décaler de 30 caractères à droite
30[CTRL]W < Décaler de 30 caractères à gauche

Macros

:%s/\%(^ *\)\@<= /\&nbsp;/g Remplacer tous les espaces de début par &nbsp;