问题
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