994 private links
Apprends les permissions Linux de façon interactive !
Permissions Unix
Hérité d'Unix 1969, ce système de permissions protège chaque fichier et répertoire sur tous les systèmes POSIX, comme Linux.
There is a distinct, visceral kind of pain in watching an otherwise brilliant engineer hold down the Backspace key for six continuous seconds to fix a typo at the beginning of a line.
We’ve all been there. We learn
ls,cd, andgrep, and then we sort of… stop. The terminal becomes a place we live in-but we rarely bother to arrange the furniture. We accept that certain tasks take forty keystrokes, completely unaware that the shell authors solved our exact frustration sometime in 1989.Here are some tricks that aren’t exactly secret, but aren’t always taught either. To keep the peace in our extended Unix family, I’ve split these into two camps: the universal tricks that work on almost any POSIX-ish shell (like
shon FreeBSD orkshon OpenBSD), and the quality-of-life additions specific to interactive shells like Bash or Zsh.
Primtux sur le Web !
Why Fleet
Fleet is an open-source device management platform for Linux, macOS, Windows, Chromebooks, and iOS devices (BYOD or corporate owned.)
What's it for?
Managing computers today is getting harder. You have to juggle a mix of operating systems and devices, with a bunch of middleman vendors in between.
Fleet makes things easier by giving you a single system to secure and maintain all your computing devices over the air. You can do MDM, patch stuff, and verify anything—all from one system. It's like having a universal remote control for all your organization's computers.
Fleet is open source, and free features will always be free.
Pour un article qui sortira peut-être sur papier (je croise les doigts), j’avais besoin de tester différents types d’OS à installer sur un Raspberry Pi Zero 2 W.
Comme je ne connaissais ni Alpine, ni les spécificités du Pi Zero 2 W, je suis tombé sur pas mal de trucs que je ne connaissais pas.
Même si au final, l’article papier ne traite pas d’installation d’Alpine Linux (ni même ne l’utilise), je me suis dit que c’était dommage de ne pas publier cette expérience Alpine + RPi Zero, donc la voici.
Raising Notifications From Terminal
When executing long-running jobs in the terminal, it's useful to get notified when they complete so you can do other things while waiting. Here are a few ways to achieve this.
Using notify-send (Linux)
The simplest approach is to chain your command with
notify-send:slow-job; notify-send "done"If You Already Started the Job
If you've already started a long-running job and forgot to add a notification, you can still do it:
- Press
Ctrl-Zto suspend the job and put it in the background- Run
fg; notify-send "done"The job will resume in the foreground, and you'll get notified when it finishes.
One Explorer. All Your Files.
Unify files from all your devices and clouds into a single, easy-to-use explorer.
Designed for creators, hoarders and the painfully disorganized.
In this article, I will discuss the steps that I took to successfully create a new MIME type association in Ubuntu 20.04 that would match any files that end with the '*.kdenlive' file extension. This article complements a related topic, Adding A Custom 'Open With' Program In Ubuntu 20.04.
Some notes on setting up an
apt-cacher-ngbased cache server for Debian apt packages in my home operations ("homeops") context, including a section on using SSL/TLS origin servers.
TL;DR:
linux /casper/vmlinuz boot=casper automatic-ubiquity url=http://192.168.X.X/preseed.cfg _iso-scan/filename=${isopath} quiet splash noprompt --
#!/usr/bin/env bash
# Run this script on a debian compatible distro
# Needed installs: xorriso isolinux
# Licence: GNU GPL 3
# Script Setup
set -e # Exit script on any error
print_heading() {
printf "\n\n"
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
echo $1
printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' "="
printf "\n\n"
}
# Variable Setup ####################################################################################################################################
ISO_TORRENT_URL="https://linuxmint.com/torrents/linuxmint-20.3-cinnamon-64bit.iso.torrent"
ISO_CHECKSUM_URL="https://ftp.heanet.ie/mirrors/linuxmint.com/stable/20.3/sha256sum.txt"
ISO_CHECKSUM_SIGNATURE_URL="$ISO_CHECKSUM_URL.gpg"
SIGNING_KEY="27DEB15644C6B3CF3BD7D291300F846BA25BAE09"
PRESEED_TEMPLATE_FILE="preseed_template.cfg"
PRESEED_FILE="preseed.cfg"
CREDENTIALS_FILE="credentials.env"
ISO_NAME="ISO"
# Internal variables ################################################################################################################################
ISO_FILE=$(basename "$ISO_TORRENT_URL" | rev | cut -c 9- | rev)
ISO_WORKDIR="isofiles"
# Download ISO FILE #################################################################################################################################
download_iso() {
print_heading "Downloading ISO File"
aria2c --follow-torrent=mem --rpc-save-upload-metadata=false --check-integrity --seed-time=0 --summary-interval=60 $ISO_TORRENT_URL
}
# Validate ISO File #################################################################################################################################
validate_iso(){
print_heading "Validating ISO File"
ISO_CHECKSUM_FILE="$(basename $ISO_CHECKSUM_URL)"
ISO_CHECKSUM_SIGNATURE_FILE="$(basename $ISO_CHECKSUM_URL).gpg"
wget -nc $ISO_CHECKSUM_URL
wget -nc $ISO_CHECKSUM_SIGNATURE_URL
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key $SIGNING_KEY
gpg --verify $ISO_CHECKSUM_SIGNATURE_FILE $ISO_CHECKSUM_FILE
sha256sum --ignore-missing -c $ISO_CHECKSUM_FILE
rm -f $ISO_CHECKSUM_FILE
rm -f $ISO_CHECKSUM_SIGNATURE_FILE
}
# Unpack ISO ########################################################################################################################################
unpack_iso() {
print_heading "Unpacking ISO"
rm -rf $ISO_WORKDIR
7z x $ISO_FILE -o$ISO_WORKDIR
}
# Add Preseed File to ISO ###########################################################################################################################
add_preseed_file_to_iso() {
print_heading "Adding Preseed File to ISO"
set -a
source $CREDENTIALS_FILE
envsubst < $PRESEED_TEMPLATE_FILE > $ISO_WORKDIR/preseed/auto.seed
set -a
}
# Configure Boot Options ############################################################################################################################
configure_boot_options() {
print_heading "Configuring ISO Boot Options"
tee -a $ISO_WORKDIR/boot/grub/grub.cfg <<- "EOF"
menuentry "Auto Install" --class linuxmint {
set gfxpayload=keep
linux /casper/vmlinuz file=/cdrom/preseed/auto.seed automatic-ubiquity boot=casper iso-scan/filename=${iso_path} quiet splash --
initrd /casper/initrd.lz
}
set default=4
set timeout=5
EOF
}
# Recompile ISO #####################################################################################################################################
recompile_iso() {
print_heading "Recompiling ISO"
rm -f "$ISO_NAME.iso"
dd if=$ISO_FILE bs=1 count=432 of=isohdpfx.bin
xorriso -as mkisofs \
-r -V "$ISO_NAME" \
-o "$ISO_NAME.iso" \
-J -joliet-long \
-cache-inodes \
-isohybrid-mbr isohdpfx.bin \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-boot-load-size 4 -boot-info-table -no-emul-boot \
-eltorito-alt-boot \
-e boot/grub/efi.img \
-no-emul-boot \
-isohybrid-gpt-basdat \
-isohybrid-apm-hfsplus \
"$ISO_WORKDIR"
rm isohdpfx.bin
}
# Cleanup ###########################################################################################################################################
cleanup() {
print_heading "Cleaning Up"
rm -rf $ISO_WORKDIR
echo "Done"
}
# download_iso
# validate_iso
unpack_iso
add_preseed_file_to_iso
configure_boot_options
recompile_iso
cleanupVous avez une tablette Android ou iOS, un ordinateur sous Linux, Windows, MacOS ? Même un vieux modèle ? Ne jetez pas ! Pourquoi ne pas les utiliser comme second écran ?
Il y a quelques jours, je posais une question sur la tribune de LinuxFR, et Bubar, sans répondre à ma question directement, s'est lancé dans l'aventure du streaming de jeux sur ses machines, et en a fait un journal. J'ai dit que j'écrirais un journal en réponse, avec des solutions plus simples pour les utilisateurs. Dont acte.
On m'a demandé dernièrement d'installer Primtux sur 2 "anciens" ordinateurs portables fournis par la région Occitanie/Languedoc-Roussillon aux lycéens. Autant il n'y a eu aucun problème sur le modèle le plus ancien mais ça n'a pas du tout été le cas pour le plus récent qui est un modèle HP Probook x360 11 G1 EE avec écran tactile.
En effet, impossible de booter directement sur mes clés USB habituelles sous Easy2Boot ou Ventoy ! Ceci est dû à un sale tour de HP/Microsoft empêchant le démarrage à partir du booloader GRUB que l'on trouve dans beaucoup de distributions GNU/Linux. Qu'à cela ne tienne car il est possible de contourner cet obstacle. Comme quoi même en compliquant la vie des simples utilisateur⋅rices, il existe souvent une solution de contournement aux blocages des constructeurs (mais c'est vrai que ça complique quand même les choses). En tout cas, cela conforte mon idée d'éviter d'acheter du HP et du Microsoft.
Sources :
Deskflow is a free and open source keyboard and mouse sharing app. Use the keyboard, mouse, or trackpad of one computer to control nearby computers, and work seamlessly between them. It's like a software KVM (but without the video). TLS encryption is enabled by default. Wayland is supported. Clipboard sharing is supported.
Mopria facilite l’impression et le scan
Pour rechercher les produits certifiés Mopria par marque, cliquez sur le logo du fabricant ou utilisez la boîte de recherche du fabricant ci-dessous.
[Via SebSauvage]
An archive of useful Linux commands shared in Self-Host Weekly
Watchtower est un outil qui surveille vos conteneurs Docker et les met à jour automatiquement.
Ce script permet de :
- Identifier les LXC en ligne qui contiennent Docker.
- Trouver les fichiers
docker-compose.ymlde Watchtower.- Voir et modifier les options essentielles de Watchtower.
- Redémarrer automatiquement les containers après modification.
Le script est adapté pour des LXC dont le répertoire Watchtower se trouve dans
/rootou un sous-répertoire de/root.
TL;DR:
#!/bin/bash
# Gestion complète de Watchtower dans LXC
MENU="
===============================================
Gestion de Watchtower dans les conteneurs LXC
===============================================
[1] 🔍 Voir l’état actuel de Watchtower
[2] 🚀 Démarrer Watchtower
[3] 🛑 Arrêter Watchtower
[4] 🔁 Redémarrer Watchtower
[5] 📂 Voir le contenu modifiable du docker-compose.yml de Watchtower
[6] 🔄 Basculer restart policy (always ↔ none)
[7] ✏️ Modifier WATCHTOWER_NO_STARTUP_MESSAGE (true/false)
[8] ✏️ Modifier WATCHTOWER_CLEANUP (true/false)
[9] 📅 Modifier le schedule aléatoire (14h-20h, min multiples de 5)
[10] 📅 Fixer le même schedule pour tous (6 champs, Spring Cron)
[11] ✏️ Modifier WATCHTOWER_TIMEOUT
[Q] ❌ Quitter
"
# Obtenir les LXC en ligne avec Docker
get_running_docker_lxc() {
pct list | awk 'NR>1 && $2=="running"{print $1}' | while read lxc; do
if pct exec "$lxc" -- docker ps >/dev/null 2>&1; then
echo "$lxc"
fi
done
}
# Trouver docker-compose.yml de watchtower avec timeout (5s)
find_watchtower_compose() {
lxc_id=$1
timeout 5s pct exec "$lxc_id" -- find /root -type f -path "*/watchtower/docker-compose.yml" 2>/dev/null | head -n1
}
# Afficher état Watchtower
status_watchtower() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
echo "→ LXC $lxc_id"
if [ -n "$compose_file" ]; then
pct exec "$lxc_id" -- docker ps --filter name=watchtower
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Démarrer Watchtower
start_watchtower() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
dir=$(dirname "$compose_file")
pct exec "$lxc_id" -- sh -c "cd $dir && docker compose up -d"
echo "🚀 Watchtower démarré dans LXC $lxc_id"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Arrêter Watchtower
stop_watchtower() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
pct exec "$lxc_id" -- docker stop watchtower >/dev/null 2>&1
echo "🛑 Watchtower arrêté dans LXC $lxc_id"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Redémarrer Watchtower
restart_watchtower() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
dir=$(dirname "$compose_file")
pct exec "$lxc_id" -- sh -c "cd $dir && docker compose down && docker compose up -d"
echo "🔁 Watchtower redémarré dans LXC $lxc_id"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Voir le contenu modifiable du docker-compose.yml
view_compose() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
echo "→ LXC $lxc_id"
if [ -n "$compose_file" ]; then
pct exec "$lxc_id" -- sh -c "grep -E 'restart:|WATCHTOWER_NO_STARTUP_MESSAGE|WATCHTOWER_CLEANUP|WATCHTOWER_SCHEDULE|WATCHTOWER_TIMEOUT' $compose_file"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Modifier une clé dans docker-compose.yml et redémarrer
modify_key_restart() {
key=$1
new_value=$2
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
pct exec "$lxc_id" -- sed -i "s|^\s*-\s*$key=.*| - $key=$new_value|" "$compose_file"
dir=$(dirname "$compose_file")
pct exec "$lxc_id" -- sh -c "cd $dir && docker compose down && docker compose up -d"
echo "✅ $key mis à jour et Watchtower redémarré pour LXC $lxc_id"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Basculer restart policy
toggle_restart() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
current=$(pct exec "$lxc_id" -- grep "restart:" "$compose_file" | awk '{print $2}')
if [ "$current" = "always" ]; then new="none"; else new="always"; fi
pct exec "$lxc_id" -- sed -i "s/^restart:.*/restart: $new/" "$compose_file"
dir=$(dirname "$compose_file")
pct exec "$lxc_id" -- sh -c "cd $dir && docker compose down && docker compose up -d"
echo "🔄 Restart policy basculée et Watchtower redémarré dans LXC $lxc_id : $new"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Schedule aléatoire (14h-20h, minutes multiples de 5) pour chaque LXC
random_schedule() {
for lxc_id in $(get_running_docker_lxc); do
compose_file=$(find_watchtower_compose "$lxc_id")
if [ -n "$compose_file" ]; then
hour=$((RANDOM % 7 + 14))
minute=$((RANDOM % 12 * 5))
schedule="0 $minute $hour ? * 5"
pct exec "$lxc_id" -- sed -i "s|^\s*-\s*WATCHTOWER_SCHEDULE=.*| - WATCHTOWER_SCHEDULE=$schedule|" "$compose_file"
dir=$(dirname "$compose_file")
pct exec "$lxc_id" -- sh -c "cd $dir && docker compose down && docker compose up -d"
echo "✅ WATCHTOWER_SCHEDULE mis à jour et Watchtower redémarré pour LXC $lxc_id : $schedule"
else
echo "Pas de docker-compose.yml trouvé ou recherche expirée pour LXC $lxc_id."
fi
done
read -rp "Appuyez sur [Entrée] pour revenir au menu..."
}
# Schedule fixe pour tous (Spring cron, 6 champs)
fixed_schedule() {
read -rp "Entrez la valeur du schedule (ex: 0 0 16 ? * 5) : " schedule
modify_key_restart "WATCHTOWER_SCHEDULE" "$schedule"
}
# Menu principal
while true; do
clear
echo "$MENU"
read -rp "Votre choix : " choice
case $choice in
1) status_watchtower ;;
2) start_watchtower ;;
3) stop_watchtower ;;
4) restart_watchtower ;;
5) view_compose ;;
6) toggle_restart ;;
7) read -rp "Entrez true ou false pour WATCHTOWER_NO_STARTUP_MESSAGE : " val; modify_key_restart "WATCHTOWER_NO_STARTUP_MESSAGE" "$val" ;;
8) read -rp "Entrez true ou false pour WATCHTOWER_CLEANUP : " val; modify_key_restart "WATCHTOWER_CLEANUP" "$val" ;;
9) random_schedule ;;
10) fixed_schedule ;;
11) read -rp "Entrez la valeur pour WATCHTOWER_TIMEOUT (ex: 30s) : " val; modify_key_restart "WATCHTOWER_TIMEOUT" "$val" ;;
[Qq]) exit ;;
*) echo "Option invalide." ; read -rp "Appuyez sur [Entrée] pour continuer..." ;;
esac
doneFx is a CLI for JSON: it shows JSON interactively in your terminal, and lets you transform JSON with JavaScript. Fx is written in Go and uses goja as its embedded JavaScript engine.
nakeDeb est une distribution dérivée française (but could speak english) basée sur Debian et prévue pour délivrer une installation ultra-minimale vous permettant de profiter rapidement d'un système fonctionnel ou de l'utiliser en live léger de secours.
le nakedWiki vous permettra de prendre en main votre système rapidement.
vous disposez de plusieurs pages pour trouver votre bonheur :
- wiki fluxbox : prise en main de votre session par défaut
- wiki i3wm : découverte de votre session alternative
- wiki sway : découverte de votre session optionnelle
- wiki polybar : précisions sur l'outil polybar sur i3wm
- wiki CLI : les commandes sur Debian & les spécificités nakeDeb
- wiki KBD : piloter votre nakeDeb avec le clavier
European governments have been steadily moving away from reliance on foreign tech offerings, driven largely by concerns over data sovereignty and regulatory compliance.
Countries like Germany and Denmark have already taken steps to reduce their dependence on Microsoft and other foreign cloud providers, opting instead for open source alternatives that keep sensitive data within their borders.
And, recently, Austria has shown up as another player in this space. Last month, the Austrian Armed Forces completed a migration of 16,000 workstations from Microsoft Office to LibreOffice.