Question

Je suis en train de créer des touches de raccourci pour certains couramment utilisés commandes shell sudo (par exemple, ayant C-c s course (shell-command "sudo /etc/init.d/apache2 restart")).

J'ai essayé d'utiliser un appel de commande shell droite comme ci-dessus, mais il produit juste ce qui suit à la mémoire tampon de *Shell Command Output*:

[sudo] password for Inaimathi:
Sorry, try again.
[sudo] password for Inaimathi:
Sorry, try again.
[sudo] password for Inaimathi:
Sorry, try again.
sudo: 3 incorrect password attempts

Il ne demande pas vraiment un mot de passe. Je ne veux pas avoir à démarrer Emacs en utilisant sudo emacs, mais je suppose que c'est une option si rien d'autre ne fonctionne.

La solution idéale serait une fonction à partir d'Emacs (par opposition au système d'exploitation tripotage pour modifier le comportement de la coque ou de la commande sudo). Quelque chose comme (sudo-shell-command "dostuff") ou (with-password-prompt (shell-command "sudo dostuff")).

Était-ce utile?

La solution

Que diriez-vous:

(shell-command (concat "echo " (shell-quote-argument (read-passwd "Password? "))
                       " | sudo -S your_command_here"))

Autres conseils

Je l'appelle souvent des commandes à partir Emacs comme aptitude update. scottfrazer solution de pourrait ne pas être aussi utile. commandes synchrones me font attendre depuis longtemps, et si vous exécutez un programme non pris en charge (par exemple, aptitude, qui utilise ncurses ), vous raccrochez Emacs ( Seizième ne sera pas utile), et la charge CPU sera de 100%. Le passage à async-shell-command permet de résoudre cela.

Mais il introduit aussi un nouveau problème. Si la commande échoue, votre mot de passe finira dans un tampon *Messages*:

echo PASSWORD | sudo -S aptitude: exited abnormally with code 1.

Voilà pourquoi je propose la solution suivante:

(defun sudo-shell-command (command)
  (interactive "MShell command (root): ")
  (with-temp-buffer
    (cd "/sudo::/")
    (async-shell-command command)))

Ici « M » en interactive demande le nom du programme dans minibuffer, with-temp-buffer crée un tampon factice, dans lequel on change répertoire pour /sudo::/ utiliser CLOCHARD pour l'invite de sudo.

Ceci est la solution par David Kastrup de sudo commande avec invite de mot de passe minibuffer @ gnu.emacs.help .

Note, vous devriez toujours pas appeler directement aptitude, sinon le sous-processus sera là pour toujours, jusqu'à ce que vous envoyez sudo pkill aptitude.

Lire la coquilles et traite dans le manuel.

Si vous utilisez emacs22 ou version ultérieure, vous pouvez commencer un shell de emacs et exécutez votre commande sudo là. Il va automatiquement vous tirez dans la fenêtre minibuffer votre mot de passe:

M-x shell
sudo whoami

Cela devrait simplement demander votre mot de passe au bas de l'écran ( sans l'afficher).

Solution (au lieu d'une solution de emacs):

Mettre en place une paire de clés ssh afin qu'aucun mot de passe est nécessaire.

Procédure:

  1. run ssh-keygen pour générer une paire de clés. Donnez-leur un nom utile pour les garder triés de tous les autres que vous allez faire une fois que vous avez utilisé à cette
  2. Copier publique un à $HOME/.ssh pour recevoir compte
  3. Gardez private un dans $HOME/.ssh du compte d'envoi (vous pouvez copier à envoyer plusieurs comptes, mais il pourrait être préférable de faire une paire de clés séparés pour chaque machine entrante)
  4. modifier $HOME/.ssh/config sur la machine émettrice de dire ssh quelle touche utiliser
  5. Résultat

sudo tente d'ouvrir le dispositif de terminal (tty) pour lire le mot de passe. Votre processus emacs ne peut pas avoir un terminal de contrôle. sudo -S il dit d'utiliser l'entrée standard pour un mot de passe qui devrait provenir de emacs.

EDIT: La réponse de Scott ci-dessus est de loin préférable à ce hack. Utiliser.

Une solution possible:

Je trouve que la fixation d'un utilitaire demandant un mot de passe par défaut résout ce problème.

Qu'est-ce que je devais faire est d'ajouter Defaults:ALL askpass=/usr/lib/openssh/gnome-ssh-askpass à mon fichier /etc/sudoers (en utilisant sudo visudo, évidemment).

(shell-command "sudo /etc/init.d/apache2 restart") Eval-ing me demande maintenant un mot de passe au lieu d'essayer de le deviner sans succès.

Je ne suis pas accepter cette réponse, à moins il est clair qu'il n'y a pas de meilleure solution; Idéalement, je voudrais quelque chose qui résout le problème en interne pour Emacs au lieu de vous obliger à fouiller votre répertoire /etc.

je suit pour commencer nmap de emacs en tant que root,

http://nakkaya.com/sudoEl.markdown

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top