Να πάρει δικαιώματα root σε ένα αρχείο στο εσωτερικό του vi;

ψήφοι
227

Συχνά, κατά την επεξεργασία ρυθμίσεων αρχεία, θα ανοίξει ένα με vi και στη συνέχεια, όταν πάω να το αποθηκεύσετε συνειδητοποιήσουμε ότι δεν είχα τύπου

sudo vi filename

Υπάρχει κάποιος τρόπος για να δώσει προνόμια sudo vi για να αποθηκεύσετε το αρχείο εκεί; Θυμάμαι να δει κάτι γι 'αυτό, ενώ κοιτώντας ψηλά κάποια πράγματα σχετικά vi πριν από λίγο καιρό, αλλά τώρα δεν μπορώ να το βρω.

Δημοσιεύθηκε 04/08/2008 στις 04:34
πηγή χρήστη
Σε άλλες γλώσσες...                            


11 απαντήσεις

ψήφοι
276

% αντικαθίσταται με το τρέχον όνομα αρχείου, έτσι μπορείτε να χρησιμοποιήσετε:

:w !sudo tee %

( vimΘα ανιχνεύσει ότι το αρχείο έχει αλλάξει και να ρωτήσω αν θέλετε να το να επαναφόρτωση.)

Ως συντόμευση, μπορείτε να ορίσετε τη δική σας εντολή. Βάλτε τα εξής σας .vimrc:

command W w !sudo tee % >/dev/null

Με τα παραπάνω μπορείτε να πληκτρολογήσετε :W<Enter>για να αποθηκεύσετε το αρχείο. Από τότε που έγραψα αυτό, έχω βρει έναν καλύτερο τρόπο (κατά τη γνώμη μου) για να γίνει αυτό:

cmap w!! w !sudo tee >/dev/null %

Με αυτό τον τρόπο μπορείτε να πληκτρολογήσετε :w!!και θα επεκταθεί σε πλήρη γραμμή εντολών, αφήνοντας το δρομέα στο τέλος, ώστε να μπορείτε να αντικαταστήσετε το %με ένα όνομα αρχείου από τη δική σας, αν θέλετε.

Απαντήθηκε 31/08/2008 στις 20:23
πηγή χρήστη

ψήφοι
29

Σε γενικές γραμμές, δεν μπορείτε να αλλάξετε την πραγματική ταυτότητα των χρηστών της διαδικασίας vi, αλλά μπορείτε να το κάνετε αυτό:

:w !sudo tee myfile
Απαντήθηκε 04/08/2008 στις 07:52
πηγή χρήστη

ψήφοι
13

κοινή Προειδοποιήσεις

Η πιο κοινή μέθοδος για να πάρει γύρω από το πρόβλημα του αρχείου μόνο για ανάγνωση είναι να ανοίξει ένα σωλήνα στο τρέχον αρχείο ως υπερ-χρήστης, χρησιμοποιώντας μια εφαρμογή του sudo tee. Ωστόσο, όλες οι πιο δημοφιλείς λύσεις που έχουν βρεθεί γύρω από το Διαδίκτυο έχουν ένα συνδυασμό από διάφορες πιθανές επιφυλάξεις:

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

λύσεις

Για να πάρετε γύρω από όλα αυτά τα θέματα, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Αυτά μπορεί να μειωθεί, με σεβασμό:

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

Εξήγηση

:αρχίζει η εντολή? θα χρειαστεί να πληκτρολογήσετε τον χαρακτήρα σε κανονική λειτουργία για να αρχίσετε να πληκτρολογείτε μια εντολή. Θα πρέπει να παραλείπεται σε σενάρια.

sil[ent]καταστέλλει την έξοδο από την εντολή. Σε αυτήν την περίπτωση, θέλουμε να σταματήσει η Press any key to continue-όπως ερώτησης που εμφανίζεται μετά την εκτέλεση της :!εντολής.

exec[ute]εκτελεί μια σειρά ως εντολή. Δεν μπορεί να τρέχει μόνο :writeεπειδή δεν θα επεξεργαστεί την απαραίτητη κλήση της συνάρτησης.

!αντιπροσωπεύει την :!εντολή: η μόνη εντολή που :writeδέχεται. Κανονικά, :writeδέχεται μια διαδρομή αρχείου στο οποίο να γράφουν. :!από μόνη της εκτελεί μια εντολή σε ένα κέλυφος (για παράδειγμα, χρησιμοποιώντας bash -c). Με :write, θα εκτελέσετε την εντολή στο κέλυφος και, στη συνέχεια, γράψτε το σύνολο του φακέλου για να stdin.

