sudo Custom_Command χωρις κωδικό ~ Mint 21/Ubuntu 22.04

Ήταν κάτι που χρειάστηκα και τελικά κατάφερα να κάνω. :slight_smile:
Για να μην πλατιάσω δεν θα μπω σε λεπτομέρειες του τι ήθελα να κάνω και γιατί, αλλά θα μπω κατευθείαν στο ψητό:
Πως να εκτελέσεις μια ή περισσότερες ενέργειες με την εντολή sudo χωρίς να απαιτείται κωδικός.

Βήμα 1: Δημιουργία Custom Script
Σε οποιονδήποτε editor δημιούργησε ένα αρχείο .sh με την εντολή που θέλεις να τρέξεις. Για παράδειγμα αυτό που έκανα εγώ:

#!/bin/sh
ln -s /media/ /run

Στη συνέχεια αποθήκευσε το ως filename.sh στην τοποθεσία της αρεσκείας σου. Εγώ το αποθήκευσα ως symlinkit.sh στο ~/Documents. Με το πέρας της διαδικασίας μην ξεχάσεις να κάνεις το αρχείο .sh εκτελέσιμο (executable).

Σημαντικό: Σ’ αυτό το σημείο, για λόγους ασφαλείας, πριν προχωρήσουμε στο επόμενο βήμα κάνουμε αρχείο .sh writable μόνο απο τον root:

sudo chown root:root ~/Documents/symlinkit.sh

Με ls -l ~/Documents/symlinkit.sh μπορώ να τσεκάρω τα δικαιώματα του αρχείου.

Βήμα 2: Δημιουργία Symbolic Link του αρχειου filename.sh στο /usr/bin
Στην δική μου περίπτωση άνοιξα ένα τερματικό και έδωσα την εντολή:

sudo ln -s ~/Documents/symlinkit.sh /usr/bin/symlinkit

Τώρα δίνοντας στο τερματικό την (custom) εντολή sudo symlinkit εκτελείται η εντολή που έβαλα στο αρχείο symlinkit.sh :slight_smile:
Είμαι σχεδόν έτοιμος, το μόνο που μένει είναι να κάνω την συγκεκριμένη εντολή να τρέχει χωρίς την απαίτηση κωδικού στο επόμενο και τελικό βήμα.

Βήμα 3: Προσθήκη εξαίρεσης κωδικού της εντολής
Δίνω στο τερματικό την εντολή

sudo EDITOR=nano visudo

Και προσθέτω στο αρχείο sudoers.tmp την ακόλουθη γραμμή:

vasilis ALL=(ALL) NOPASSWD:/usr/bin/symlinkit

image

Όπου vasilis βάζεις το δικό σου όνομα χρήστη. Και στο NOPASSWD: το δικό σου symbolic link που βρίσκεται εντός του /usr/bin/.
Για περισσότερες απο μια εξαιρέσεις κωδικού χρησιμοποιείται το κόμμα, για παράδειγμα:

vasilis ALL=(ALL) NOPASSWD:/usr/bin/symlinkit,/usr/sbin/reboot

(ω ναι, το reboot και το shutdown βρίσκονται στο /usr/sbin και φυσικά μπορείτε να προσθέσετε εξαιρέσεις και για μη ‘καστομιές’ :relieved: )

5 «Μου αρέσει»

Κι ένα update:
Αν θέλετε για κάποιο λόγο να εκτελέσετε την εντολή μέσα απο ένα .desktop file, χωρίς τερματικό, δημιουργείτε ένα .desktop file όπως στο παράδειγμα:

[Desktop Entry]
Exec=bash -c 'sudo symlinkit;$SHELL'
Terminal=false
Type=Application
Encoding=UTF-8
Name=My_App_Name
Icon=My_Icon_Name_OR_/full/icon/path/icon.png




Btw αυτός είναι ένας καλός τρόπος να εκτελείς μια ή περισσότερες εντολές μέσω ένος .desktop file… Μια άλλη εφαρμογή που θα μπορούσε να έχει, με ενεργοποιημένο Terminal αυτή τη φορά, είναι η εξής:

