Outils pour utilisateurs

Outils du site


blog

Wrapper to use su as sudo - Emulating sudo's behaviour with su

Ma proposition

sudo.sh

#!/bin/bash
 
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details
 
ARGS_STRING=''
 
add_arg() {
        ARGS_STRING="${ARGS_STRING} $*"
}
 
echo "!!! WARNING: Using a fake sudo command !!!" >&2
 
while [ "${1-}" != "" ]; do
        case $1 in
        -s)
                shift
                add_arg "-s $1"
                ;;
        -u)
                shift
                add_arg "-p $1"
                ;;
        --)     # End of all options
                shift
                break
                ;;
        *)
                add_arg -c
                add_arg "'$*'"
                shift
                break
                ;;
        esac
        shift
done
 
# echo su "${ARGS_STRING}"
eval su "${ARGS_STRING}"

Autres exemples

Exemple 1

su_wrapper() {
    su -s /bin/bash -c "$(printf "%q " "$@")"
}

ou

su_wrapper() {
    local IFS=' '
    su -c "$*"
}

Source : https://stackoverflow.com/questions/24340664/emulating-sudos-behaviour-with-su

Exemple 2

sudo-su

#! /bin/sh
set -e
 
# A wrapper around su and sudo to implement a basic sudo-style interface with
# su and a basic su-style interface with sudo.
# 
# This can be useful when using tools such as pdebuild(1) that integrate
# privilege escalation only with sudo, or only with su: by having it run
# this program instead, you actually use su, or sudo instead seemlessly.
#
# Copyright (C) Tanguy Ortolo <tanguy+sudo-su@ortolo.eu> 2011
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details. 
 
 
usage()
{
    rc=$1
    echo "Usage: sudo-su COMMAND" >&2
    echo "       su-sudo -c \"COMMAND\"" >&2
    echo "sudo-su uses su to implement a basic sudo-style interface" >&2
    echo "su-sudo uses sudo to implement a basic su-style interface" >&2
    exit $rc
}
 
fake_sudo()
{
    TEMP="$(getopt -s sh -o +h --long help -n "$0" -- "$@")"
    if [ "$?" != 0 ]
    then
        usage $?
    fi
    eval set -- "$TEMP"
    while [ "$1" != "--" ]
    do
        case "$1"
        in
            -h|--help) usage 0 ; shift ;;
        esac
    done
    shift
    if [ "$#" -eq 0 ]
    then
        echo "sudo-su requires a command" >&2
        usage 1
    fi
 
    command=""
    for arg in "$@"
    do
        # To represent single quotes from single-quote mode:
        # leave single-quote mode, enter double-quote mode, write the single quote,
        # leave double-quote mode, enter single-quote mode.
        arg="$(echo "$arg" | sed -e "s/'/'\"'\"'/g")"
        if [ -z "$command" ]
        then
            command="'$arg'"
        else
            command="$command '$arg'"
        fi
    done
 
    exec su -c "$command"
}
 
fake_su()
{
    TEMP="$(getopt -s sh -o hc: --long help,command: -n "$0" -- "$@")"
    if [ "$?" != 0 ]
    then
        usage $?
    fi
    eval set -- "$TEMP"
    while [ "$1" != "--" ]
    do
        case "$1"
        in
            -h|--help) usage 0 ; shift ;;
            -c|--command) command="$2" ; shift 2 ;;
        esac
    done
    shift
    if [ "$#" -ne 0 ]
    then
        echo "We take only a -c option, no argument, sorry" >&2
        usage 1
    fi
    if [ -z "$command" ]
    then
        echo "su-sudo requires a command" >&2
        usage 1
    fi
 
    exec sudo sh -c "$command"
}
 
 
case "$(basename $0)"
in
    sudo*) fake_sudo "$@" ;;
    su*) fake_su "$@" ;;
esac

Sources :

Autres

Proper usage of su :

su -c "$0" "$ZOO_USER" "$@"
2025/03/24 15:06

Why is Zoom autostarting after screen lock/unlock

Source : Why is Zoom autostarting after screen lock/unlock ?

