Est-il possible de sauvegarder en tant que sudo dans nano après avoir oublié de courir en tant que sudo?

50

Souvent, je modifie un fichier avec nano, essaie de sauvegarder et d’obtenir une erreur d’autorisation car j’ai oublié de l’exécuter en tant que sudo. Existe-t-il un moyen rapide de devenir sudo sans devoir rouvrir et rééditer le fichier?

Kit Sunde
la source
la fusion avec cette question a été suggérée. Fondamentalement, le même problème, mais vim. J'envisage la fusion ... même si je considère également le fait que les instructions spécifiques à vim ne fonctionneront pas nano.
Xenoterracide
1
@xenaterracide - Je pense que la question vim est un cas particulier de celui-ci, car celle-ci a en fait une solution et il semble que le cas général n'en a aucune. Je ne suis pas sûr non plus, à vous de décider. :)
Kit Sunde le
Vous pouvez effectuer un mappage dans votre fichier .vimrc pour appeler facilement la fonction sudo tee: <pre> <code> "Autorise l’écriture dans des fichiers avec privilèges root. Cmap w !! w! Sudo tee%> / dev / null </ pre> < / code>
jasonwryan
@xenoterracide: La réponse de Caleb à propos de Nano est utile, alors je pense que nous devrions garder celle-ci uniquement à propos de Nano.
Mikel
1
@ Mikel, j'ai décidé que la fusion est invalide. nanon'est pas vim... et aucune nanosolution semblable à vimne s'est présentée.
Xenoterracide

Réponses:

39

Non, vous ne pouvez pas donner à un programme en cours d'exécution les autorisations dont il ne dispose pas au démarrage. Ce serait le trou de sécurité appelé «élévation de privilèges» 1.

Deux choses que vous pouvez faire:

  1. Enregistrez dans un fichier temporaire dans / tmp ou ailleurs, fermez l'éditeur, puis transférez le contenu du fichier temporaire dans le fichier que vous avez modifié. sudo cp $TMPFILE $FILE. Notez qu'il n'est pas recommandé de l'utiliser mvpour cela en raison du changement de propriétaire du fichier et des autorisations qu'il est susceptible d'entraîner. Vous souhaitez simplement remplacer le contenu du fichier et non le paramètre réservé au fichier lui-même.
  2. Mettez l'éditeur en arrière-plan avec Ctrl+ z, modifiez la propriété du fichier ou les autorisations afin de pouvoir y écrire, puis utilisez-le fgpour revenir à l'éditeur et le sauvegarder. N'oubliez pas de corriger les autorisations!

¹ Certains éditeurs sont en mesure de le faire en lançant un nouveau processus avec des autorisations différentes et en transmettant les données à ce processus pour qu'il les enregistre. Voir par exemple cette question connexe pour d'autres solutions d'éditeurs avancés permettant l'écriture du tampon de fichier dans un canal de processus. Nano n'a pas la capacité de lancer un nouveau processus ou de transmettre des données à d'autres processus, il est donc exclu.

Caleb
la source
Excellent. Merci Caleb. Je viens de rencontrer ce problème il y a environ 30 minutes. :)
boehj
2
@Caleb Vous pouvez utiliser la commande tee de vim pour faire ce que vous décrivez::w !sudo tee
@hellojesus Brilliant astuce. Si vous voulez bien écrire votre réponse, je peux l'enlever de la mienne. Je pense que des personnes autres que les nano-utilisateurs se retrouvent dans cette situation et peuvent se retrouver ici.
Caleb
4
Cette question est censée être à propos de nano. Si nous commençons à inclure des réponses à propos de Vim ici, à quoi sert cette question? Nous avons déjà En train de devenir racine depuis Vim pour Vim.
Mikel
2
Enregistrer dans un fichier temporaire dans / tmp - Comment enregistrer dans un fichier temporaire lorsque vous êtes dans nano?
Anand Rockzz
7

Je viens d'essayer nano, et ce qui m'a le plus surpris, c'est qu'il ne vous avertit même pas que le fichier est en lecture seule lorsque vous commencez à essayer de le modifier. ( UPDATE: Apparemment, nano 2.2 avertit; 2.0 non. )

Voici un script (de base) qui fait ça.

Il vérifie si vous pouvez éditer le fichier et si vous ne le pouvez pas, il lance "nano" en tant que root.

/ usr / local / bin / edit (ou ~ / bin / edit )

sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            sudo=true
            ;;
        n|N)
            sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${sudo:+sudo} "$editor" "$1"

Et une commande que j'ai appelée viewafin que vous puissiez éviter l'invite si vous savez que vous ne ferez aucune modification.

/ usr / local / bin / view (ou ~ / bin / view )

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Il existe déjà un programme appelé viewVi / Vim, alors n'hésitez pas à suggérer un meilleur nom.
(Mais je pense qu'une mise en œuvre complète de ce programme rendrait Vi viewinutile.)


Versions complètes

Mikel
la source
1
Cela vous avertit réellement. La question serait alors quelle version vous utilisez. De plus, sur les systèmes basés sur Debian, le système des alternatives convient mieux à ce que vous suggérez.
0xC0000022L
2
Pour votre information: [ Read ... lines (Warning: No write permission) ]est ce qui apparaît juste au-dessus des deux lignes d’aide pour les raccourcis (bas de l’écran). La version Nano est 2.2.4.
0xC0000022L
Ah, ça ne prévient pas dans nano 2.0, c'est ce que je testais avec.
Mikel
cool on a réglé ça :)
0xC0000022L