sudoθα πρέπει να είναι προφανής, δεδομένου ότι γι 'αυτό είστε εδώ. Εκτελέστε την εντολή ως υπερ-χρήστη. Υπάρχουν πολλές πληροφορίες γύρω από την «καθαρή για το πώς αυτό λειτουργεί.

teeσωλήνες stdinγια το συγκεκριμένο αρχείο. :writeΘα γράψω για stdin, τότε ο υπερ-χρήστης teeθα λαμβάνει τα περιεχόμενα του αρχείου και να γράψει το αρχείο. Δεν θα δημιουργήσει ένα νέο αρχείο - μόλις αντικαταστήσει τα περιεχόμενα - έτσι τρόποι αρχείο και τα χαρακτηριστικά θα πρέπει να διατηρηθεί.

shellescape()διαφεύγει ειδικούς χαρακτήρες στη δεδομένη διαδρομή του αρχείου ως κατάλληλα για το τρέχον κέλυφος. Με ένα μόνο παράμετρο, θα ήταν συνήθως μόνο περικλείουν τη διαδρομή σε εισαγωγικά, όπως απαιτείται. Από τη στιγμή που στέλνετε σε μια πλήρη γραμμή εντολών του κελύφους, θα θέλετε να περάσετε μια μη μηδενική τιμή ως το δεύτερο επιχείρημα για να ενεργοποιήσετε backslash-διαφυγή των άλλων ειδικών χαρακτήρων που θα μπορούσαν αλλιώς ταξίδι μέχρι το κέλυφος.

@%διαβάζει τα περιεχόμενα του %μητρώου, το οποίο περιέχει το όνομα του αρχείου του τρέχοντος ρυθμιστικού του. Δεν είναι απαραιτήτως μια απόλυτη διαδρομή, ώστε να εξασφαλίζεται ότι δεν έχετε αλλάξει τον τρέχοντα κατάλογο. Σε ορισμένες λύσεις, θα δείτε το σύμβολο εμπορική-σε παραλείπεται. Ανάλογα με τη θέση, %είναι μια έγκυρη έκφραση, και έχει το ίδιο αποτέλεσμα με την ανάγνωση του %μητρώου. Ένθετα μέσα σε ένα άλλο έκφρασης η συντόμευση είναι γενικά αρθεί, ωστόσο: όπως στην προκειμένη περίπτωση.

>NULκαι >/dev/nullανακατευθύνει stdoutσε μηδενική συσκευή της πλατφόρμας. Ακόμα κι αν έχουμε σιγήσει την εντολή, δεν θέλουμε όλα τα γενικά έξοδα που συνδέονται με σωληνώσεις stdinπίσω στο vim - καλύτερα να το πετάξει όσο το δυνατόν νωρίτερα. NULείναι η μηδενική συσκευή για DOS, MS-DOS και Windows, δεν είναι ένα έγκυρο αρχείο. Από τα Windows 8 ανακατεύθυνση σε NUL δεν οδηγούν σε ένα αρχείο με το όνομα NUL να γράφεται. Δοκιμάστε να δημιουργήσετε ένα αρχείο στην επιφάνεια εργασίας σας ονομάζεται NUL, με ή χωρίς επέκταση αρχείου: θα είστε σε θέση να το πράξει. (Υπάρχουν πολλά άλλα ονόματα των συσκευών των Windows που θα μπορούσε να αξίζει να γνωρίσουμε.)

~ / .Vimrc

Εξαρτάται από την πλατφόρμα

Φυσικά, ακόμα δεν θέλουν να απομνημονεύσουν εκείνους και πληκτρολογήστε τους κάθε φορά. Είναι πολύ πιο εύκολο να χαρτογραφήσει την κατάλληλη εντολή σε μια απλούστερη εντολή του χρήστη. Για να το κάνετε αυτό σε POSIX, θα μπορούσατε να προσθέσετε την ακόλουθη γραμμή για να σας ~/.vimrcαρχείο, δημιουργώντας, αν δεν υπάρχει ήδη:

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

Αυτό θα σας επιτρέψει να πληκτρολογήσετε το: W (case-sensitive) εντολή για να γράψει το τρέχον αρχείο με δικαιώματα υπερ-χρήστη - πολύ πιο εύκολο.

Ανεξάρτητα από την πλατφόρμα

Χρησιμοποιώ μια πλατφόρμα-ανεξάρτητη ~/.vimrcαρχείο που συγχρονίζει σε όλους τους υπολογιστές, έτσι πρόσθετες λειτουργίες, multi-platform με τη δική μου. Εδώ είναι μια ~/.vimrcμόνο τις σχετικές ρυθμίσεις:

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
Απαντήθηκε 13/10/2012 στις 07:54
πηγή χρήστη

