Προς το περιεχόμενο

Αποστολή .txt file από client σε server - Python


haphip

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

spacer.pngΚαλησπέρα! Έχω τους κώδικες που παραθέτω παρακάτω. Αυτό που κάνω είναι να στέλνω ένα αρχείο το alice.txt από τον client στον server. Έχω τον client και τον server σε ξεχωριστούς φακέλους για να βλέπω αν γίνεται σωστά η μεταφορά των αρχείων. Το θέμα είναι πως δημιουργείται αρχείο alice.txt στον φάκελο του server αλλά είναι κενό ενώ θα έπρεπε να έχει μέσα τα δεδομένα που είχε και το alice.txt που στέλνει ο client. Έχω δοκιμάσει ένα σωρο πράματα (όσα είναι στα σχόλια του κώδικα προέρχονται από δοκιμές). Δε στέλνω όλο τον κώδικα γιατι έχει πολλά ακόμα που δεν χρειάζονται και είμαι σίγουρη πως το θέμα είναι μέσα σε αυτές τις γραμμές οπότε μη σας μπλέκω με περιττά. Μήπως μπορεί κάποιος να με βοηθήσει? Ευχαριστώ εκ των προτέρων.

client1.png

server1.png

Επεξ/σία από haphip
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

21 ώρες πριν, haphip είπε

Το θέμα είναι πως δημιουργείται αρχείο alice.txt στον φάκελο του server αλλά είναι κενό ενώ θα έπρεπε να έχει μέσα τα δεδομένα που είχε και το alice.txt που στέλνει ο client.

Πιθανολογώ, ό,τι δεν έχει τα σωστά δικαώματα στο φάκελο του server, θα πρότεινα να κάνει μία δοκιμή με chmod 777 στον φάκελο του server, και αν λειτουργήσει ,κατόπιν φτιάχνει τα δικαιώματα του φακέλου όπως πρέπει. :)

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@htaccess Αν το αρχείο φτιάχνεται, τότε δεν είναι ζήτημα permissions.

@haphip Με τον κώδικα που ανέβασες δεν είναι σαφές ποιο είναι το πρόβλημα.

Δες εδώ: https://pymotw.com/3/socket/tcp.html To παράδειγμα του είναι ένα κλικ πιο περίπλοκο από αυτό που θες καθώς στέλνει πίσω data από το server στον client, παρόλα αυτά δουλεύει και θα σου επιτρέψει να καταλάβεις καλύτερα τι πρέπει να κάνεις ή, έστω, πως να φτιάξεις ένα minimum example το οποίο θα μπορείς να ανεβάσεις εδώ για να το δούμε

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
3 ώρες πριν, pmav99 είπε

@htaccess Αν το αρχείο φτιάχνεται, τότε δεν είναι ζήτημα permissions.

 

Aν ο φάκελος έχει chmod 644 (owner τον root), το script εκτελείται ως root, τότε ο χρήστης θα βλέπει 0 bytes τα αρχεία που δημιουργεί το script.  :) 

Επεξ/σία από htaccess
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
1 hour ago, htaccess said:

Aν ο φάκελος έχει chmod 644 (owner τον root), το script εκτελείται ως root, τότε ο χρήστης θα βλέπει 0 bytes τα αρχεία που δημιουργεί το script.  :) 

Το πρόβλημα είναι ότι δεν καλεί την μέθοδο write() και όχι τα permissions.

file = open("aaaa.txt", "wb")

Ανεξάρτητα του ποιος είναι ο χρήστης ο οποίος εκτελεί το process, αν ο χρήστης δεν έχει δικαίωμα να γράψει το αρχείο η κλήση της open() θα αποτύχει. Από τη στιγμή που το αρχείο δημιουργείται, σημαίνει ότι η open() επιστρέφει τον file descriptor του αρχείου άρα τα permissions είναι ΟΚ :)

 

Επεξ/σία από pmav99
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
2 ώρες πριν, pmav99 είπε

Ανεξάρτητα του ποιος είναι ο χρήστης ο οποίος εκτελεί το process, αν ο χρήστης δεν έχει δικαίωμα να γράψει το αρχείο η κλήση της open() θα αποτύχει. Από τη στιγμή που το αρχείο δημιουργείται, σημαίνει ότι η open() επιστρέφει τον file descriptor του αρχείου άρα τα permissions είναι ΟΚ :)