Zoom est un logiciel privateur et même un spyware ! https://www.zerohedge.com/technology/lets-make-simple-zoom-malware

Voici une alternative libre : https://meet.jit.si/

sudo sed -i '/zoom -root/d' /usr/share/X11/app-defaults/XScreenSaver

Ou encore renommer zoom

sudo mv /usr/bin/zoom /usr/bin/zoomm

Autres

Zoom dans un Docker

Install

docker run -it --rm   --volume /usr/local/bin:/target   mdouchement/zoom-us:latest instal

Cela crée le fichier suivant

/usr/local/bin/zoom-us-wrapper

#!/bin/bash
 
PATH=/usr/sbin:/usr/bin:/sbin:/bin
ZOOM_US_USER=zoom
 
# do we need to use sudo to start docker containers?
( id -Gn | grep -q docker ) || SUDO=sudo
 
USER_UID=$(id -u)
USER_GID=$(id -g)
 
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
 
DOWNLOAD_DIR=$(xdg-user-dir DOWNLOAD)
if [ -z "${DOWNLOAD_DIR}" ]; then
    DOWNLOAD_DIR="${HOME}/Downloads"
fi;
 
list_commands() {
  echo ""
  echo "Launch zoom-us using:"
  echo "  zoom                        OR "
  echo "  zoom-us-wrapper zoom"
  echo ""
  exit 1
}
 
cleanup_stopped_zoom_us_instances(){
  echo "Cleaning up stopped zoom-us instances..."
  for c in $(${SUDO} docker ps -a -q)
  do
    image="$(${SUDO} docker inspect -f {{.Config.Image}} ${c})"
    if [ "${image}" == "mdouchement/zoom-us:latest" ]; then
      running=$(${SUDO} docker inspect -f {{.State.Running}} ${c})
      if [ "${running}" != "true" ]; then
        ${SUDO} docker rm "${c}" >/dev/null
      fi
    fi
  done
}
 
prepare_docker_env_parameters() {
  ENV_VARS+=" --env=USER_UID=${USER_UID}"
  ENV_VARS+=" --env=USER_GID=${USER_GID}"
  ENV_VARS+=" --env=DISPLAY=unix$DISPLAY"
  ENV_VARS+=" --env=XAUTHORITY=${XAUTH}"
  ENV_VARS+=" --env=TZ=$(date +%Z)"
}
 
prepare_docker_volume_parameters() {
  touch ${XAUTH}
  xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f ${XAUTH} nmerge -
 
  touch ${HOME}/.config/zoomus.conf # create if not exists
 
  VOLUMES+=" --volume=${HOME}/.config/zoomus.conf:/home/${ZOOM_US_USER}/.config/zoomus.conf"
  VOLUMES+=" --volume=${HOME}/.cache/zoom:/home/${ZOOM_US_USER}/.cache/zoom"
  VOLUMES+=" --volume=${HOME}/.zoom:/home/${ZOOM_US_USER}/.zoom"
  VOLUMES+=" --volume=${XSOCK}:${XSOCK}"
  VOLUMES+=" --volume=${XAUTH}:${XAUTH}"
  VOLUMES+=" --volume=/run/user/${USER_UID}/pulse:/run/pulse"
}
 
prepare_docker_device_parameters() {
  # enumerate video devices for webcam support
  VIDEO_DEVICES=
  for device in /dev/video*
  do
    if [ -c $device ]; then
      VIDEO_DEVICES="${VIDEO_DEVICES} --device $device:$device"
    fi
  done
}
 
prog=$(basename $0)
exec=$(which $prog)
 
if [[ ${prog} == "zoom-us-wrapper" ]]; then
  case ${1} in
    zoom)
      prog=${1}
      shift
      ;;
    *|help)
      list_commands
      exit 1
      ;;
  esac
elif [[ -n ${exec} ]]; then
  # launch host binary if it exists
  exec ${exec} $@
fi
 
cleanup_stopped_zoom_us_instances
prepare_docker_env_parameters
prepare_docker_volume_parameters
prepare_docker_device_parameters
 
