我正在尝试将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
答案 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将自动访问其命令行参数中的任何现有文件,触发各种副作用,例如提示不安全的局部变量等。