Neue Sudo-Beleidigungen hinzufügen

Neue Sudo-Beleidigungen hinzufügen

Ich habe diesen Beitrag gerade ein anderes Mal gelesen: Wo werden die Beleidigungen von sudo gespeichert?

Aber ich habe nur eineSchönFrage zu diesen Beleidigungen:

Können wir neue hinzufügen, indem wir weitere Dateien hinzufügen (anstatt einen Header darin zu ändern plugins/sudoers)?

Aktuelle Sudo-Beleidigungsdateien sind:

  • ins_2001.h
  • ins_classic.h
  • ins_csops.h
  • ins_goons.h
  • insults.h

Antwort1

Nein, Sie können nicht einfach Beleidigungen zu einem Verzeichnis „hinzufügen“ und erwarten, dass sie funktionieren. Die einzige Möglichkeit, neue Beleidigungen hinzuzufügen, besteht darin, das Programm neu zu kompilieren, sudosodass diese Beleidigungen zur Kompilierzeit einbezogen werden.

Der Link aus Ihrer Frage (Wo werden die Beleidigungen von sudo gespeichert?) erklärt, was diese Dateien sind:

Die Datei „insulties.h“ enthält Compileranweisungen, welche der oben genannten Beleidigungen in den kompilierten Kernel aufgenommen werden sollen. Sie können tatsächlich Ihre eigene „insulties“-Datei erstellen, den Namen zu „insulties.h“ hinzufügen und neu kompilieren …

Aber Sie MÜSSEN Beleidigungen hinzufügen und dann neu kompilieren, um sie einzuschließen. Dies bedeutet jedoch, dass Sie neu kompilieren müssen, sudowenn Sicherheitsupdates usw. verfügbar sind, und es ist wahrscheinlich, dass dies später zu Sicherheitsproblemen führen kann, wenn Sie nicht mit enthaltenen Sicherheitspatches neu kompilieren.

Antwort2

Sie können neue Beleidigungen nur hinzufügen, indem Sie vorhandene Beleidigungen gleicher oder größerer Länge ersetzen.

Aus der zweiten Antwort in Ihrem Link stammen diese Sätze:

ins_2001.h (Beleidigungen aus „Odyssee im Weltraum“ 2001):

/*
 * HAL insults (paraphrased) from 2001.
 */

"Just what do you think you're doing Dave?",
"It can only be attributed to human error.",

Suchen Sie die Datei

$ grepall "Just what do you think you're doing Dave?"
Binary file /usr/lib/sudo/sudoers.so matches

OK, wir kennen jetzt den Dateinamen. Das war der einfache Teil.

Sichern Sie die Datei

Erstellen Sie zunächst ein Backup (denn daran denken wir immer, nicht wahr?):

$ sudo cp -a /usr/lib/sudo/sudoers{.so,.so.bak}

$ ll /usr/lib/sudo/sudoers{.so,.so.bak}
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so.bak

Erstellen Sie das Skript

Dann erstellen Sie unser Skript mit dem Namen sudoinsults:

#!/bin/bash

# NAME: sudoinsult
# PATH: $HOME/askubuntu/
# DESC: For: https://askubuntu.com/questions/1188779/adding-new-sudo-insults
# DATE: November 14, 2019.

# NOTE: Change sudo insults to personal favorites

# Build array of insults from disk
IFS=$'\n' Arr=( $(cat sudoinsult.txt) )

# Initialize variables
File="/usr/lib/sudo/sudoers.so"
upper=0
Spaces="                                                                     "
Spaces="$Spaces""                                                            "

[[ ${#Arr[@]} -gt 0 ]] && upper=$(( ${#Arr[@]} - 1 ))
[[ $upper -gt 0 ]] && for (( i=0; i<upper; i=i+2 )) ; do
    Search="${Arr[i]}"      # Move array indices to named variables
    Replace="${Arr[i+1]}"   #  for a simpler life.

    printf "Replacing: '%s'\n     With: '%s'\n" "$Search" "$Replace"
    if [[ "${#Search}" -lt "${#Replace}" ]] ; then
        echo "Replacement can't be longer than original"
        continue
    elif [[ "${#Search}" -lt 8 ]] ; then
        echo "Original insult cannot be less than 8 characters"
        continue
    elif [[ "${#Search}" -gt "${#Spaces}" ]] ; then
        echo "Original insult cannot be longer than ${#Spaces} characters"
        continue
    elif [[ "${#Replace}" -lt 1 ]] ; then
        echo "Replacement insult cannot be less than 1 character"
        continue
    elif ! grep "$Search" "$File" >/dev/null ; then
        echo "Search insult not found in $File"
        continue
    fi

    # Pad replacement with spaces as needed.
    ReplaceS="$Replace${Spaces:0:$((${#Search} - ${#Replace}))}"
    [[ "${#ReplaceS}" -ne "${#Search}" ]] && \
        { echo Internal error ReplaceS different length than Search; exit; }

# Looks wrong: https://unix.stackexchange.com/a/354493/200094
#y="${y:0:40}${forty:0:$((40 - ${#y}))}"
#echo "'${y}'"
    sed -i "s/$Search/$ReplaceS/" "$File"
    (( InsultCount++ ))

done

if [[ $upper -gt 0 ]] ; then
    echo "$InsultCount Insults replaced."
else
    echo "Insult file (sudoinsult.txt) does not exist or only has one line." >2
fi

Erstellen der Datendatei

Hoffentlich muss nicht erklärt werden, wie man eine Textdatei erstellt (Hinweis gedit:)

$ cat sudoinsult.txt

Just what do you think you're doing Dave?
Just what do you think you're doing Rick?
It can only be attributed to human error.
It can only be attributed to the beer.

Führen Sie das Skript aus und überprüfen Sie die Ergebnisse

$ sudo ./sudoinsult

Replacing: 'Just what do you think you're doing Dave?'
     With: 'Just what do you think you're doing Rick?'
Replacing: 'It can only be attributed to human error.'
     With: 'It can only be attributed to the beer.'
2 Insults replaced.

$ ll /usr/lib/sudo/sudoers{.so,.so.bak}

-rw-r--r-- 1 root root 316768 Nov 14 17:43 /usr/lib/sudo/sudoers.so
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so.bak

$ grep "Just what do you think you're doing Rick?" /usr/lib/sudo/sudoers.so

Binary file /usr/lib/sudo/sudoers.so matches

$ grep "It can only be attributed to the beer." /usr/lib/sudo/sudoers.so

Binary file /usr/lib/sudo/sudoers.so matches

verwandte Informationen