echo "Starting ${prog}..."
${SUDO} docker run -d \
  ${ENV_VARS} \
  ${VIDEO_DEVICES} \
  --device /dev/dri \
  ${VOLUMES} \
  ${ZOOM_EXTRA_DOCKER_ARGUMENTS} \
  --name zoomus \
  mdouchement/zoom-us:latest ${prog} $@ >/dev/null
2025/03/24 15:06

Notes webcam

Webcam

sudo modprode uvcvideo
cheese
2025/03/24 15:06

Web - liste des codes HTTP

Structure des codes

Les codes les plus courants sont :

  • 200 : succès de la requête ;
  • 301 et 302 : redirection, respectivement permanente et temporaire ;
  • 401 : utilisateur non authentifié ;
  • 403 : accès refusé ;
  • 404 : ressource non trouvée ;
  • 500, 502 et 503 : erreurs serveur ;
  • 504 : le serveur n'a pas répondu.

Codes d'état

1xx - Information
Code Message Apparition Signification
100 Continue Attente de la suite de la requête.
101 Switching Protocols Acceptation du changement de protocole.
102 Processing WebDAV RFC 25185,6 Traitement en cours (évite que le client dépasse le temps d’attente limite).
103 Early Hints RFC 82977 (Expérimental) Dans l'attente de la réponse définitive, le serveur renvoie des liens que le client peut commencer à télécharger.
2xx - Succès
Code Message Apparition Signification
200 OK RFC 19458 Requête traitée avec succès. La réponse dépendra de la méthode de requête utilisée.
201 Created RFC 19458 Requête traitée avec succès et création d’un document.
202 Accepted RFC 19458 Requête traitée, mais sans garantie de résultat.
203 Non-Authoritative Information Information renvoyée, mais générée par une source non certifiée.
204 No Content RFC 19458 Requête traitée avec succès mais pas d’information à renvoyer.
205 Reset Content RFC 20689 Requête traitée avec succès, la page courante peut être effacée.
206 Partial Content RFC 20689 Une partie seulement de la ressource a été transmise.
207 Multi-Status WebDAV Réponse multiple.
208 Already Reported WebDAV Le document a été envoyé précédemment dans cette collection.
210 Content Different WebDAV La copie de la ressource côté client diffère de celle du serveur (contenu ou propriétés).
226 IM Used RFC 322910 Le serveur a accompli la requête pour la ressource, et la réponse est une représentation du résultat d'une ou plusieurs manipulations d'instances appliquées à l'instance actuelle.
3xx - Redirection
Code Message Apparition Signification
300 Multiple Choices RFC 19458 L’URI demandée se rapporte à plusieurs ressources.
301 Moved Permanently RFC 19458 Document déplacé de façon permanente.
302 Found RFC 19458 Document déplacé de façon temporaire.
303 See Other RFC 20689 La réponse à cette requête est ailleurs.
304 Not Modified RFC 19458 Document non modifié depuis la dernière requête.
305 Use Proxy (depuis HTTP/1.1) RFC 20689 La requête doit être ré-adressée au proxy.
306 (inutilisé) RFC 261611 La RFC 261611 indique que ce code inutilisé est réservé, car il était utilisé dans une ancienne version de la spécification. Il signifiait « Les requêtes suivantes doivent utiliser le proxy spécifié »12.
307 Temporary Redirect La requête doit être redirigée temporairement vers l’URI spécifiée sans changement de méthode13.
308 Permanent Redirect La requête doit être redirigée définitivement vers l’URI spécifiée sans changement de méthode14.
310 Too many Redirects La requête doit être redirigée de trop nombreuses fois, ou est victime d’une boucle de redirection.
4xx - Erreur du client HTTP
Code Message Apparition Signification
400 Bad Request RFC 19458 La syntaxe de la requête est erronée.
401 Unauthorized RFC 19458 Une authentification est nécessaire pour accéder à la ressource.
402 Payment Required RFC 20689 Paiement requis pour accéder à la ressource.
403 Forbidden RFC 19458 Le serveur a compris la requête, mais refuse de l'exécuter. Contrairement à l'erreur 401, s'authentifier ne fera aucune différence. Sur les serveurs où l'authentification est requise, cela signifie généralement que l'authentification a été acceptée mais que les droits d'accès ne permettent pas au client d'accéder à la ressource.
404 Not Found RFC 19458 Ressource non trouvée.
405 Method Not Allowed RFC 20689 Méthode de requête non autorisée.
406 Not Acceptable RFC 20689 La ressource demandée n'est pas disponible dans un format qui respecterait les en-têtes « Accept » de la requête.
407 Proxy Authentication Required RFC 20689 Accès à la ressource autorisé par identification avec le proxy.
408 Request Time-out RFC 20689 Temps d’attente d’une requête du client, écoulé côté serveur. D'après les spécifications HTTP : « Le client n'a pas produit de requête dans le délai que le serveur était prêt à attendre. Le client PEUT répéter la demande sans modifications à tout moment ultérieur »15.
409 Conflict RFC 20689 La requête ne peut être traitée à la suite d'un conflit avec l'état actuel du serveur.
410 Gone RFC 20689 La ressource n'est plus disponible et aucune adresse de redirection n’est connue.
411 Length Required RFC 20689 La longueur de la requête n’a pas été précisée.
412 Precondition Failed RFC 20689 Préconditions envoyées par la requête non vérifiées.
413 Request Entity Too Large RFC 20689 Traitement abandonné dû à une requête trop importante.
414 Request-URI Too Long RFC 20689 URI trop longue.
415 Unsupported Media Type RFC 20689 Format de requête non supporté pour une méthode et une ressource données.
416 Requested range unsatisfiable Champs d’en-tête de requête « range » incorrect.
417 Expectation failed Comportement attendu et défini dans l’en-tête de la requête insatisfaisante.
418 I’m a teapot RFC 232416 « Je suis une théière » : Ce code est défini dans la RFC 232417 datée du 1er avril 1998, Hyper Text Coffee Pot Control Protocol.
419 Page expired Ressource expirée
421 Bad mapping / Misdirected Request La requête a été envoyée à un serveur qui n'est pas capable de produire une réponse (par exemple, car une connexion a été réutilisée).
422 Unprocessable entity WebDAV L’entité fournie avec la requête est incompréhensible ou incomplète.
423 Locked WebDAV L’opération ne peut avoir lieu car la ressource est verrouillée.
424 Method failure WebDAV Une méthode de la transaction a échoué.
425 Too Early RFC 847018 Le serveur ne peut traiter la demande car elle risque d'être rejouée.
426 Upgrade Required RFC 281719 Le client devrait changer de protocole, par exemple au profit de TLS/1.0.
427 Invalid digital signature Microsoft La signature numérique du document est non-valide.
428 Precondition Required RFC 658520 La requête doit être conditionnelle.
429 Too Many Requests RFC 658520 le client a émis trop de requêtes dans un délai donné.
431 Request Header Fields Too Large RFC 658520 Les entêtes HTTP émises dépassent la taille maximale admise par le serveur.
449 Retry With Microsoft La requête devrait être renvoyée après avoir effectué une action.
450 Blocked by Windows Parental Controls Microsoft Cette erreur est produite lorsque les outils de contrôle parental de Microsoft Windows sont activés et bloquent l’accès à la page.
451 Unavailable For Legal Reasons RFC 772521 La ressource demandée est inaccessible pour des raisons d'ordre légal.
456 Unrecoverable Error WebDAV Erreur irrécupérable.

