Αποστολή αρχείων με δικαιώματα εγγραφής στα μέλη ενός τμήματος

Ξεκίνησε από Δημήτρης Γκίνης, 14 Δεκ 2011, 11:15:14 ΠΜ

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

Δημήτρης Γκίνης

Δεδομένου ότι έχω δημιουργήσει 9 τμήματα (a1, a2,a3, b1,b2,b3,c1,c2,c3),
και για κάθε τμήμα 12 λογαριασμούς όσοι και οι clients (πχ a1-1, a1-2...a1-12, b1-1,b1-2,...,b1-12 κλπ),
αν θέλω να στείλω όλα τα αρχεία που βρίσκονται πχ στον φάκελο /home/teacher/ΑΠΟΣΤΟΛΗ
στους προσωπικούς φακέλους των μελών ενός τμήματος πχ του a1
(δηλ  στους φακέλους /home/a1-1,       /home/a1-2/,    /home/a1-3/,    ..../home/a1-12/ )
πως θα έπρεπε να γραφτεί το σχετικό script το οπίο να παίρνει ως παράμετρο το όνομα του τμήματος??
Θα προτιμούσα να έχουν δικαίωμα εγγραφής στο αρχείο αυτό

arliba

Παράθεση από: Δημήτρης Γκίνης στις 14 Δεκ 2011, 11:15:14 ΠΜ
Δεδομένου ότι έχω δημιουργήσει 9 τμήματα (a1, a2,a3, b1,b2,b3,c1,c2,c3),
και για κάθε τμήμα 12 λογαριασμούς όσοι και οι clients (πχ a1-1, a1-2...a1-12, b1-1,b1-2,...,b1-12 κλπ),
αν θέλω να στείλω όλα τα αρχεία που βρίσκονται πχ στον φάκελο /home/teacher/ΑΠΟΣΤΟΛΗ
στους προσωπικούς φακέλους των μελών ενός τμήματος πχ του a1
(δηλ  στους φακέλους /home/a1-1,       /home/a1-2/,    /home/a1-3/,    ..../home/a1-12/ )
πως θα έπρεπε να γραφτεί το σχετικό script το οπίο να παίρνει ως παράμετρο το όνομα του τμήματος??
Θα προτιμούσα να έχουν δικαίωμα εγγραφής στο αρχείο αυτό

Η απάντηση αφορά το απλο script, το bourne-shell .
Καταλαβαίνεις ότι ένα script είναι bourne, γιατί ξεκινάει από
#!/bin/sh

την παράμετρο την περνάς γράφοντας το όνομα του script, μετά κενό , και μετά την παράμετρο.
Δηλαδή:

/Home/myscript a1-1

μέσα στο script, την τιμή a1-1 την χειρίζεσαι σαν $1

ομοίως

/Home/myscript a1-1 a2-1

oι μεταβλητές που χειρίζεσαι μέσα στο script είναι οι $1 $2

κλπ $3 $4 για περισσότερες μεταβλητές.

Η $0 νομίζω είναι το ίδιο το όνομα του script δηλαδή αν μέσα στο script γράψεις
echo $0

θα σου βγάλει ως απάντηση
/Home/myscript

ενώ φυσικά αν μέσα στο script γράψεις
echo $1

θα σου βγάλει την πρώτη παράμετρο (δηλαδή το a1-1 στην περίπτωσή μας)


Τώρα καμιά φορά όταν δεν περνάει ο ειδικός χαρακτήρας / από το $1 θα πρέπει να το γράψεις σαν \/ ή ακόμα και \\/ ανάλογα το nesting που κάνεις
στο script σου.
"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

Δημήτρης Γκίνης

