Εκτέλεση εντολών στους clients με τα sch-scripts

Ξεκίνησε από odysseas, 01 Οκτ 2010, 01:38:07 ΠΜ

« προηγούμενο - επόμενο »

odysseas

Η εφαρμογή διαχείρισης ΣΕΠΕΗΥ που παρέχεται από τα sch-scripts δίνει τη δυνατότητα στον καθηγητή να εκτελέσει μια εντολή σε επιλεγμένα τερματικά.

http://wiki.ubuntu-gr.org/sch-scripts/Documentation#A.2BA5UDugPEA60DuwO1A8MDtw-

Μου φάνηκε παράξενο το γεγονός ότι δεν ανοίγει κάποιο terminal για την εκτέλεση της εντολής (κυρίως ώστε να μπορεί να δει ο καθηγητής το αποτέλεσμα που έχει η εκτέλεσή της) και ρώτησα τον Άλκη πως υλοποιείται η εκτέλεση της εντολής και γιατί δεν υπάρχει σαν default η δυνατότητα ssh στους clients.

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

Παράθεση
[...] H εκτέλεση δεν γίνεται με ssh αλλά με reverse shell που είναι συνδεδεμένο στο py-twisted network backend των sch-scripts. Εν ολίγοις φαντάσου το σαν το italc client. Δεν υπάρχει ssh εγκατεστημένο στο chroot. [...] Το ssh στο chroot έχει διάφορα αρνητικά:
* Θέματα ασφαλείας (οκ αυτό δεν μας ενδιέφερε και πολύ)
* Πολύ αργή σύνδεση για εκτέλεση εντολών
* Ο δαίμονας τρώει μνήμη
* Είναι εκτός του user session και έτσι δεν μπορείς π.χ. να εκτελέσεις τον gnome-settings-daemon ή τον firefox από εκεί
* Επίσης στο ssh θα συνδεόσουν ως root και όχι ως ο τρέχων user, οπότε χωρίς hacks δεν θα μπορούσες να κάνεις τίποτα ουσιαστικό πέρα από reboot / shutdown κτλ.

Γι' αυτό και το υλοποιήσαμε με reverse shell connections, ώστε να αποφεύγονται όλα τα παραπάνω. Επιπλέον, στους thin clients το ssh δεν θα είχε νόημα αφού το user session είναι στον server.

Θα ήθελα να ρωτήσω όμως και το εξής: αυτός ο τρόπος υλοποίησης αποκλείει τη δυνατότητα να βλέπουμε και το output που προκαλεί η εντολή; Θα μπορούσαμε ίσως να κάνουμε redirect το output σε κάποιο προκαθορισμένο log αρχείο;

alkisg

#1
Παράθεση από: odysseas στις 01 Οκτ 2010, 01:38:07 ΠΜ
Θα ήθελα να ρωτήσω όμως και το εξής: αυτός ο τρόπος υλοποίησης αποκλείει τη δυνατότητα να βλέπουμε και το output που προκαλεί η εντολή; Θα μπορούσαμε ίσως να κάνουμε redirect το output σε κάποιο προκαθορισμένο log αρχείο;
Ο διάλογος εκτέλεσης εντολών είναι κυρίως εργαλείο για τον καθηγητή, ο οποίος π.χ. θα θέλει να τρέξει ένα xdg-open 'http://www.edutv.gr/index.php?option=com_content&task=view&id=1068&Itemid=176'; για να ανοίξει ταυτόχρονα σε όλους κάποιο βίντεο εκπαιδευτικής τηλεόρασης, ή μια άσκηση στο OpenOffice κτλ. Αυτό δεν θα μπορούσε να γίνει μέσω ssh γιατί θα ήταν εκτός του user session.
Το output συνήθως δεν μας ενδιαφέρει. Το stderr αποθηκεύεται στο ~/.xsession-errors, όπως σε όλα τα GUI προγράμματα.

Το ssh/clusterssh κτλ στους thin/fat clients δεν είναι ιδιαίτερα χρήσιμο, αφού όλες οι εντολές που συνήθως χρειαζόμαστε (update προγραμμάτων, editing αρχείων, τερματισμός κτλ) είναι διαθέσιμα από τα μενού των sch-scripts, ή στις πιο δύσκολες περιπτώσεις, από το "άνοιγμα κονσόλας στον εικονικό δίσκο".