ψήφοι
10

Εάν χρησιμοποιείτε το Vim , υπάρχει ένα σενάριο διαθέσιμο το όνομα sudo.vim . Αν διαπιστώσετε ότι έχετε ανοίξει ένα αρχείο που θα πρέπει να έχουν πρόσβαση root για να διαβάσετε, τύπου

: E sudo:%
Vim αντικαθιστά το% με το όνομα του τρέχοντος αρχείου, και sudo:δίνει εντολή στην sudo.vim σενάριο να αναλάβει για την ανάγνωση και τη γραφή.

Απαντήθηκε 24/09/2008 στις 05:12
πηγή χρήστη

ψήφοι
7

Συμβουλές Ryan είναι γενικά καλή, ωστόσο, εάν μετά από το βήμα 3, δεν κινούνται το προσωρινό αρχείο? αυτό θα έχουν τη λανθασμένη ιδιοκτησία και τα δικαιώματα. Αντ 'αυτού, sudoeditτο σωστό αρχείο και να διαβάσετε τα περιεχόμενα (με :rή κάτι παρόμοιο) του προσωρινού αρχείου.

Αν μετά από το βήμα 2, χρησιμοποιούν :w!για να αναγκάσει το αρχείο που θα γραφτεί.

Απαντήθηκε 04/08/2008 στις 05:04
πηγή χρήστη

ψήφοι
3

Όταν πηγαίνετε σε κατάσταση εισαγωγής σε ένα αρχείο που πρέπει να έχουν πρόσβαση sudo για να επεξεργαστείτε, μπορείτε να πάρετε ένα μήνυμα κατάστασης λέγοντας

-- INSERT IGNORE  -- W10: Warning: Changing a readonly file

Αν μου λείπει ότι, σε γενικές γραμμές κάνω

:w ~/edited_blah.tmp
:q

..έπειτα..

sudo "cat edited_blah.tmp > /etc/blah"

..ή..

sudo mv edited_blah.tmp /etc/blah

Υπάρχει πιθανώς λιγότερο έμμεσο τρόπο να το κάνει, αλλά λειτουργεί.

Απαντήθηκε 12/08/2008 στις 19:37
πηγή χρήστη

ψήφοι
1

Εδώ είναι ένα άλλο που έχει εμφανιστεί από τότε αυτό το ερώτημα απαντήθηκε, ένα plugin που ονομάζεται SudoEdit που παρέχει SudoRead και SudoWrite λειτουργίες, οι οποίες θα εξ ορισμού προσπαθήσει να χρησιμοποιήσει sudo πρώτο και su αν αυτό αποτύχει: http://www.vim.org/scripts/ script.php; SCRIPT_ID = 2709

Απαντήθηκε 29/01/2010 στις 18:21
πηγή χρήστη

ψήφοι
1

Μια γρήγορη Google φαίνεται να δίνουν αυτή τη συμβουλή:

  1. Μην προσπαθήσετε να επεξεργαστείτε αν είναι μόνο για ανάγνωση.
  2. Ίσως να είναι σε θέση να αλλάξετε τα δικαιώματα για το αρχείο. (Το αν ή όχι θα σας επιτρέψει να αποθηκεύσετε είναι μέχρι και τον πειραματισμό.)
  3. Αν εξακολουθείτε να επεξεργαστείτε ούτως ή άλλως, να αποθηκεύσετε σε ένα προσωρινό αρχείο και στη συνέχεια να προχωρήσουμε.

http://ubuntuforums.org/showthread.php?t=782136

Απαντήθηκε 04/08/2008 στις 04:39
πηγή χρήστη

ψήφοι
0

Έχω αυτό μου ~ / .bashrc:

alias svim='sudo vim'

Τώρα κάθε φορά που θα χρειαστεί να επεξεργαστείτε ένα αρχείο ρυθμίσεων που μόλις το ανοίξετε με SVIM.

Απαντήθηκε 19/03/2009 στις 13:51
πηγή χρήστη

ψήφοι
-2

Μια γρήγορη αμυχή που μπορείτε να εξετάσει κάνει μια chmod στο αρχείο που επεξεργάζεστε, να σώσει με το vim, και στη συνέχεια chmod πίσω σε αυτό που ο φάκελος ήταν αρχικά.

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

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

Απαντήθηκε 05/08/2008 στις 23:20
πηγή χρήστη

ψήφοι
-7

χρησιμοποιούν gksudo αντί για sudo για το Gvim δηλαδή

cmap w!! w !gksudo tee >/dev/null %
Απαντήθηκε 30/11/2010 στις 07:33
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more