Dash est un super environnement d'exécution pour le sous-ensemble POSIX de Bash. Il est portable, hyper rapide, consomme moins de 1 Mo de RAM. Bref un très bon outil.
Par contre, la syntaxe de Bash / Dash est error-prone au possible. D'autant qu'en dehors des outils classiques d'unix (grep, sed, awk, wget/curl) il y a peu de lib qui soient utilisables.
Bref, pour faire de petites choses comme lancer sa JRE ou filtrer des fichiers why not, mais en dehors de ça, ça me fait toujours hésiter.
Et ce matin je découvre que Kotlin peut être utilisé en tant que langage de scripts. Il suffit d'avoir installé dans notre PATH l'utilitaire kscript
disponible ici et nous pouvons commencer à écrire ce genre de choses :
#!/usr/bin/env kscript
println("Hello, World!")
Ensuite un petits chmod u+x
sur notre fichier qui pourra se lancer en tapant :
./mon-script.kts
Et c'est super bien ça !
En une commande :
git commit --amend --date=now
Je fais trop de Git en ce moment (>_<)
J'ai eu le besoin de nettoyer des tonnes et des tonnes de features-branches non-mergées et abandonnées dans nos répos Git. J'ai donc écrit un petit script bash qui va lister toutes les branches dont l'âge dépasse le nombre de jours indiqués en paramètre.
Utilisation
# Va lister toutes les branches qui n'ont pas bougées depuis plus de 180 jours
$ git-unused-branches 180
Le script
#!/usr/bin/env bash
if [ "$1" == "" ]; then
echo "Usage: git-too-old-branches <NB_DAYS>"
echo ""
echo "( NB_DAYS The lower age limit filter of branches"
echo " to list"
echo ""
echo "Example"
echo " To list any branches which has not been"
echo " changed since 90 days use :"
echo " git-unused-branches 90"
exit 1
fi
NB_DAYS="${1}"
SECONDS_IN_DAY=86400
TODAY_EPOCH_TIME=$(date +"%s")
## List everything expect
## - Production branches
## - Renovate branches
## - HEAD (master)
list_branches() {
local branches
branches=$(git branch -r | grep -v -E "origin/HEAD|origin/production|origin/renovate" | sed "s/ //" | sort)
echo "${branches}"
}
filter_branch() {
local ageGap
local branch
local branchAge
local maxDays
branch="${1}"
branchAge=$(git log "$branch" -n 1 --format=%ct)
ageGap=$(((TODAY_EPOCH_TIME-branchAge)/SECONDS_IN_DAY))
if (( ${ageGap} > ${NB_DAYS} )); then
echo "$branch is [$ageGap] days old"
fi
}
main() {
local branches
branches=$(list_branches)
for branch in ${branches}
do
filter_branch "${branch}"
done
}
main
En espérant que ça puisse aider certains :P
En deux temps :
1) Installez le paquet webp :
sudo apt install webp
2) Ajoutez ce script à votre PATH (il parcourt récursivement une arborescence à la recherche de fichier .webp
pour les convertir en .png
en supprimant le .webp
d'origine) :
#!/usr/bin/env bash
webp_to_png() {
local files fileName
files=$(find . -name "*.webp")
for file in ${files}
do
if [[ "${file}" == *.webp ]]; then
fileName="${file/webp/png}"
dwebp "${file}" -o "${fileName}"
rm "${file}"
fi
done
}
webp_to_png
Supprimer tous les bloatwares des constructeurs Android. Mon OnePlus va y passer est certain !!
La commande est tellement simple : time mon-script.sh
.
Ça marche aussi avec une commande du type time mvn clean install
.
Bref c'est merveilleux.
Cassandra se démarre de deux manières ./bin/cassandra
ou ./bin/cassandra -p
.
Mieux vaut toujours prendre la seconde façon ! Celle-ci va générer un fichier PID et pour éteindre l'instance il suffira d'exécuter la commande
kill `cat <pidfile>`
rm <pidfile>
N.B : aussi bizarre que ça puisse paraître, le script ./bin/stop-server
est à éditer après l'installation et vous devez y choisir la manière avec laquelle vous éteindrez votre instance de Cassandra en fonction de celle utilisée pour la démarrer.
Je copie colle ici :
#!/usr/bin/env bash
set -o errexit
# Author: David Underhill
# Script to permanently delete files/folders from your git repository. To use
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-remove-history path1 path2
#
# retrieved from: http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
#
if [ $# -eq 0 ]; then
exit 0are still
fi
# make sure we're at the root of git repo
if [ ! -d .git ]; then
echo "Error: must run this script from the root of a git repository"
exit 1
fi
# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD
# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
Pour @Animal et @Lenny.
Rappel
Maven Wrapper est un petit script à positionner à la racine de votre projet et qui vous permettra :
- De définir la bonne version de Maven avec laquelle vous pouvez builder votre projet.
- De récupérer automatiquement cette version
Problème
Pour exécuter vos commandes de build, il ne faut plus taper
mvn clean install
mais
./mvnw clean install
Inconvénients :
- Le "./" a ajouter devant la commande est fastidieux.
- Si vous êtes dans un sous-module, vous devrez faire un "../mvnw clean install" et cela fait perdre du temps.
Solution
Elle est en trois phases :
-
Installer une version de Maven dans votre poste
- Sans l'ajouter à votre PATH
- Mais en créant la variable MAVEN_HOME
-
Ajouter le script suivant dans votre .bashrc
_build_mvnw_dir() {
echo "$1/mvnw"
}
_find_mvnw() {
currentDir=`pwd`
while [ "$currentDir" != "" ]; do
isMvnwDir=`_is_mvnw_dir "$currentDir"`
if [ "$isMvnwDir" == "true" ]; then
break
else
currentDir=`_get_parent_dir "$currentDir"`
fi
done
if [ "$currentDir" == "" ]; then
echo ""
else
_build_mvnw_dir "$currentDir"
fi
}
_get_parent_dir() {
echo "$currentDir" | sed "s|^\(.*\)/[^/.]*$|\1|"
}
_is_mvnw_dir() {
if [ -f "$1/mvnw" ]; then
echo "true"
else
echo "false"
fi
}
_mvn() {
mvnwPath=`_find_mvnw`
if [ "$mvnwPath" == "" ]; then
$MAVEN_HOME/bin/mvn $*
else
eval "$mvnwPath $*"
fi
}
- Ajouter l'alias suivant à votre .bash_aliases
alias mvn='_mvn'
Fonctionnement
Utiliser Maven comme vous en avez l'habitude, le script va simplement utilise Maven Wrapper s'il est définit dans votre projet, sinon il utiliser l'installation "par défaut" que vous avez faite de Maven dans le répertoire $MAVEN_HOME.
Une solution vis-à-vis de mon problème avec SystemD :
[Unit]
Description=MetisFirewall
[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo START > /tmp/switch"
ExecStop=/bin/sh -c "echo STOP > /tmp/switch"
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Comment tester la sécurité d'un serveur linux avec une seule ligne de commande.
Edit : Doudou pense à regarder ça.
Un tuto sympa. Je résume les points qui m'intéressent :
Protéger des attaques en SSH :
# SSH
# 3 retry ? > Ban for 15 minutes
[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3
bantime = 900
Protéger des attaques en HTTP :
# Protect against DOS attack
# 360 requests in 2 min > Ban for 10 minutes
[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/varnish/varnishncsa.log
maxretry = 360
findtime = 120
action = iptables[name=HTTP, port=http, protocol=tcp]
mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]
bantime = 600
Un framework de test pour ses scripts Bash : shunit2
Utiliser son mobile Android comme webcam HD en USB
Exécuter un script à travers SSH :
# N'affichera aucune couleur
ssh user@host "ls --color=auto"
Exécuter un script à travers SSH avec les couleurs :
# Tout joli et coloré
ssh -t user@host "ls --color=auto"
Prenons un exemple : vous souhaitez lancer un JAR avec la commande javaw (rappel = la commande javaw fait la même chose que la commande java mais sans afficher de console).
Il faut créer un fichier contenant ci :
Attention, la commande invoquée (ici javaw) DOIT ÊTRE DANS VOTRE PATH !
[Nemo Action]
Name=Lancer le JAR
Comment=Execute un fichier JAR/WAR avec javaw
Exec=javaw -jar %F
Icon-Name=bug-buddy
Selection=Any
Extensions=jar;war;
Où mettre ce fichier ?
Pour qu'il soit accessible à tous les utilisateurs (il vous faudra les droits root) :
## Placez votre fichier ici :
/usr/share/nemo/actions/
Pour qu'il ne soit accessible qu'à vous-même (pas d'élévation de privilèges) :
## Placez votre fichier ici :
$HOME/.local/share/nemo/actions/
Un dernière contrainte ?
Oui, votre fichier DOIT AVOIR L'EXTENSION :
Protéger ses scripts bash avec tout un tas de bonnes pratiques
Oula la !! De gros changement dans udev déjà sur Ubuntu (we don't care) mais aussi sur Debian (we don't "don't care" hein). En gros eth0 disparaît au profit d'une nouvelle convention de nommage fixe dans le temps.
Tout ceux qui développent un script udev devraient y penser (Animal, spourtoi).