Εκτός απροόπτου λοιπόν, output εντολών θα χρειαστεί μόνο για τεχνικούς λόγους. Σ' αυτήν την περίπτωση συνήθως είτε κάνουμε "παρακολούθηση μαθητή" και ανοίγουμε ένα τερματικό, είτε ενεργοποιούμε το SCREEN_02=shell στο lts.conf, οπότε καθόμαστε στον client, πατάμε Alt+Ctrl+F2 και κάνουμε debugging τοπικά. Αν κάποιος θέλει ντε και καλά να το κάνει μέσα από τα sch-scripts (π.χ. για remote support κάποιου client που δεν ξεκινάει), μπορεί να χρησιμοποιήσει την παρακάτω μέθοδο:

  • Λήψη του βοηθήματος reverse-bash
  • Εκτέλεση της εντολής reverse-bash 25547 στο server
  • Από τα sch-scripts, εκτέλεση της εντολής bash -c 'bash 0<>/dev/tcp/10.160.31.10/25547', βάζοντας την IP του server

Έτσι μπορούμε να έχουμε κάτι σαν τερματικό στον client, εντός του user session, όπου μπορούμε και να βλέπουμε το output των εντολών, για παράδειγμα:
$ reverse-bash 25547
Listening on port 25547. Tell the person needing support to run:
  bash 0<>/dev/tcp/<your-external-ip>/25547
