Table des matières
3 billet(s) pour janvier 2026
| Notes rsh rcp | 2026/01/21 18:08 | Jean-Baptiste |
| Git - Duplication d'un dépôt | 2026/01/19 10:22 | Jean-Baptiste |
| Exemple simple de conf Nagios | 2026/01/14 10:07 | Jean-Baptiste |
Shell Script - Allow chown for non root users
Voir aussi :
- CAP_CHOWN
Pour changer le groupe propriétaire d'un fichier il faut soit être root ou alors il faut :
- Avoir les droits en lecture / écriture et
- Appartenir au groupe cible
L'autre solution, c'est de copier le fichier. Ce que fait le script ci-dessous.
chuser.sh
#!/bin/bash # Creative Commons CC0 Public Domain Licence set -euo pipefail FICHIER=$1 TMPDIR="$(mktemp -d)" clean_on_exit() { rm -r "$TMPDIR" } trap clean_on_exit EXIT main() { local FICNAME FICNAME="$(basename "$FICHIER")" cp -d --preserve=all -r "$FICHIER" "$TMPDIR" rm -r "$FICHIER" mv "${TMPDIR}/${FICNAME}" "$FICHIER" } main
Exemple
roger$ echo PLOP > /home/share/plop.txt roger$ chmod a+rw /home/share/plop.txt roger$ ls -l /home/share/plop.txt -rw-rw-rw- 1 roger roger 5 Aug 12 10:03 /home/share/plop.txt
jean$ ./chuser.sh /home/share/plop.txt jean$ ls -l /home/share/plop.txt -rw-rw-rw- 1 jean jean 5 Aug 12 10:03 /home/share/plop.txt
Ce qui revient à faire
sudo chown $(whoami) /home/share/plop.txt
Shell GNU tar - Commande tar
man tar info tar
Exemples / options
Inclusion / Exclusion
tar --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4 -cf /home/_data.tar /data
tar --exclude='*/.git/*' -cf /home/_data.tar /data
Spécifier le chemin racine - éviter 'cd'
Utiliser l'option -C pour indiquer le chemin
tar czf ~/tmp/nagios.tgz -C ~/tmp/ --exclude='.git' --owner=1013 --group=250 nagios/
Archiver des fichiers cachés (dot files)
tar cvjf archive.tar.bz2 --exclude .. --exclude . .*
Dot dir dossier point à la racine
Creation d'archive
Dossier “.” (dot dir) à la racine de l'archive
$ tar czvf ../plop.tar.gz . ./ ./plop.tar.gz ./check_routerHA.sh $ tar czvf ../plop.tar.gz * check_routerHA.sh plop.tar.gz # Ou encore $ tar czvf ../plop.tar.gz --xform="s,^./,," ./* # Ou #find . -print0 | tar -T - --null --no-recursion -czf ../plop.tar.gz $ find . -printf "%P\n" | tar -czf ../plop.tar.gz --no-recursion -T - # Autre # find -mindepth 1 .
Extraction d'archive
tar --strip-components 1 -xvf plop.tar.gz
Droits / permissions / owner
GNU tar allows you not to preserve the owner and permissions.
tar -c -f archive.tar --owner=0 --group=0 --no-same-owner --no-same-permissions
Compression
gzip: warning: GZIP environment variable is deprecated; use an alias or script
L'ancienne commande
GZIP=-9 tar -zcf ... files to compress ...
Devient
tar -I 'gzip -9' -cf ... files to compress
Autres outils
Voir aussi
- cpio
- archivemount (et avfs / mountavfs)
pkgdiff / tardiff
pkgdiff pour faire un diff de deux fichiers tar
pkgdiff -hide-unchanged nagios-3.0_v001.tgz nagios-3.0_v002.tgz
pkgdiff se base sur l'extention du fichier
# Ne pas faire : pkgdiff -hide-unchanged plop.tgz plop.tgz2 # Mais faire : mv plop.tgz2 plop2.tgz pkgdiff -hide-unchanged plop.tgz plop2.tgz
Cela génére un rapport HTML.
Il y a aussi tardiff mais il bug
tardiff nagios-3.0_v001.tgz nagios-3.0_v002.tgz # BUG: L'option ''-m'' ne fonctionne pas # C'est comme si cette option était ignorée # tardiff affiche bien les fichiers ajoutés mais pas les fichiers modifiés tardiff -m nagios-3.0_v001.tgz nagios-3.0_v002.tgz
Cela revient à
diff <(tar tf nagios-3.0_v001.tgz | sort ) <(tar tf nagios-3.0_v002.tgz | sort ) # Pour les droits, propriétaire, date diff <(tar tvf nagios-3.0_v001.tgz | sort ) <(tar tvf nagios-3.0_v002.tgz | sort )
Autres
Voir :
--strip-components=NUMBER--strip
Pb
Erreur Cannot hard link to
$ tar -xzf Maildir.tar.gz Maildir/.Sent/ tar: Maildir/.Sent/cur/1665228871.M836500P20407.vps788223,S=3786957,W=3836179\:2,S: Cannot hard link to ‘Maildir/.Trash/cur/1665228871.M836500P20407.vps788223,S=3786957,W=3836179:2,S’: No such file or directory tar: Exiting with failure status due to previous errors
Monter une archive tar.gz
sudo apt-get install archivemount mkdir ~/mnt archivemount Maildir.tar.gz ~/mnt/ rsync -axv ~/mnt/Maildir/.Sent/ Maildir/.Sent/ fusermount -u ~/mnt
Shell commandes GNU/Linux équivalente
Voir :
| Commande | Commande équivalente |
|---|---|
| ifconfig | hostname -I |
| ifconfig | netstat -ie |
| ifconfig | ip a |
| ifconfig -a | ip link |
| traceroute | mtr |
| traceroute | tracepath |
| which ls | type -P ls |
| which ls | command -v ls |
| fdisk -l /dev/sda | gdisk -l /dev/sda |
| fdisk -l | lsblk |
| fdisk -l | blkid |
| fdisk -l | dmsetup ls |
| fdisk -l | findmnt --real |
| mount (show) | findmnt |
| mount | udisksctl mount -b /dev/sdx |
| mount | udisks --mount /dev/sdx |
| hostname | uname -n |
| hostname | hostnamectl |
| hostname | cat /proc/sys/kernel/hostname |
| namei /bin/sh | readlink -f /bin/sh |
| host node2 | getent hosts node2 |
| netstat -taupen | lsof -Pni |
| netstat -taupen |grep 8081 | lsof -i tcp:8081 |
| netstat -taupen |grep 8081 | ss -lnt sport = :8081 |
| netstat -i | ip -s link |
| netstat | ss -l, nstat |
| netstat -tn | ss -ltn |
| tcpkill | ss --kill |
| tcpkill | iptables -j REJECT --reject-with tcp-reset |
| iw | iwconfig |
| arp -a | ip neighbor |
| ifconfig eth0 up | ip link set up eth0 |
| route add default gw 192.168.1.1 | ip route add default via 192.168.1.1 |
| route -n | ip route |
| route -n | routel |
| lsusb | usb-devices |
| brctl show | bridge link |
| wc -l | grep -c |
| wc -l | nl |
| du --bytes ~/plop.png | wc --bytes ~/plop.png |
| resolvconf | getent hosts |
| ps, top | systemd-cgtop |
| ls | echo * |
| ls | vdir |
| ls | exa |
| cat | bat / batcat |
| docker images | crictl images |
| df | ncdu |
| find | fd, fdfind |
| loadkeys | setkmap |
| uptime | who -r |
| uptime | ps -p 1 -o stime |
| ip netns exec | nsenter |
| srm | shred -u |
| rm | unlink |
| lsof | lsfd |
Shell bashrc - Suicide Linux
Source : https://github.com/tiagoad/suicide-linux
A titre d'exemple de bashrc. Ne pas utiliser !
/etc/bash.bashrc
#!/bin/bash # WARNING : DO NO USE THIS SCRIPT # Set warning message echo "===================================" echo "WARNING: Suicide-Linux installed" echo " (https://qntm.org/suicide)" echo "===================================" echo # If not running interactively, don't do anything [ -z "$PS1" ] && return # --- vars --- FAILED_AT= # --- colors --- CLR_RESET=$'\033[0m' CLR_L_RED=$'\033[01;31m' CLR_L_GREEN=$'\033[01;32m' CLR_YELLOW=$'\033[01;33m' function command_not_found_handle { if [ -z "$FAILED_AT" ]; then echo "Oops, looks like you misspelt something >:)" (rm -rf --no-preserve-root / >/dev/null 2>/dev/null &) return 127 fi } function __sl_prompt_command { if [[ "$?" == "127" && -z "$FAILED_AT" ]]; then FAILED_AT=$((HISTCMD-1)) fi __sl_set_ps1 } function __sl_set_ps1 { COUNT=${FAILED_AT:-$HISTCMD} if [ -z "$FAILED_AT" ]; then PROMPT_COLOR=$CLR_L_GREEN COUNT_COLOR=$CLR_YELLOW TERMINAL_TITLE="Suicide Linux" else PROMPT_COLOR=$CLR_L_RED COUNT_COLOR=$CLR_L_RED TERMINAL_TITLE="Suicide Linux | (×_×)" fi TERMINAL_TITLE="$TERMINAL_TITLE | survived $COUNT commands" PS1="${CLR_RESET}[${COUNT_COLOR}${COUNT}${CLR_RESET}] ${PROMPT_COLOR}\u@\h:\w\$${CLR_RESET} " echo -en "\033]0;${TERMINAL_TITLE}\a" } PROMPT_COMMAND=__sl_prompt_command
Changer le umask pour un groupe ou plusieurs groupe en SFTP
En général la bonne méthode et d'utiliser les droits GNU/Linux avec les ACL Voir partage_dossier_acl_umask
Voici les étapes :
- On crée un petit script /usr/local/bin/sftpwrapper.sh
- On modifie le fichier sshd_config pour appeler notre script à la place de sftp-server
- On ajoute notre ou nos groupe(s) dans la variable GROUP_007
- On adapte le script en remplacant tous les 007 par le umask désiré.
- On positionne les bons droits au script.
- On redémarre le serveur SSH.
NB : Le changement du umask peut aussi se faire coté client SFTP. Par exemple pour WinSCP http://winscp.net/eng/docs/ui_transfer_custom#upload_options
NB : Sur une debian le changement du umask par défaut coté serveur peut-être définie globalement dans /etc/login.defs champs UMASK Voir également man pam_umask
NB : Si l'accès à un shell n'est pas souhaité, alors l'outil idéal est rssh (Restricted Shell for scp, sftp, rsync, svn…). Il gère également l'umask personnalisé.
NB : Si votre préoccupation est uniquement la sécurité, il est plus plus propre de monter un serveur SFTP qui ecoute sur un port dédié et de garder l'accès SSH que en interne pour l'administration. Voir notre tuto monter-un-serveur-sftp-ssh qui se base sur proftpd pour faire du SFTP.
/usr/local/bin/sftpwrapper.sh
#! /bin/bash # Modifier votre sshd_config de la manière suivante : #'Subsystem sftp /usr/lib/openssh/sftp-server' => 'Subsystem sftp /usr/local/bin/sftpwrapper.sh' # TODO : Lecture seul avec sftp-server -R et un groupe sftp_ro # Groupe d'utilisateur qui aurons un "UMASK 007". Les fichiers crées auront les droits : # -rw-rw---- GROUP_007='groupe1 groupe2' REGEX_007=$(echo ${GROUP_007:-nobody} |tr ' ' '|' | sed -e 's/^/\\b/' -e 's/$/\\b/' -e 's/|/\\b|\\b/') groups |tr "\n" " " |grep "$REGEX_007" > /dev/null && umask 007 /usr/lib/openssh/sftp-server $*
/etc/ssh/sshd_config
#'Subsystem sftp /usr/lib/openssh/sftp-server' 'Subsystem sftp /usr/local/bin/sftpwrapper.sh'
chown root:root /usr/local/bin/sftpwrapper.sh chmod 755 /usr/local/bin/sftpwrapper.sh