Προφανώς δεν με κατάλαβες, δημιούργησε ένα φάκελο από τον root πάνω στο desktop του x χρήστη, δώσε δικαιώματα 644 σε αυτό το φάκελο από root, δημιούργησε τώρα από το root ένα αρχείο aaaa.txt, κάνε το edit (vi/nano whatever) και γράψε κάτι μέσα, κλείστο και πήγαινε από το χρήστη τώρα να δεις ότι είναι 0 bytes.

Συνεπώς αυτό που θέλω να πω ειναί, ότι το script (με full permissions)μπορεί να γράφει δεδομένα κανονικά στο αρχείο μέσα στο φάκελο, άλλα μέσω του χρήστη που προσπαθεί να το  διαβάσει/ανοίξει, να είναι αδύνατο αν δεν fixαρει τα permissions. :)

Επεξ/σία από htaccess
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

22 hours ago, htaccess said:

κλείστο και πήγαινε από το χρήστη τώρα να δεις ότι είναι 0 bytes.

Συγνώμη αλλά δεν δουλεύει ακριβώς έτσι.

Για να ανοίξεις ένα αρχείο κάνεις ένα system call. Το άνοιγμα του αρχείου γίνεται σε ένα συγκεκριμένο mode πχ read-only, ή write κτλ. Αν τα permissions δεν είναι σωστά για το mode που θες να ανοίξεις το αρχείο, τότε το system call αποτυγχάνει.

Αυτό μπορεί να φανεί ως εξής:

sudo mkdir /tmp/root_owned
sudo touch /tmp/root_owned/just_a_file
python -c 'open("/tmp/root_owned/just_a_file", "r")' && echo 'Opening the file for reading as normal user succeeds'
python -c 'open("/tmp/root_owned/just_a_file", "w")' || echo 'Opening the file for writing as normal user fails...'

Η τελευταία γραμμή θα δώσει το εξής traceback:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
PermissionError: [Errno 13] Permission denied: '/tmp/root_owned/just_a_file'

Δηλαδή το process απέτυχε να ανοίξει το αρχείο σε write mode. Σε read όμως δεν είχε κανένα θέμα

Ο λόγος που μπορείς να ανοίξεις το αρχείο σε vim/nano κτλ είναι γιατί οι αλλαγές που κάνεις σώζονται σε ένα buffer και όχι στο δίσκο (μπορεί να σώζονται και στον δίσκο αλλα σε temporary αρχείο). Μόνο όταν κάνεις save αγγίζεις το filesystem και γίνεται το permission check

Αν θες περισσότερες πληροφορίες, άνοιξε νέο θέμα γιατί εδώ είμαστε off topic.

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

 

3 ώρες πριν, pmav99 είπε

Συγνώμη αλλά δεν δουλεύει ακριβώς έτσι.

Για να ανοίξεις ένα αρχείο κάνεις ένα system call. Το άνοιγμα του αρχείου γίνεται σε ένα συγκεκριμένο mode πχ read-only, ή write κτλ. Αν τα permissions δεν είναι σωστά για το mode που θες να ανοίξεις το αρχείο, τότε το system call αποτυγχάνει.
Αυτό μπορεί να φανεί ως εξής:

sudo mkdir /tmp/root_owned
sudo touch /tmp/root_owned/just_a_file
python -c 'open("/tmp/root_owned/just_a_file", "r")' && echo 'Opening the file for reading as normal user succeeds'
python -c 'open("/tmp/root_owned/just_a_file", "w")' || echo 'Opening the file for writing as normal user fails...'

Η τελευταία γραμμή θα δώσει το εξής traceback:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
PermissionError: [Errno 13] Permission denied: '/tmp/root_owned/just_a_file'

Δηλαδή το process απέτυχε να ανοίξει το αρχείο σε write mode. Σε read όμως δεν είχε κανένα θέμα

Ο λόγος που μπορείς να ανοίξεις το αρχείο σε vim/nano κτλ είναι γιατί οι αλλαγές που κάνεις σώζονται σε ένα buffer και όχι στο δίσκο (μπορεί να σώζονται και στον δίσκο αλλα σε temporary αρχείο). Μόνο όταν κάνεις save αγγίζεις το filesystem και γίνεται το permission check

Εξυπακούεται ό,τι θα το κάνεις save.

 

 

328965737_Screenshotfrom2020-11-1021-11-09.png.0e8de2002851e74a283506fb456a9ce5.png

3 ώρες πριν, pmav99 είπε

Αν θες περισσότερες πληροφορίες, άνοιξε νέο θέμα γιατί εδώ είμαστε off topic.

Οκ, σταματάω εδώ. :)

Επεξ/σία από htaccess
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 εβδομάδες αργότερα...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...