Connection from 10.160.31.10 port 25547 [tcp/*] accepted
Enter the commands to execute as student@ltsp123.
To terminate the connection, press Ctrl+D.
whoami
student
hostname
ltsp123
<Ctrl+D>


Αν θέλουμε root και όχι user shell, τότε τρέχουμε sudo bash -c 'bash 0<>/dev/tcp/10.160.31.10/25547' (το sudo σ' αυτήν την περίπτωση δεν είναι πραγματικό, είναι "συνθηματικό" στα sch-scripts ότι θέλουμε η εντολή να εκτελεστεί από τον root sch-client).

Παρόμοια, αν θέλουμε να κάνουμε logging του output μιας εντολής σε αρχείο, μπορούμε να δώσουμε bash -c 'entoli > arxeio'.

Τώρα αν κάποιος θέλει, προφανώς μπορεί να εγκαταστήσει και ssh. Θα με ενδιέφερε όμως να ακούσω παραδείγματα όπου χρειάζεται η εμφάνιση του output των απομακρυσμένων εντολών, πέρα από troubleshooting...

alkisg

#2
Παραθέτω μια γρήγορη μέθοδο να ανοίξουμε ένα root terminal σε thin/fat/standalone clients, εντός της συνεδρίας του μαθητή. Αυτό το τερματικό μπορεί να χρησιμοποιηθεί για ενέργειες όπου ο μαθητής δεν έχει τα απαραίτητα δικαιώματα, για παράδειγμα για format τοπικών δίσκων.

Από τα sch-scripts, πηγαίνουμε Τερματικά » Εκτέλεση εντολής, και γράφουμε το παρακάτω μακρυνάρι:
sudo sh -c 'eval $(tr "\0" "\n" < /proc/$(pidof -s ldm gdm-simple-greeter gnome-session | cut -d" " -f1)/environ | egrep "^XAUTHORITY=|^DISPLAY=") && export DISPLAY XAUTHORITY && exec xterm'


Μέσα από αυτό το τερματικό μπορούμε στη συνέχεια να εκτελέσουμε και γραφικές εφαρμογές όπως το gparted.

odysseas

Απλό και κατανοητό, απορώ πως δεν το σκέφτηκα νωρίτερα   :o

Άλκη, είναι πολύ εξεζητημένη αυτή ως λειτουργία για να ενσωματωθεί στην εφαρμογή διαχείρισης των sch-scripts;

alkisg

#4
Παράθεση από: odysseas στις 15 Οκτ 2010, 01:14:01 ΜΜ
Άλκη, είναι πολύ εξεζητημένη αυτή ως λειτουργία για να ενσωματωθεί στην εφαρμογή διαχείρισης των sch-scripts;
Δε νομίζω ότι είναι εξεζητημένη, μάλιστα πριν λίγο έστειλα mail στη λίστα sch-devs όπου προτείνω να "σπάσουμε" το μενού Τερματικά » Εκτέλεση στο παρακάτω υπομενού:

  • Εκτέλεση » Εκτέλεση εντολής
    Νέα θέση για το υπάρχον μενού Εκτέλεση.
  • Εκτέλεση » Άνοιγμα αρχείου
    Θα καλεί xdg-open 'αρχείο'.
  • Εκτέλεση » Άνοιγμα τερματικού root
    Αυτό που λέγαμε παραπάνω.

Με την ευκαιρία, όσοι έχουν fat clients και θέλουν προσωρινά να δώσουν δικαιώματα sudo σε κάποιον χρήστη που κάθεται σε κάποιο σταθμό εργασίας, μπορούν να εκτελέσουν:
sudo sh -c 'echo "username ALL=NOPASSWD: ALL" >> /etc/sudoers'

Με την παραπάνω, και μέχρι να γίνει επανεκκίνηση του σταθμού εργασίας, ο χρήστης username θα μπορεί να εκτελεί οποιαδήποτε διεργασία χωρίς κωδικό, ακριβώς όπως γίνεται με το live CD του Ubuntu.

Αυτή είναι εξεζητημένη και μόνο για fat clients και δεν θα μπει στο μενού εκτέλεση! ;)

Αντίστοιχη εντολή για το group sudo, η οποία μάλιστα μπορεί να εκτελεστεί και σε όλα τα τερματικά μαζί:
sudo sh -c 'echo "%sudo ALL=NOPASSWD: ALL" >> /etc/sudoers'

alkisg

#5
Νέα κόλπα για προχωρημένους.

Σε αυτή τη σελίδα περιγράφεται ένας πολύ ωραίος τρόπος για να μοιράζονται δύο απομακρυσμένοι άνθρωποι την ίδια κονσόλα (τερματικό), κυρίως για λόγους remote support. Δηλαδή κάτι σαν VNC όπου και οι δύο βλέπουν την ίδια οθόνη, αλλά μόνο για εντολές κονσόλας.

ΟΚ, αυτό μπορεί μεν να φανεί χρήσιμο σε τεχνικούς ΠΛΗΝΕΤ, αλλά τι να το κάνουμε στην τάξη;
Στην τάξη μας ενδιαφέρει το μισό κομμάτι του, δηλαδή να πάρουμε μια κονσόλα ενός thin/fat/standalone σταθμού εργασίας και να την βλέπουμε στο server χωρίς όμως να την βλέπει ο μαθητής. Κάτι σαν το ssh που ζήτησε παραπάνω ο odysseas δηλαδή, αλλά με το επιπρόσθετο πλεονέκτημα ότι η κονσόλα αυτή είναι εντός της συνεδρίας του μαθητή, δηλαδή αν από εκεί τρέξουμε firefox θα ανοίξει στο μαθητή.
Επίσης, για να απλουστεύσουμε περισσότερο τη διαδικασία, θα αδιαφορήσουμε για το κανάλι openssl που για λόγους ασφάλειας προτείνεται στην παραπάνω σελίδα, ενώ θα χρησιμοποιήσουμε το screen αντί του tmux, γιατί συμπεριφέρεται λίγο καλύτερα και δεν έχει πρόβλημα με τα ελληνικά.


Εγκαθιστούμε τα παρακάτω προγράμματα και στο server αλλά και στον εικονικό δίσκο των σταθμών εργασίας:
sudo apt-get install screen socat

Κάνουμε συμπίεση του εικονικού δίσκου και επανεκκινούμε τους clients.

Για να πάρουμε μια κονσόλα εντός της συνεδρίας κάποιου χρήστη, ανοίγουμε ένα τερματικό στο server και τρέχουμε:
socat tcp-listen:1234,keepalive=1 stdio,raw,echo=0


Στη συνέχεια, πάμε στα sch-scripts, κάνουμε δεξί κλικ » εκτέλεση, και γράφουμε:
socat SYSTEM:"exec screen",pty,stderr tcp:server:1234


Γυρνάμε στο τερματικό που είχαμε ανοίξει στο server και βλέπουμε ότι πλέον έχουμε μια κονσόλα του σταθμού εργασίας.

Αν βάλουμε sudo μπροστά,
sudo socat SYSTEM:"exec screen",pty,stderr tcp:server:1234

τότε ανοίγει κονσόλα root αντί για κονσόλα εντός της συνεδρίας του μαθητή.


Αυτές οι δυνατότητες μάλλον θα ενσωματωθούν στα sch-scripts σε κάποια επόμενη έκδοση, δηλαδή

  • Εκτέλεση » Άνοιγμα κονσόλας μαθητή
  • Εκτέλεση » Άνοιγμα κονσόλας διαχειριστή

Δημήτρης Δαλαγιώργος

Ενάντια στην ηλιθιότητα, ακόμα και οι θεοί, μάταια αγωνίζονται.
Friedrich Schiller

alkisg

Για να δώσουμε προσωρινά πρόσβαση στους εσωτερικούς δίσκους σε όλους τους μαθητές, μέσα από τον Επόπτη, δίνουμε:
sudo sed 's/auth_admin_keep/yes/' -i /usr/share/polkit-1/actions/org.freedesktop.udisks.policy

Αυτή η δυνατότητα κανονικά είναι κομμένη για να μην μπορούν π.χ. να πατήσουν delete windows... :)
Με την παραπάνω εντολή, ισχύει μέχρι το επόμενο reboot, ενώ εννοείται ότι μπορούμε να την βάλουμε και στο lts.conf για πιο μόνιμα, με:
RCFILE_01="sed 's/auth_admin_keep/yes/' -i /usr/share/polkit-1/actions/org.freedesktop.udisks.policy"