Codes 4xx étendus du serveur Nginx

Code Message Apparition Signification
444 No Response Nginx Indique que le serveur n'a retourné aucune information vers le client et a fermé la connexion.
495 SSL Certificate Error Nginx Une extension de l'erreur 400 Bad Request, utilisée lorsque le client a fourni un certificat invalide.
496 SSL Certificate Required Nginx Une extension de l'erreur 400 Bad Request, utilisée lorsqu'un certificat client requis n'est pas fourni.
497 HTTP Request Sent to HTTPS Port Nginx Une extension de l'erreur 400 Bad Request, utilisée lorsque le client envoie une requête HTTP vers le port 443 normalement destiné aux requêtes HTTPS.
498 Token expired/invalid Nginx Le jeton a expiré ou est invalide.
499 Client Closed Request Nginx Le client a fermé la connexion avant de recevoir la réponse. Cette erreur se produit quand le traitement est trop long côté serveur22.
5xx - Erreur du serveur / du serveur d'application
Code Message Apparition Signification
500 Internal Server Error RFC 19458 Erreur interne du serveur.
501 (Method) Not Implemented RFC 19458 Fonctionnalité réclamée non supportée par le serveur.
502 Bad Gateway ou Proxy Error RFC 19458 En agissant en tant que serveur proxy ou passerelle, le serveur a reçu une réponse invalide depuis le serveur distant.
503 Service Unavailable RFC 19458 Service temporairement indisponible ou en maintenance.
504 Gateway Time-out RFC 20689 Temps d’attente d’une réponse d’un serveur à un serveur intermédiaire écoulé.
505 HTTP Version not supported RFC 20689 Version HTTP non gérée par le serveur.
506 Variant Also Negotiates RFC 229523 Erreur de négociation. Transparent content negociation.
507 Insufficient storage WebDAV Espace insuffisant pour modifier les propriétés ou construire la collection.
508 Loop detected WebDAV Boucle dans une mise en relation de ressources (RFC 584224).
509 Bandwidth Limit Exceeded Utilisé par de nombreux serveurs pour indiquer un dépassement de quota.
510 Not extended RFC 277425 La requête ne respecte pas la politique d'accès aux ressources HTTP étendues.
511 Network authentication required RFC 658520 Le client doit s'authentifier pour accéder au réseau. Utilisé par les portails captifs pour rediriger les clients vers la page d'authentification.

Codes 5xx étendus du mandataire Cloudflare

Code Message Apparition Signification
520 Unknown Error Cloudflare Réponse générique lorsque le serveur d'origine retourne un résultat imprévu.
521 Web Server Is Down Cloudflare Le serveur a refusé la connexion depuis Cloudflare.
522 Connection Timed Out Cloudflare Cloudflare n'a pas eu de retour avec le serveur d'origine dans les temps.
523 Origin Is Unreachable Cloudflare Cloudflare n'a pas réussi à joindre le serveur d'origine. Cela peut se produire en cas d'échec de résolution de nom de serveur DNS.
524 A Timeout Occurred Cloudflare Cloudflare a établi une connexion TCP avec le serveur d'origine mais n'a pas reçu de réponse HTTP avant l'expiration du délai de connexion.
525 SSL Handshake Failed Cloudflare Cloudflare n'a pas pu négocier un SSL/TLS handshake avec le serveur d'origine.
526 Invalid SSL Certificate Cloudflare Cloudflare n'a pas pu valider le certificat SSL présenté par le serveur d'origine.
527 Railgun Error Cloudflare La requête a dépassé le délai de connexion ou a échoué après que la connexion WAN a été établie.
2025/03/24 15:06

Serveur Samba SMB CIFS

Voir aussi

Notes

RHEL6 ne supporte pas le protocole SMB2 et +

Configuration

rlimit_max (1024) below minimum Windows limit (16384)

/etc/security/limits.d/30-samba.conf

root               -       nofile          16385

Défaut est max open files = 16385

Voir https://www.tecmint.com/install-samba-on-rhel-8-for-file-sharing-on-windows/

/etc/samba/smb.conf

[global]
        workgroup = WORKGROUP
        server string = Samba
        netbios name = SAMBA
        client ipc min protocol = SMB3
        client min protocol = SMB3
        server min protocol = SMB2
        disable netbios = Yes
        disable spoolss = Yes
        domain master = No      
        load printers = No
        local master = No
        log file = /var/log/samba/log.%m
 
        # Size in KB
        max log size = 200000
 
        name resolve order = host
        printcap name = /dev/null
        security = USER
        smb ports = 445
        idmap config * : backend = tdb
        passdb backend = tdbsam
        cups options = raw
        printing = bsd
        #log level = 3
        #restrict anonymous = 2
        #nt pipe support = no
        #interfaces = eth* lo
        #bind interfaces only = yes
        #fstype = Samba
        host msdfs = no
        server services = -s3fs, -rpc, -nbt, -wrepl, -ldap, -cldap, -kdc, -drepl, -winbindd, -ntp_signd, -kcc, -dnsupdate, -dns
 
[public]
        comment = Public
        read only = Yes
        path = /data/shared/public
 
[shared]
        #guest ok = Yes
        #browseable = No
        comment = Shared
        path = /mnt/shared
        read only = No
        #force user = jean
        valid users = jean
        write list = jean
 
#[IPC$]
#        hosts allow = 192.168.115.0/24 127.0.0.1
#        hosts deny = 0.0.0.0/0

Nul besoin de redémarrer le service, les modifications sont automatiquement prises en compte. Pour vérifier

testparm

Pour tester la connexion

smbclient -N -L 127.0.0.1
smbclient -N //127.0.0.1/shared
smbclient -U user%password //127.0.0.1/shared

Si besion modifier /etc/sysconfig/iptables ou firewalld

#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT

Exemple :

/etc/samba/smb.conf

[partage]
   comment = Commentaires...
   path = /var/www
   force user = web
   #valid users = web
   browseable = yes
   writable = yes

Valider la configuration

testparm

Reload de la conf sans redémarrer

smbcontrol all reload-config

Redémarrer le service

systemctl restart smb
Faire un include d'un fichier de config.

C'est une fausse bonne idée car pas de reload automatique

/etc/samba/smb.conf

[global]
        path = /dev/null
 
[includes]
        available = No
        include = /etc/samba/smb.d/shared.conf

/etc/samba/smb.d/shared.conf

[shared]
        comment = Shared
        path = /mnt/shared
        read only = No

Authentification / comptes

Comment c'est configuré

testparm -sv /dev/null | grep auth

Autoriser un utilisateur / définition du MDP

#pdbedit -a utilisateur
​smbpasswd -a utilisateur

Suppression d'un compte (retour arrière à précédent)

smbpasswd -x supervision

Liste tous les comptes

pdbedit -L

Vérif l’existence de l'utilisateur pirate

pdbedit -u pirate

Désactiver l'impression

/etc/samba/smb.conf

[global]
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes

Source : http://mugurel.sumanariu.ro/linux/linux-how-to-disable-printing-in-samba/

Debug

/etc/samba/smb.conf

[global]
   log level = 3

Pas besoin de redémarrer le service, le reload est auto

Notes

smbstatus

Pb

Receiving SMB: Server stopped responding - Call returned zero bytes (EOF) opening remote
smb: \> get plop
Receiving SMB: Server stopped responding
Call returned zero bytes (EOF) opening remote file \plop
Solution

Le pb venait du fait que la partition /var était pleine.

Pb de connection depuis windows err NT_STATUS_WRONG_PASSWORD
Solution 1 (insecure)

/etc/samba/smb.conf

[global]
ntlm auth = yes
#client ntlmv2 auth = yes

Exemple de conf

Install sous RedHat / CentOS

cp -p /etc/samba/smb.conf /etc/samba/smb.conf.bak
egrep -v '^$|^#|^;' /etc/samba/smb.conf.bak > /etc/samba/smb.conf

/etc/samba/smb.conf

[global]
   workgroup = WORKGROUP
   dns proxy = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   syslog = 0
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   passdb backend = tdbsam
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = yes
 
[tmp]
   path = /tmp
   comment = TEMP
   browseable = yes
   read only = no
   create mask = 0660
   directory mask = 0770
   guest ok = yes
 
[partage]
   comment = Partage
   path = /data/
   force user = utilisateur1
   #public = yes
   valid users = @groupe1, jean
   write list = @groupe1, jean
   browseable = yes
   writable = yes
   read only = no

Autres

Pour conteneurs

/usr/sbin/smbd -F -S
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