@arliba: Καταρχάς ευχαριστώ για την απάντηση.
Αυτό με την παράμετρο το είχα καταλάβει βλέποντας άλλα script.(btw το όνομα του τμήματος είναι a1,b1 κλπ)
Αυτό που δεν ξέρω είναι :
1) πως συντάσσεται  η for ώστε να εκτελεστεί 12 φορές (μία κάθε ένα από τα μέλη του τμήματος - παραμέτρου του script)
2) πως θα γραφτεί η εντολή για την αντιγραφή πχ:
cp -r /home/teacher/APOSTOLH/* /home/$1-$i/ (σωστό είναι αυτό??)



arliba

Παράθεση από: Δημήτρης Γκίνης στις 14 Δεκ 2011, 12:06:39 ΜΜ
@arliba: Καταρχάς ευχαριστώ για την απάντηση.
Αυτό με την παράμετρο το είχα καταλάβει βλέποντας άλλα script.(btw το όνομα του τμήματος είναι a1,b1 κλπ)
Αυτό που δεν ξέρω είναι :
1) πως συντάσσεται  η for ώστε να εκτελεστεί 12 φορές (μία κάθε ένα από τα μέλη του τμήματος - παραμέτρου του script)
2) πως θα γραφτεί η εντολή για την αντιγραφή πχ:
cp -r /home/teacher/APOSTOLH/* /home/$1-$i/ (σωστό είναι αυτό??)

http://steve-parker.org/sh/loops.shtml

Θα σου έλεγα να μην χρησιμοποιείς το /bin/sh αλλά καλύτερα το /bin/csh
ή ακόμα και κάποιο ευκολότερο κέλυφος ή και perl ή Python.

Ειδικά για το /bin/sh έχουν σημασία ακόμα και τα κενα, όταν γράφεις κώδικα και συντάσεις τις εντολές.
Δηλαδή αν αφήσεις δύο κενά αντί για ένα , δεν τρέχει.

Επίσης στο shell, καμιά φορά, ανάλογα την εντολή πρέπει το $1 να το βαλεις σε μονό ' ή διπλό " quote .
Και φυσικά προσοχή στους ειδικούς χαρακτήρες, το / είναι ειδικός χαρακτήρας και μέσα στον κώδικα
των εντολών (π.χ. της if) αντιμετωπίζεται με \, δηλαδή \/
"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

alkisg

Δημήτρη ανεβάζω ένα script ονόματι group-exec το οποίο είναι πιο γενικής χρήσης και θα πρέπει να υπερκαλύπτει τις ανάγκες σου. Φτιάξε ένα φάκελο /home/teacher/bin/ και βάλ' το εκεί μέσα, και μην ξεχάσεις να το κάνεις εκτελέσιμο με chmod +x /home/teacher/bin/group-exec

Παράδειγμα εκτέλεσης:
group-exec a1,a2 cp '/home/teacher/Επιφάνεια εργασίας/Άσκηση 1.pdf' 'Επιφάνεια εργασίας/'

Να παρατηρήσω όμως σε αυτό το σημείο, ότι εναλλακτικά θα μπορούσες να διαλέξεις τους συνδεδεμένους μαθητές μέσα από τα sch-scripts, και να κάνεις εκτέλεση εντολής, και στο διάλογο που θα εμφανιστεί να γράψεις απλά
cp "/home/teacher/Επιφάνεια εργασίας/Άσκηση 1.pdf" "$ΗΟΜΕ/Επιφάνεια εργασίας/"
Αυτό βέβαια εκτελεί την εντολή μόνο για το συνδεδεμένο τμήμα π.χ. a1, οπότε θα πρέπει να το ξανακάνεις μόλις ξανασυνδεθεί το επόμενο τμήμα π.χ. a2.

Κώδικας του group-exec:
Κώδικας: Bash
#!/bin/sh
# Copyright (C) 2011-2019 Alkis Georgopoulos <github.com/alkisg>

die () {
	echo "$@" >&2
	exit 1
}

usage() {
	die "Usage:
	group-exec group1,groupN command params

Executes a command for all users in the specified groups.
The command is executed from the user accounts, with sudo.
Make sure that you escape any special shell characters, so that they're
evaluated from the target user shell, not from the initial shell.

Example:
	group-exec a1,a2 cp '/home/teacher/Public/Exercise1.odt' 'Desktop/'
Copies an exercise from the teacher Public dir to the students' Desktop dir.
"
}

group_members() {
# Echoes the members of the specified groups, while removing any duplicates.
	set $(echo "$1" | tr ',' ' ')
	for group
	do
		getent group "$group" | cut -d':' -f4 | tr ',' '\n'
	done | sort -u | tr '\n' ' ' | sed  's/^ //;s/ $/\n/'
}

test $# -gt 1 || usage
members=$(group_members "$1")
test -n "$members" || die "No users found in these groups: $1"
shift

# Require a password the next time sudo is ran.
sudo -k

# Do the actual work.
for user in $members; do
	echo "Executing: sudo -i -u $user --" "$@"
	sudo -i -u "$user" -- "$@"
done


Υ.Γ. το sh δεν διακρίνει μεταξύ πολλών ή ενός κενού ως μέρος του συντακτικού του, δηλαδή το `ls file` είναι το ίδιο με το `ls      file`. Εννοείται βέβαια ότι όλα τα προγράμματα λαμβάνουν υπόψη τους τα κενά που υπάρχουν στις ίδιες τις παραμέτρους, δηλαδή το `ls "file 1"` είναι διαφορετικό από το `ls "file     1"`.
Παρεμπιπτόντως, προσωπικά δεν προτείνω τη χρήση csh.

Δημήτρης Γκίνης

Σας ευχαριστώ όλους για τις απαντήσεις. Θα τα δοκιμάσω αύριο.

arliba

και προσοχή στα κενά ανάμεσα! 

μπορεί το
ls file να είναι το ίδιο με το ls   file

αλλά σε διάφορες συντάξεις if , for, while , ιδίως όταν χρησιμοποιείς το [  κλπ δεν ισχύει πάντα αυτό.

οπότε για να είσαι σίγουρος, μην αφήνεις παραπάνω από ένα κενό όταν δεν χρειάζεται.
"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

alkisg

Παράθεση από: arliba στις 14 Δεκ 2011, 06:39:50 ΜΜ
αλλά σε διάφορες συντάξεις if , for, while , ιδίως όταν χρησιμοποιείς το [  κλπ δεν ισχύει πάντα αυτό.

οπότε για να είσαι σίγουρος, μην αφήνεις παραπάνω από ένα κενό όταν δεν χρειάζεται.

Μπορείς να μας δώσεις ένα παράδειγμα όπου το ένα κενό είναι διαφορετικό από τα δύο κενά, στη σύνταξη κάποιας από τις εντολές που ανέφερες;

arliba

Παράθεση από: alkisg στις 14 Δεκ 2011, 09:22:32 ΜΜ
Μπορείς να μας δώσεις ένα παράδειγμα όπου το ένα κενό είναι διαφορετικό από τα δύο κενά, στη σύνταξη κάποιας από τις εντολές που ανέφερες;

είπα να προσέχει τα κενά

από ότι θυμάμαι το
if [ $x -eq 4 ]

δεν ήταν το ίδιο με το
if[$x -eq 4]

ούτε καν με το
if [$x -eq 4]

χτυπούσε error. και ξέρεις τι error χτυπάει, ψάξε βρες!

Τώρα που το ξαναβλέπω, τα λιγότερα κενά ήταν συνήθως το πρόβλημα και όχι τα περισσότερα.

αλλά έχω καιρό να γράψω σε sh.
το διόρθωσαν;
"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

alkisg

Παράθεση από: arliba στις 14 Δεκ 2011, 10:37:49 ΜΜ
Τώρα που το ξαναβλέπω, τα λιγότερα κενά ήταν συνήθως το πρόβλημα και όχι τα περισσότερα.

αλλά έχω καιρό να γράψω σε sh.
το διόρθωσαν;

Δεν το διόρθωσαν, ποτέ τα περισσότερα κενά δεν ήταν πρόβλημα.

Για το [, ενημερωτικά, δεν είναι ειδικός χαρακτήρας σαν την παρένθεση, αλλά είναι εξωτερική εντολή:
Κώδικας: shell
$ which [
/usr/bin/[

$ /usr/bin/[ --help
Usage: test EXPRESSION
...


Γι' αυτό και το [κάτι είναι λάθος αν δεν βάλεις κενό ανάμεσα, γιατί ψάχνει εξωτερική εντολή με όνομα εκτελέσιμου [κάτι, το οποίο δεν υπάρχει.

(παραλείπω επίτηδες την ενσωματωμένη υλοποίηση του [ για απλούστευση της εξήγησης)

arliba

Παράθεση από: alkisg στις 14 Δεκ 2011, 11:08:02 ΜΜ

Γι' αυτό και το [κάτι είναι λάθος αν δεν βάλεις κενό ανάμεσα, γιατί ψάχνει εξωτερική εντολή με όνομα εκτελέσιμου [κάτι, το οποίο δεν υπάρχει.

(παραλείπω επίτηδες την ενσωματωμένη υλοποίηση του [ για απλούστευση της εξήγησης)

αυτό λέω, είναι πράγματα αυτά να πάει να γράψει καποιος αρχάριος την if, και να πετάει syntax error επειδη δεν έβαλε ένα κενό; To ίδιο ισχύει και στην while.

και δεν είναι το μόνο, και σε άλλα μου έβγαζε θυμάμαι error όταν έγραφα, αλλά δεν θυμάμαι ποια είναι τώρα να σου πω.

Η συμβουλη παραμένει λοιπον. Προσοχή στα κενά, ειδικά στα λιγότερα σίγουρα.

Παράθεση από: alkisg στις 14 Δεκ 2011, 11:08:02 ΜΜ
ποτέ τα περισσότερα κενά δεν ήταν πρόβλημα.
Για αυτό που λες για τα περισσότερα κενά
π.χ. στην for

for i in 1 2 3 4 5
do

είναι το ίδιο με το

for i in 1                   2                              3 4 5 do

χωρίς να είμαι σίγουρος βέβαια...μαλλον και αυτό δεν θα παίξει.

"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

arliba

Και για να μην τα λέμε όλα στραβά για το shell , η άποψή μου είναι ότι ναι μεν
έχει χάλια σύνταξη και δεν κάνει για αρχαρίους, αλλά έχει μια μεγάλη δύναμη που δεν την
βρίσκεις εύκολα αλλού.

το |

αυτό δημιουργεί νέα proccess (όπου το stdin της μιας επικοινωνεί με το stdout της άλλης),
οπότε αν έχεις cluster κατάλληλα διαμορφωμένο (π.χ. με το LinuxPMI),
μπορείς να στείλεις την μια process στο ένα μηχάνημα και την άλλη στο άλλο.

Με αποτέλεσμα να τρέχει το shell απίστευτα σφαίρα με τα process να εκτελούνται παράλληλα και
ταυτόχρονα σε δύο ή και παραπάνω μηχανήματα.

Λίγες γλώσσες μπορούν να το κάνουν αυτό , με μια μόνο γραμμή κώδικα να μπορούν
να τρέχουν τόσο εύκολα σε δύο ή και παραπάνω μηχανήματα, ταυτόχρονα και παράλληλα.
"Ευτυχώς, το στέκι είναι (τελικά) μια όαση Δημοκρατίας" -- Keep Growing
Μετά το law-bay.com, καιρός είναι να πάμε και για το law-bay.edu !
Το υπουργείο κυνοβολευτικής υγείας προειδοποιεί: Τα κείμενα που προκύπτουν από ψηφοφορίες. προκαλούν σύγχυση, θυμό, εφίδρωση και υψηλούς καρδιακούς σφυγμούς σε όσους πάσχουν από ψηφοφοβία.

exanemou

ΠαράθεσηΔημήτρη ανεβάζω ένα script ονόματι group-exec το οποίο είναι πιο γενικής χρήσης και θα πρέπει να υπερκαλύπτει τις ανάγκες σου. Φτιάξε ένα φάκελο /home/teacher/bin/ και βάλ' το εκεί μέσα, και μην ξεχάσεις να το κάνεις εκτελέσιμο με chmod +x /home/teacher/bin/group-exec

Παράδειγμα εκτέλεσης:
group-exec a1,a2 cp '/home/teacher/Επιφάνεια εργασίας/Άσκηση 1.pdf' 'Επιφάνεια εργασίας/'

Να παρατηρήσω όμως σε αυτό το σημείο, ότι εναλλακτικά θα μπορούσες να διαλέξεις τους συνδεδεμένους μαθητές μέσα από τα sch-scripts, και να κάνεις εκτέλεση εντολής, και στο διάλογο που θα εμφανιστεί να γράψεις απλά
cp "/home/teacher/Επιφάνεια εργασίας/Άσκηση 1.pdf" "$ΗΟΜΕ/Επιφάνεια εργασίας/"
Αυτό βέβαια εκτελεί την εντολή μόνο για το συνδεδεμένο τμήμα π.χ. a1, οπότε θα πρέπει να το ξανακάνεις μόλις ξανασυνδεθεί το επόμενο τμήμα π.χ. a2.
   
α)εφτιαξα το παραπανω κομμάτι κωδικα ακολουθώντας τις οδηγιες αλλα δεν αντιγραφηκε το αρχειο που επιθυμουσα είτε προσπαθώντας να το αποστειλω σε δυο τμήματα είτε σε ένα
β)δοκιμασα και την εναλλακτικη λυση με τα sch-scripts και πάλι ...τίποτα
γ)δοκιμασα και το παρακάτω
Παράθεσηfor f in /home/*/Επιφάνεια\ εργασίας; do
    if [ ! -e "$f/Υλικό μαθήματος" ]; then
        sudo ln -s "$HOME/Δημόσια" "$f/Υλικό μαθήματος"
    fi
done
αλλα ο φακελος υλικο δημιουργηθηκε μονο στην επιφάνεια εργασιας του server και σε κανεναν χρηστη Τι κανω λάθος;

exanemou