我试图使用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
发布于 2014-06-22 15:51:07
你很可能运气不好。第一个例子表明,即使是read-passwd也不会在非交互式会话中隐藏密码输入,因为insert-file向环境保护局发出了加密文件的请求,而后者又使用read-passwd进行GPG密码输入。
尝试用M-x report-emacs-bug向Emacs维护人员报告这一点,要求他们在非交互式会话中抑制read-passwd中的输入回波。这就是我所期望的行为。
目前,您无法绕过这一限制,因为Emacs不向Emacs Lisp代码公开基础TTY,因此您没有机会手动禁用基础TTY设备上的输入回波。
根据我在编写和贡献相当多的非交互式Emacs程序方面的经验,我个人建议不要将Emacs用于非交互式脚本。对于这样的项目来说,这是一个糟糕的平台。API是有限的,并且有许多隐式行为阻碍了非交互式程序,这是你无法摆脱的。
例如,您不能安全地将命令行参数传递给Emacs,因为Emacs将自动访问其命令行参数中的任何现有文件,从而触发各种副作用,例如提示输入不安全的局部变量等。
https://stackoverflow.com/questions/24352749
复制相似问题