Outils pour utilisateurs

Outils du site


blog

Shell Script - Allow chown for non root users

Voir aussi :

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

Source : https://askubuntu.com/questions/95985/is-it-possible-to-change-ownership-of-a-file-without-root-access

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
2025/03/24 15:06
,

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

$ 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
2025/03/24 15:06

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
2025/03/24 15:06

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
2025/03/24 15:06

Changer le umask pour un groupe ou plusieurs groupe en SFTP

Voir http://serverfault.com/questions/257711/openssh-5-3-setting-umask-for-sftp-chroot-env-dosent-work-at-all

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
2025/03/24 15:06
blog.txt · Dernière modification : de 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki