[{"data":1,"prerenderedAt":952},["ShallowReactive",2],{"navigation_docs_fr":3,"-fr-nonsense-bash-rm-confirmation-":376,"-fr-nonsense-bash-rm-confirmation--surround":947},[4,16,93,261,270,331],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":15},"À propos","i-noto-star","\u002Ffr\u002Fabout","fr\u002F1.about",[10],{"title":11,"path":12,"stem":13,"icon":14},"Bienvenue","\u002Ffr\u002Fabout\u002Fwelcome","fr\u002F1.about\u002F1.welcome","i-lucide-home",false,{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":15},"Généralités","i-noto-open-book","\u002Ffr\u002Fgeneral","fr\u002F2.general",[22,26,44,58,75],{"title":17,"path":23,"stem":24,"icon":25},"\u002Ffr\u002Fgeneral\u002Fsummary","fr\u002F2.general\u002F1.summary","i-lucide-bookmark",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":15},"Réseau","i-lucide-network","\u002Ffr\u002Fgeneral\u002Fnetworking","fr\u002F2.general\u002F2.networking",[32,36,40],{"title":33,"path":34,"stem":35},"NAT & DHCP","\u002Ffr\u002Fgeneral\u002Fnetworking\u002Fnat","fr\u002F2.general\u002F2.networking\u002F1.nat",{"title":37,"path":38,"stem":39},"Zone DNS","\u002Ffr\u002Fgeneral\u002Fnetworking\u002Fdns","fr\u002F2.general\u002F2.networking\u002F2.dns",{"title":41,"path":42,"stem":43},"Samba","\u002Ffr\u002Fgeneral\u002Fnetworking\u002Fsamba","fr\u002F2.general\u002F2.networking\u002F3.samba",{"title":45,"icon":46,"path":47,"stem":48,"children":49,"page":15},"Stockage","i-lucide-hard-drive","\u002Ffr\u002Fgeneral\u002Fstorage","fr\u002F2.general\u002F3.storage",[50,54],{"title":51,"path":52,"stem":53},"RAID","\u002Ffr\u002Fgeneral\u002Fstorage\u002Fraid","fr\u002F2.general\u002F3.storage\u002F1.raid",{"title":55,"path":56,"stem":57},"ZFS","\u002Ffr\u002Fgeneral\u002Fstorage\u002Fzfs","fr\u002F2.general\u002F3.storage\u002F2.zfs",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":15},"Matériel","i-lucide-server","\u002Ffr\u002Fgeneral\u002Fhardware","fr\u002F2.general\u002F4.hardware",[64,68,71],{"title":65,"path":66,"stem":67},"Les bases","\u002Ffr\u002Fgeneral\u002Fhardware\u002Fbasics","fr\u002F2.general\u002F4.hardware\u002F1.basics",{"title":27,"path":69,"stem":70},"\u002Ffr\u002Fgeneral\u002Fhardware\u002Fnetwork","fr\u002F2.general\u002F4.hardware\u002F2.network",{"title":72,"path":73,"stem":74},"Le ProloNAS","\u002Ffr\u002Fgeneral\u002Fhardware\u002Fprolonas","fr\u002F2.general\u002F4.hardware\u002F3.prolonas",{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":15},"Linux pour les nuls","i-lucide-terminal","\u002Ffr\u002Fgeneral\u002Flinux","fr\u002F2.general\u002F5.linux",[81,85,89],{"title":82,"path":83,"stem":84},"CLI pour les nuls","\u002Ffr\u002Fgeneral\u002Flinux\u002Fcli-basics","fr\u002F2.general\u002F5.linux\u002F1.cli-basics",{"title":86,"path":87,"stem":88},"Dossiers et partitions","\u002Ffr\u002Fgeneral\u002Flinux\u002Ffilesystem","fr\u002F2.general\u002F5.linux\u002F2.filesystem",{"title":90,"path":91,"stem":92},"Outils CLI pratiques","\u002Ffr\u002Fgeneral\u002Flinux\u002Fhandy-tools","fr\u002F2.general\u002F5.linux\u002F3.handy-tools",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":15},"Serveex","i-noto-microscope","\u002Ffr\u002Fserveex","fr\u002F3.serveex",[99,103,125,143,169,187,201,215,233,247],{"title":100,"path":101,"stem":102,"icon":25},"Introduction","\u002Ffr\u002Fserveex\u002Fintroduction","fr\u002F3.serveex\u002F1.introduction",{"title":104,"icon":105,"path":106,"stem":107,"children":108,"page":15},"Cœur du serveur","i-lucide-server-cog","\u002Ffr\u002Fserveex\u002Fcore","fr\u002F3.serveex\u002F2.core",[109,113,117,121],{"title":110,"path":111,"stem":112},"Debian 13","\u002Ffr\u002Fserveex\u002Fcore\u002Finstallation","fr\u002F3.serveex\u002F2.core\u002F1.installation",{"title":114,"path":115,"stem":116},"Docker","\u002Ffr\u002Fserveex\u002Fcore\u002Fdocker","fr\u002F3.serveex\u002F2.core\u002F2.docker",{"title":118,"path":119,"stem":120},"Wireguard","\u002Ffr\u002Fserveex\u002Fcore\u002Fwireguard","fr\u002F3.serveex\u002F2.core\u002F3.wireguard",{"title":122,"path":123,"stem":124},"SWAG","\u002Ffr\u002Fserveex\u002Fcore\u002Fswag","fr\u002F3.serveex\u002F2.core\u002F4.swag",{"title":126,"icon":127,"path":128,"stem":129,"children":130,"page":15},"Sécurité","i-lucide-shield","\u002Ffr\u002Fserveex\u002Fsecurity","fr\u002F3.serveex\u002F3.security",[131,135,139],{"title":132,"path":133,"stem":134},"Cloudflare Zero Trust","\u002Ffr\u002Fserveex\u002Fsecurity\u002Fcloudflare","fr\u002F3.serveex\u002F3.security\u002F2.cloudflare",{"title":136,"path":137,"stem":138},"TinyAuth","\u002Ffr\u002Fserveex\u002Fsecurity\u002Ftinyauth","fr\u002F3.serveex\u002F3.security\u002F3.tinyauth",{"title":140,"path":141,"stem":142},"Pocket ID","\u002Ffr\u002Fserveex\u002Fsecurity\u002Fpocket-id","fr\u002F3.serveex\u002F3.security\u002F4.pocket-id",{"title":144,"icon":145,"path":146,"stem":147,"children":148,"page":15},"Monitoring","i-lucide-chart-no-axes-column","\u002Ffr\u002Fserveex\u002Fmonitoring","fr\u002F3.serveex\u002F4.monitoring",[149,153,157,161,165],{"title":150,"path":151,"stem":152},"Uptime-Kuma","\u002Ffr\u002Fserveex\u002Fmonitoring\u002Fuptime-kuma","fr\u002F3.serveex\u002F4.monitoring\u002F1.uptime-kuma",{"title":154,"path":155,"stem":156},"Dozzle","\u002Ffr\u002Fserveex\u002Fmonitoring\u002Fdozzle","fr\u002F3.serveex\u002F4.monitoring\u002F2.dozzle",{"title":158,"path":159,"stem":160},"Speedtest Tracker","\u002Ffr\u002Fserveex\u002Fmonitoring\u002Fspeedtest-tracker","fr\u002F3.serveex\u002F4.monitoring\u002F3.speedtest-tracker",{"title":162,"path":163,"stem":164},"Beszel","\u002Ffr\u002Fserveex\u002Fmonitoring\u002Fbeszel","fr\u002F3.serveex\u002F4.monitoring\u002F4.beszel",{"title":166,"path":167,"stem":168},"UpSnap","\u002Ffr\u002Fserveex\u002Fmonitoring\u002Fupsnap","fr\u002F3.serveex\u002F4.monitoring\u002F5.upsnap",{"title":170,"icon":171,"path":172,"stem":173,"children":174,"page":15},"Média & Seedbox","i-lucide-list-video","\u002Ffr\u002Fserveex\u002Fmedia","fr\u002F3.serveex\u002F5.media",[175,179,183],{"title":176,"path":177,"stem":178},"Jellyfin","\u002Ffr\u002Fserveex\u002Fmedia\u002Fjellyfin","fr\u002F3.serveex\u002F5.media\u002F1.jellyfin",{"title":180,"path":181,"stem":182},"Qbittorrent","\u002Ffr\u002Fserveex\u002Fmedia\u002Fqbittorrent","fr\u002F3.serveex\u002F5.media\u002F2.qbittorrent",{"title":184,"path":185,"stem":186},"Automatisation","\u002Ffr\u002Fserveex\u002Fmedia\u002Fservarr","fr\u002F3.serveex\u002F5.media\u002F3.servarr",{"title":188,"icon":189,"path":190,"stem":191,"children":192,"page":15},"Cloud & Photos","i-lucide-cloud-upload","\u002Ffr\u002Fserveex\u002Fcloud","fr\u002F3.serveex\u002F6.cloud",[193,197],{"title":194,"path":195,"stem":196},"Immich","\u002Ffr\u002Fserveex\u002Fcloud\u002Fimmich","fr\u002F3.serveex\u002F6.cloud\u002F1.immich",{"title":198,"path":199,"stem":200},"Nextcloud","\u002Ffr\u002Fserveex\u002Fcloud\u002Fnextcloud","fr\u002F3.serveex\u002F6.cloud\u002F2.nextcloud",{"title":202,"icon":203,"path":204,"stem":205,"children":206,"page":15},"Fichiers & partage","i-lucide-folder-tree","\u002Ffr\u002Fserveex\u002Ffiles","fr\u002F3.serveex\u002F7.files",[207,211],{"title":208,"path":209,"stem":210},"File Browser Quantum","\u002Ffr\u002Fserveex\u002Ffiles\u002Ffile-browser-quantum","fr\u002F3.serveex\u002F7.files\u002F1.file-browser-quantum",{"title":212,"path":213,"stem":214},"Pingvin","\u002Ffr\u002Fserveex\u002Ffiles\u002Fpingvin","fr\u002F3.serveex\u002F7.files\u002F2.pingvin",{"title":216,"icon":217,"path":218,"stem":219,"children":220,"page":15},"Développement","i-lucide-code-xml","\u002Ffr\u002Fserveex\u002Fdevelopment","fr\u002F3.serveex\u002F8.development",[221,225,229],{"title":222,"path":223,"stem":224},"Code-Serveur","\u002Ffr\u002Fserveex\u002Fdevelopment\u002Fcode-server","fr\u002F3.serveex\u002F8.development\u002F1.code-server",{"title":226,"path":227,"stem":228},"Forgejo","\u002Ffr\u002Fserveex\u002Fdevelopment\u002Fforgejo","fr\u002F3.serveex\u002F8.development\u002F2.forgejo",{"title":230,"path":231,"stem":232},"IT Tools","\u002Ffr\u002Fserveex\u002Fdevelopment\u002Fit-tools","fr\u002F3.serveex\u002F8.development\u002F3.it-tools",{"title":234,"icon":235,"path":236,"stem":237,"children":238,"page":15},"Applications utiles","i-lucide-award","\u002Ffr\u002Fserveex\u002Fapps","fr\u002F3.serveex\u002F9.apps",[239,243],{"title":240,"path":241,"stem":242},"Adguard Home","\u002Ffr\u002Fserveex\u002Fapps\u002Fadguard","fr\u002F3.serveex\u002F9.apps\u002F1.adguard",{"title":244,"path":245,"stem":246},"Vaultwarden","\u002Ffr\u002Fserveex\u002Fapps\u002Fvaultwarden","fr\u002F3.serveex\u002F9.apps\u002F2.vaultwarden",{"title":248,"icon":249,"path":250,"stem":251,"children":252,"page":15},"Avancé","i-lucide-flask-conical","\u002Ffr\u002Fserveex\u002Fadvanced","fr\u002F3.serveex\u002F91.advanced",[253,257],{"title":254,"path":255,"stem":256},"Authentik","\u002Ffr\u002Fserveex\u002Fadvanced\u002Fauthentik","fr\u002F3.serveex\u002F91.advanced\u002F1.authentik",{"title":258,"path":259,"stem":260},"Arcane","\u002Ffr\u002Fserveex\u002Fadvanced\u002Farcane","fr\u002F3.serveex\u002F91.advanced\u002F2.arcane",{"title":262,"icon":263,"path":264,"stem":265,"children":266,"page":15},"Stockeex","i-noto-computer-disk","\u002Ffr\u002Fstockeex","fr\u002F4.stockeex",[267],{"title":100,"path":268,"stem":269,"icon":25},"\u002Ffr\u002Fstockeex\u002Fintroduction","fr\u002F4.stockeex\u002F1.introduction",{"title":271,"icon":272,"path":273,"stem":274,"children":275,"page":15},"Mes bêtises","i-noto-test-tube","\u002Ffr\u002Fnonsense","fr\u002F5.nonsense",[276,279,301],{"title":271,"path":277,"stem":278,"icon":25},"\u002Ffr\u002Fnonsense\u002Fsummary","fr\u002F5.nonsense\u002F1.summary",{"title":280,"icon":281,"path":282,"stem":283,"children":284,"page":15},"Python","i-lucide-file-code-2","\u002Ffr\u002Fnonsense\u002Fpython","fr\u002F5.nonsense\u002F2.python",[285,289,293,297],{"title":286,"path":287,"stem":288},"Nvidia Stock Bot","\u002Ffr\u002Fnonsense\u002Fpython\u002Fnvidia-stock-bot","fr\u002F5.nonsense\u002F2.python\u002F1.nvidia-stock-bot",{"title":290,"path":291,"stem":292},"Adguard CIDRE","\u002Ffr\u002Fnonsense\u002Fpython\u002Fadguard-cidre","fr\u002F5.nonsense\u002F2.python\u002F2.adguard-cidre",{"title":294,"path":295,"stem":296},"Lumeex","\u002Ffr\u002Fnonsense\u002Fpython\u002Flumeex","fr\u002F5.nonsense\u002F2.python\u002F3.lumeex",{"title":298,"path":299,"stem":300},"Instameex","\u002Ffr\u002Fnonsense\u002Fpython\u002Finstameex","fr\u002F5.nonsense\u002F2.python\u002F4.instameex",{"title":302,"icon":303,"path":304,"stem":305,"children":306,"page":15},"Bash","i-lucide-file-terminal","\u002Ffr\u002Fnonsense\u002Fbash","fr\u002F5.nonsense\u002F3.bash",[307,311,315,319,323,327],{"title":308,"path":309,"stem":310},"Doublons servarr","\u002Ffr\u002Fnonsense\u002Fbash\u002Fservarr-duplicates","fr\u002F5.nonsense\u002F3.bash\u002F1.servarr-duplicates",{"title":312,"path":313,"stem":314},"Luks backup","\u002Ffr\u002Fnonsense\u002Fbash\u002Fluks-backup","fr\u002F5.nonsense\u002F3.bash\u002F2.luks-backup",{"title":316,"path":317,"stem":318},"Socat Proxy","\u002Ffr\u002Fnonsense\u002Fbash\u002Fsocat-proxy","fr\u002F5.nonsense\u002F3.bash\u002F3.socat-proxy",{"title":320,"path":321,"stem":322},"HotDisk","\u002Ffr\u002Fnonsense\u002Fbash\u002Fhotdisk","fr\u002F5.nonsense\u002F3.bash\u002F4.hotdisk",{"title":324,"path":325,"stem":326},"Backrest Docker Stop","\u002Ffr\u002Fnonsense\u002Fbash\u002Fbackrest-docker-stop","fr\u002F5.nonsense\u002F3.bash\u002F5.backrest-docker-stop",{"title":328,"path":329,"stem":330},"rm Confirmation Guard","\u002Ffr\u002Fnonsense\u002Fbash\u002Frm-confirmation","fr\u002F5.nonsense\u002F3.bash\u002F6.rm-confirmation",{"title":332,"icon":333,"path":334,"stem":335,"children":336,"page":15},"Poubelle","i-noto-recycling-symbol","\u002Ffr\u002Frecycled","fr\u002F6.recycled",[337,340,354],{"title":332,"path":338,"stem":339,"icon":25},"\u002Ffr\u002Frecycled\u002Fsummary","fr\u002F6.recycled\u002F1.summary",{"title":341,"icon":342,"path":343,"stem":344,"children":345,"page":15},"Obsolète","i-lucide-trash-2","\u002Ffr\u002Frecycled\u002Fdeprecated","fr\u002F6.recycled\u002F2.deprecated",[346,350],{"title":347,"path":348,"stem":349},"Wireguard 14","\u002Ffr\u002Frecycled\u002Fdeprecated\u002Fwireguard-14","fr\u002F6.recycled\u002F2.deprecated\u002F1.wireguard-14",{"title":351,"path":352,"stem":353},"File Browser","\u002Ffr\u002Frecycled\u002Fdeprecated\u002Ffile-browser","fr\u002F6.recycled\u002F2.deprecated\u002F2.file-browser",{"title":355,"icon":356,"path":357,"stem":358,"children":359,"page":15},"Alternatives","i-lucide-arrow-left-right","\u002Ffr\u002Frecycled\u002Falternatives","fr\u002F6.recycled\u002F3.alternatives",[360,364,368,372],{"title":361,"path":362,"stem":363},"Plex","\u002Ffr\u002Frecycled\u002Falternatives\u002Fplex","fr\u002F6.recycled\u002F3.alternatives\u002F1.plex",{"title":365,"path":366,"stem":367},"Qbittorrent pour Plex","\u002Ffr\u002Frecycled\u002Falternatives\u002Fqbittorrent-for-plex","fr\u002F6.recycled\u002F3.alternatives\u002F2.qbittorrent for plex",{"title":369,"path":370,"stem":371},"Servarr pour Plex","\u002Ffr\u002Frecycled\u002Falternatives\u002Fservarr-for-plex","fr\u002F6.recycled\u002F3.alternatives\u002F3.servarr for plex",{"title":373,"path":374,"stem":375},"Gitea","\u002Ffr\u002Frecycled\u002Falternatives\u002Fgitea","fr\u002F6.recycled\u002F3.alternatives\u002F4.gitea",{"id":377,"title":328,"body":378,"contributors":938,"description":940,"extension":941,"hideCopyPage":15,"hideHeader":15,"hideToc":15,"links":942,"meta":943,"navigation":944,"path":329,"seo":945,"stem":330,"__hash__":946},"docs_fr\u002Ffr\u002F5.nonsense\u002F3.bash\u002F6.rm-confirmation.md",{"type":379,"value":380,"toc":927},"minimark",[381,389,405,417,628,633,730,734,829,841,845,857,903,923],[382,383],"ellipsis",{"blur":384,"left":385,"top":386,"width":387,"z-index":388},"140px","0px","10rem","40rem","60",[390,391,392,396,397,400,401,404],"p",{},[393,394,395],"code",{},"rm"," ne demande pas deux fois. Pas de corbeille, pas de « êtes-vous sûr », surtout pas avec ",[393,398,399],{},"sudo"," devant, où un espace de trop ou la mauvaise variable peut effacer quelque chose que vous n'avez pas la permission de revérifier. C'est la seule habitude vraiment destructrice qu'un terminal vous inculque, et le correctif ne demande aucun outil supplémentaire, juste quelques lignes dans ",[393,402,403],{},".bashrc",".",[390,406,407,408,410,411,413,414,416],{},"L'idée est de masquer la commande ",[393,409,399],{}," par une fonction Bash du même nom. Tous les autres usages de ",[393,412,399],{}," passent toujours directement, mais dès que le premier argument est ",[393,415,395],{},", elle s'arrête et pose la question.",[418,419,424],"pre",{"className":420,"code":421,"filename":403,"language":422,"meta":423,"style":423},"language-bash shiki shiki-themes github-dark material-theme github-dark","# rm confirmation\nsudo() {\n  if [ \"$1\" = \"rm\" ]; then\n    echo -n \"Are you sure you want to delete files\u002Ffolders with sudo? (y\u002Fn) \"\n    read ans\n    if [[ $ans == [Yy]* ]]; then\n      command sudo rm \"${@:2}\"\n    else\n      echo \"Deletion cancelled.\"\n    fi\n  else\n    command sudo \"$@\"\n  fi\n}\n","bash","",[393,425,426,435,448,486,505,514,546,570,576,589,595,601,616,622],{"__ignoreMap":423},[427,428,431],"span",{"class":429,"line":430},"line",1,[427,432,434],{"class":433},"sDvJj","# rm confirmation\n",[427,436,438,441,445],{"class":429,"line":437},2,[427,439,399],{"class":440},"sCTWK",[427,442,444],{"class":443},"s8jd1","()",[427,446,447],{"class":443}," {\n",[427,449,451,455,458,462,466,469,473,475,478,480,483],{"class":429,"line":450},3,[427,452,454],{"class":453},"sJLGa","  if",[427,456,457],{"class":443}," [",[427,459,461],{"class":460},"s8K8j"," \"",[427,463,465],{"class":464},"sDMaj","$1",[427,467,468],{"class":460},"\"",[427,470,472],{"class":471},"sJPTy"," =",[427,474,461],{"class":460},[427,476,395],{"class":477},"s11XM",[427,479,468],{"class":460},[427,481,482],{"class":443}," ];",[427,484,485],{"class":453}," then\n",[427,487,489,493,497,499,502],{"class":429,"line":488},4,[427,490,492],{"class":491},"sJGgK","    echo",[427,494,496],{"class":495},"sJWha"," -n",[427,498,461],{"class":460},[427,500,501],{"class":477},"Are you sure you want to delete files\u002Ffolders with sudo? (y\u002Fn) ",[427,503,504],{"class":460},"\"\n",[427,506,508,511],{"class":429,"line":507},5,[427,509,510],{"class":491},"    read",[427,512,513],{"class":477}," ans\n",[427,515,517,520,523,527,530,532,535,538,541,544],{"class":429,"line":516},6,[427,518,519],{"class":453},"    if",[427,521,522],{"class":443}," [[",[427,524,526],{"class":525},"slcoZ"," $ans ",[427,528,529],{"class":471},"==",[427,531,457],{"class":443},[427,533,534],{"class":525},"Yy",[427,536,537],{"class":443},"]",[427,539,540],{"class":471},"*",[427,542,543],{"class":443}," ]];",[427,545,485],{"class":453},[427,547,549,552,555,558,561,564,567],{"class":429,"line":548},7,[427,550,551],{"class":491},"      command",[427,553,554],{"class":477}," sudo",[427,556,557],{"class":477}," rm",[427,559,560],{"class":460}," \"${",[427,562,563],{"class":471},"@:",[427,565,566],{"class":525},"2",[427,568,569],{"class":460},"}\"\n",[427,571,573],{"class":429,"line":572},8,[427,574,575],{"class":453},"    else\n",[427,577,579,582,584,587],{"class":429,"line":578},9,[427,580,581],{"class":491},"      echo",[427,583,461],{"class":460},[427,585,586],{"class":477},"Deletion cancelled.",[427,588,504],{"class":460},[427,590,592],{"class":429,"line":591},10,[427,593,594],{"class":453},"    fi\n",[427,596,598],{"class":429,"line":597},11,[427,599,600],{"class":453},"  else\n",[427,602,604,607,609,611,614],{"class":429,"line":603},12,[427,605,606],{"class":491},"    command",[427,608,554],{"class":477},[427,610,461],{"class":460},[427,612,613],{"class":464},"$@",[427,615,504],{"class":460},[427,617,619],{"class":429,"line":618},13,[427,620,621],{"class":453},"  fi\n",[427,623,625],{"class":429,"line":624},14,[427,626,627],{"class":443},"}\n",[629,630,632],"h2",{"id":631},"comment-ça-marche","Comment ça marche",[634,635,636,657,674,696,717],"ul",{},[637,638,639,642,643,645,646,649,650,652,653,656],"li",{},[393,640,641],{},"sudo() { ... }"," définit une fonction nommée ",[393,644,399],{},". Bash cherche les fonctions avant de chercher les commandes du ",[393,647,648],{},"PATH",", donc taper ",[393,651,399],{}," dans un terminal lance désormais celle-ci au lieu de ",[393,654,655],{},"\u002Fusr\u002Fbin\u002Fsudo",", sans aucune bidouille d'alias.",[637,658,659,662,663,665,666,669,670,673],{},[393,660,661],{},"if [ \"$1\" = \"rm\" ]"," ne regarde que le tout premier mot après ",[393,664,399],{},". ",[393,667,668],{},"sudo rm -rf \u002Fsrv\u002Fdocker\u002Fvieille-stack"," correspond, ",[393,671,672],{},"sudo apt update"," non.",[637,675,676,677,680,681,684,685,688,689,688,692,695],{},"En cas de correspondance, elle affiche la question, lit la réponse dans ",[393,678,679],{},"$ans",", et ",[393,682,683],{},"[[ $ans == [Yy]* ]]"," accepte ",[393,686,687],{},"y",", ",[393,690,691],{},"Y",[393,693,694],{},"yes",", tout ce qui commence par un Y dans l'une ou l'autre casse.",[637,697,698,701,702,705,706,709,710,712,713,716],{},[393,699,700],{},"command sudo rm \"${@:2}\""," est la partie qui supprime réellement. ",[393,703,704],{},"command"," contourne la fonction pour qu'elle ne s'appelle pas elle-même, et ",[393,707,708],{},"${@:2}"," représente tous les arguments après ",[393,711,395],{},", donc ",[393,714,715],{},"-rf \u002Fsrv\u002Fdocker\u002Fvieille-stack"," est transmis tel quel.",[637,718,719,720,722,723,726,727,404],{},"Tout ce qui n'est pas ",[393,721,395],{}," tombe dans le ",[393,724,725],{},"else"," et s'exécute exactement comme si la fonction n'existait pas : ",[393,728,729],{},"command sudo \"$@\"",[629,731,733],{"id":732},"linstaller","L'installer",[735,736,738,743,758,762,765,769,781,785,811,825],"steps",{"level":737},"3",[739,740,742],"h3",{"id":741},"ouvrir-la-config-de-votre-shell","Ouvrir la config de votre shell",[418,744,747],{"className":420,"code":745,"filename":746,"language":422,"meta":423,"style":423},"nano ~\u002F.bashrc\n","Terminal",[393,748,749],{"__ignoreMap":423},[427,750,751,755],{"class":429,"line":430},[427,752,754],{"class":753},"sEgDM","nano",[427,756,757],{"class":477}," ~\u002F.bashrc\n",[739,759,761],{"id":760},"coller-la-fonction","Coller la fonction",[390,763,764],{},"Ajoutez le bloc ci-dessus à la fin du fichier, puis enregistrez et quittez.",[739,766,768],{"id":767},"recharger","Recharger",[418,770,772],{"className":420,"code":771,"filename":746,"language":422,"meta":423,"style":423},"source ~\u002F.bashrc\n",[393,773,774],{"__ignoreMap":423},[427,775,776,779],{"class":429,"line":430},[427,777,778],{"class":491},"source",[427,780,757],{"class":477},[739,782,784],{"id":783},"essayer","Essayer",[418,786,790],{"className":787,"code":788,"filename":746,"language":789,"meta":423,"style":423},"language-console shiki shiki-themes github-dark material-theme github-dark","$ sudo rm -rf \u002Ftmp\u002Ftest\nAre you sure you want to delete files\u002Ffolders with sudo? (y\u002Fn) n\nDeletion cancelled.\n","console",[393,791,792,800,806],{"__ignoreMap":423},[427,793,794,797],{"class":429,"line":430},[427,795,796],{"class":443},"$",[427,798,799],{"class":525}," sudo rm -rf \u002Ftmp\u002Ftest\n",[427,801,802],{"class":429,"line":437},[427,803,805],{"class":804},"s8-mJ","Are you sure you want to delete files\u002Ffolders with sudo? (y\u002Fn) n\n",[427,807,808],{"class":429,"line":450},[427,809,810],{"class":804},"Deletion cancelled.\n",[390,812,813,814,816,817,688,819,688,821,824],{},"Répondez ",[393,815,687],{}," et elle s'exécute pour de vrai. Tout ce qui n'est pas ",[393,818,395],{},[393,820,672],{},[393,822,823],{},"sudo systemctl restart docker",", passe sans question.",[739,826,828],{"id":827},"terminé","Terminé !",[830,831,832,833,836,837,840],"note",{},"Tout ceci vit dans ",[393,834,835],{},"~\u002F.bashrc",", donc ne s'applique qu'à votre shell interactif, pas aux scripts, aux tâches cron ni à la session d'un autre utilisateur. C'est bien le but : attraper vous, en train de taper, pas un programme qui appelle ",[393,838,839],{},"sudo rm"," volontairement.",[629,842,844],{"id":843},"ce-que-ça-nattrapera-pas","Ce que ça n'attrapera pas",[390,846,847,848,850,851,853,854,856],{},"C'est un garde-fou, pas un bac à sable. Il ne se déclenche que lorsque ",[393,849,395],{}," est littéralement le premier mot après ",[393,852,399],{},", donc tout ce qui atteint ",[393,855,395],{}," d'une autre façon passe à côté :",[634,858,859,878,887,895],{},[637,860,861,864,865,868,869,864,872,875,876],{},[393,862,863],{},"sudo -i rm -rf \u002F"," ou ",[393,866,867],{},"sudo su -c \"rm -rf \u002F\"",", le premier argument est ",[393,870,871],{},"-i",[393,873,874],{},"su",", pas ",[393,877,395],{},[637,879,880,883,884,886],{},[393,881,882],{},"sudo bash -c \"rm -rf \u002Fsrv\u002Fdocker\"",", même raison, ",[393,885,395],{}," est enfoui dans la chaîne que bash exécute",[637,888,889,892,893],{},[393,890,891],{},"sudo find \u002Fsrv\u002Fdocker -delete",", qui supprime tout aussi définitivement, et n'appelle jamais ",[393,894,395],{},[637,896,897,899,900,902],{},[393,898,395],{}," sans ",[393,901,399],{}," sur des fichiers qui vous appartiennent déjà",[390,904,905,906,913,914,918,919,922],{},"La vraie protection contre cette dernière catégorie, c'est une sauvegarde en bonne et due forme, ",[907,908,912],"a",{"href":909,"rel":910},"https:\u002F\u002Fgithub.com\u002Fgarethgeorge\u002Fbackrest",[911],"nofollow","Backrest"," et le ",[907,915,917],{"href":916},"\u002Fnonsense\u002Fbash\u002Fbackrest-docker-stop","script d'arrêt Docker"," traité ailleurs dans cette section, ou autre chose. Cette fonction vaut quand même le coup : les accidents qu'elle attrape sont ceux qui arrivent réellement, un ",[393,920,921],{},"sudo rm -rf"," tapé trop vite avec une faute dans le chemin, pas une tentative délibérée de la contourner.",[924,925,926],"style",{},"html pre.shiki code .sDvJj, html code.shiki .sDvJj{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sCTWK, html code.shiki .sCTWK{--shiki-light:#B392F0;--shiki-default:#82AAFF;--shiki-dark:#B392F0}html pre.shiki code .s8jd1, html code.shiki .s8jd1{--shiki-light:#E1E4E8;--shiki-default:#89DDFF;--shiki-dark:#E1E4E8}html pre.shiki code .sJLGa, html code.shiki .sJLGa{--shiki-light:#F97583;--shiki-light-font-style:inherit;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .s8K8j, html code.shiki .s8K8j{--shiki-light:#9ECBFF;--shiki-default:#89DDFF;--shiki-dark:#9ECBFF}html pre.shiki code .sDMaj, html code.shiki .sDMaj{--shiki-light:#79B8FF;--shiki-light-font-style:inherit;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit}html pre.shiki code .sJPTy, html code.shiki .sJPTy{--shiki-light:#F97583;--shiki-default:#89DDFF;--shiki-dark:#F97583}html pre.shiki code .s11XM, html code.shiki .s11XM{--shiki-light:#9ECBFF;--shiki-default:#C3E88D;--shiki-dark:#9ECBFF}html pre.shiki code .sJGgK, html code.shiki .sJGgK{--shiki-light:#79B8FF;--shiki-default:#82AAFF;--shiki-dark:#79B8FF}html pre.shiki code .sJWha, html code.shiki .sJWha{--shiki-light:#79B8FF;--shiki-default:#C3E88D;--shiki-dark:#79B8FF}html pre.shiki code .slcoZ, html code.shiki .slcoZ{--shiki-light:#E1E4E8;--shiki-default:#EEFFFF;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sEgDM, html code.shiki .sEgDM{--shiki-light:#B392F0;--shiki-default:#FFCB6B;--shiki-dark:#B392F0}html pre.shiki code .s8-mJ, html code.shiki .s8-mJ{--shiki-light:#79B8FF;--shiki-default:#EEFFFF;--shiki-dark:#79B8FF}",{"title":423,"searchDepth":437,"depth":437,"links":928},[929,930,937],{"id":631,"depth":437,"text":632},{"id":732,"depth":437,"text":733,"children":931},[932,933,934,935,936],{"id":741,"depth":450,"text":742},{"id":760,"depth":450,"text":761},{"id":767,"depth":450,"text":768},{"id":783,"depth":450,"text":784},{"id":827,"depth":450,"text":828},{"id":843,"depth":437,"text":844},[939],"Djeex","Une petite fonction Bash qui enveloppe sudo et demande confirmation avant de lancer rm, pour qu'une faute de frappe n'efface pas des fichiers appartenant à root.","md",null,{},true,{"title":328,"description":940},"i5ycPBgmSwQDwSWfIHzR3Fp4mwdpo4xv2ZuWGc8Gi84",[948,950],{"title":324,"path":325,"stem":326,"description":949,"children":-1},"Un script bash qui arrête les conteneurs Docker avant une sauvegarde Backrest et les redémarre après, pour des sauvegardes de bases de données sans dump complexe.",{"title":332,"path":338,"stem":339,"description":951,"icon":25,"children":-1},"Des tutoriels obsolètes gardés pour référence, et des applications alternatives remplacées ailleurs sur le site mais qui fonctionnent toujours très bien.",1788645852110]