How do I handle password prompts when calling elisp from the terminal

末鹿安然 提交于 2019-12-19 10:52:15

问题


I'm trying to use elisp as a shell script language. I'm writing a script where I need access to a file encrypted with gpg. I'm not sure how to handle the password prompt. In the examples below, he program is called from the command line (bash).

First try:

#!/usr/bin/emacs --script 
(setq passwd-file "~/password.gpg") 
  (save-excursion   
    (let ((passwd-buffer (find-file passwd-file)))
      (switch-to-buffer passwd-buffer)
      (princ (buffer-substring 1 30))))

This lets me enter the password in the terminal, but the password is shown in plaintext.

Second try

#!/usr/bin/emacs --script
(setq passwd-file "~/password.gpg") 
(setq pstring (shell-command-to-string (concat "gpg -d " passwd-file)))
(princ pstring)

This gives the error gpg: cannot open tty /dev/tty: No such device or address


回答1:


You are likely out of luck. You first example suggests that even read-passwd does not hide the password input in a non-interactive session, as insert-file calls out to EPA for encrypted files, which in turn uses read-passwd for GPG password input.

Try to report this to the Emacs maintainers with M-x report-emacs-bug, asking them to suppress input echo in read-passwd in non-interactive sessions. That'd be the behaviour I'd expect.

For now, you cannot work around this limitation, because Emacs does not expose the underlying TTY to Emacs Lisp code, so you have no chance to manually disable input echo on the underlying TTY device.

From my experience in writing and contributing quite some non-interactive Emacs Lisp programs, I'd personally advise against using Emacs for non-interactive scripts. It's a poor platform for such programs. The API is limited, and there is a lot of implicit behaviour standing in the way of non-interactive programs, which you can't get rid of.

For instance, you cannot safely pass command line arguments to Emacs, since Emacs will automatically visit any existing file in its command line arguments, triggering all sorts of side effects such as prompts for unsafe local variables, etc.



来源:https://stackoverflow.com/questions/24352749/how-do-i-handle-password-prompts-when-calling-elisp-from-the-terminal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!