从终端调用elisp时如何处理密码提示

时间:2014-06-22 15:27:56

标签: bash shell emacs elisp

我正在尝试将elisp用作shell脚本语言。我正在写一个脚本,我需要访问一个用gpg加密的文件。我不知道如何处理密码提示。在下面的示例中,他从命令行(bash)调用程序。

首先尝试:

#!/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))))

这允许我在终端输入密码,但密码以明文显示。

第二次尝试

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

这会产生错误gpg: cannot open tty /dev/tty: No such device or address

1 个答案:

答案 0 :(得分:2)

你可能不走运。您的第一个示例建议即使read-passwd也不会在非交互式会话中隐藏密码输入,因为insert-file会向EPA调用加密文件,而加密文件又会使用read-passwd作为GPG密码输入

尝试使用M-x report-emacs-bug向Emacs维护者报告此问题,要求他们在非交互式会话中禁止read-passwd中的输入回显。这就是我所期待的行为。

目前,您无法解决此限制,因为Emacs不会将底层TTY暴露给Emacs Lisp代码,因此您无法在底层TTY设备上手动禁用输入回显。

根据我的写作经验和贡献一些非交互式Emacs Lisp程序,我个人建议不要将Emacs用于非交互式脚本。对于这样的程序来说,这是一个糟糕的平台。 API是有限的,并且有很多隐含的行为阻碍了非交互式程序,你无法摆脱它们。

例如,您无法安全地将命令行参数传递给Emacs,因为Emacs将自动访问其命令行参数中的任何现有文件,触发各种副作用,例如提示不安全的局部变量等。