Exec=bash -c 'sudo apt update && sudo apt upgrade && sudo apt autoremove;$SHELL'
Terminal=true
2 «Μου αρέσει»

Σημείωση ασφαλείας, στο σημείο

sudo ln -s ~/Documents/symlinkit.sh /usr/bin/symlinkit

είναι βασικά σαν να κάνει το sudo γενικώς password-free καθώς το αρχείο που κάνει target το link είναι επεξεργάσιμο από το χρήστη χωρίς ανάγκη επιπλέον δικαιωμάτων και άρα μπορεί να χρησιμοποιηθεί για να τρεχθεί το οτιδήποτε.

Επίσης η επεξεργασία του sudoers είναι προτιμότερο (μάλιστα στη κορυφή του αρχείου γράφει και MUST αν και τεχνικά αυτό δεν ισχύει φυσικά) να γίνει μέσω της εντολής

sudo EDITOR=nano visudo

διότι η visudo παρέχει διάφορες δικλείδες για πιθανά σφάλματα που θα μπορούσαν να κλειδώσουν το χρήστη από τη sudo χρήση.

6 «Μου αρέσει»

Σωστή η σημείωση ασφαλείας, συνεπώς αφαιρείται το sudo απο το script και η εντολή δίνεται ως sudo my_command. (στην περίπτωση μου sudo symlink)

Θα γίνουν και οι κατάλληλες διορθώσεις και στον οδηγό


Update: Έχει ενημερωθεί ο οδηγός, ευχαριστώ για την επισήμανση. :slight_smile:

1 «Μου αρέσει»

Δεν είναι πρόβλημα το sudo στο αρχείο αλλά το ίδιο το αρχείο. Αυτό που γίνεται είναι πως μπορείς να το κάνεις edit χωρίς root για να τρέξεις το οτιδήποτε με root χωρίς κωδικό. Για παράδειγμα αν κάνεις printf '#!/bin/sh\n/bin/sh' > ~/Documents/symlinkit.sh, τότε με sudo symlinkit αποκτάς ένα root shell χωρίς να χρειαστεί κάποιος κωδικός.

Προσεγγίσεις είναι είτε να γίνει το ~/Documents αρχείο writeable μόνο από root (sudo chown root:root $file), είτε να διαγραφεί και να δημιουργηθεί εξ´ αρχής ως root ((cat $file && rm $file) | sudo tee $file), είτε να γίνει cp αντί για link (sudo cp $file /usr/bin/symlinkit). Θα έλεγα καλύτερα το τελευταίο γιατί τα links είναι μόνιμος πονοκέφαλος όσον αφορά την ασφάλεια.

Παλαιότερα για desktop χρήση ίσως αυτό να ήταν ασήμαντο γιατί το Xorg είναι σαν ελβετικό τυρί από άποψη ασφαλείας αλλά τώρα με Wayland που προστατεύει με keylogging το root γίνεται στόχος και για desktop χρήστες.

5 «Μου αρέσει»

Έχεις δίκιο, προσωπικά θα κρατήσω αυτή τη λύση για μενα και θα την προσθέσω και στον οδηγό
(ο οποίος πλέον έχει περισσότερα edit απ’ ότι βήμματα :smiley: ).

Και πάλι ευχαριστώ.

Ένα πολύ ωραίο και επεξηγηματικό άρθρο (στην αγγλική βέβαια) είναι το παρακάτω:

Understanding sudoers(5) syntax

Εξηγεί τι στο καλό είναι αυτά τα ALL:ALL κλπ που προσωπικά μου την έδινε πολύ που δεν ήξερα τι σήμαιναν.

Επίσης, εξηγεί πως αντί για το path του executable μπορείς να βάλεις ένα digest του executable για περισσότερη ασφάλεια.

Ρίξτε το μια ματιά, νομίζω πως αξίζει.

2 «Μου αρέσει»

Καλημέρα!

Ευχαριστώ για την συνεισφορά, θα το κοιτάξω :smiley:

2 «Μου αρέσει»