【问题标题】:How do I handle password prompts when calling elisp from the terminal从终端调用 elisp 时如何处理密码提示
【发布时间】:2014-06-22 15:27:56
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 不要find-file用于文件IO。它可能会导致任意副作用,并可能在非交互式会话中阻塞 Emacs。
  • 这样的东西有帮助吗? (read-passwd "Password: ") 这是此函数可用参数的打印输出:(read-passwd PROMPT &optional CONFIRM DEFAULT)
  • lunaryorn:我应该改用什么?我查看了 elisp 手册,但没有找到任何明确的 IO 内容。
  • lawlist:从终端调用时,该函数似乎不起作用。
  • @snowape 报告于debbugs.gnu.org/cgi/bugreport.cgi?bug=17839。您可能想加入讨论以表达您的支持。

标签: bash shell emacs elisp


【解决方案1】:

你很可能不走运。您的第一个示例表明,即使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 会自动访问其命令行参数中的任何现有文件,从而触发各种副作用,例如提示输入不安全的局部变量等。

【讨论】:

  • 我同意 elisp 不是最佳脚本语言,但 FWIW 您只需要传递 -- 参数即可防止 Emacs 处理后续参数。请参阅stackoverflow.com/a/6807133/324105(对于稳健的标准方法,stackoverflow.com/a/6259330/324105)。
  • @phils -- 将选项与参数分开,但实际上并没有阻止 Emacs 尝试将所有参数作为文件访问。见gist.github.com/lunaryorn/66b2e9ad35ffb4bad8c2
  • 抱歉,您说的完全正确。我相信我从来没有注意到这一点。 Jurijs Oniscuks 有解决方案(在同一个链接的问答中),即在脚本退出之前(setq argv nil)(或者实际上是command-line-args-left)。
  • @phils 谢谢,我不知道。确实,这是一个花哨的技巧,但恕我直言,更说明了为什么您不应该将 Emacs Lisp 用于脚本。它太脆弱了,以非常微妙的方式。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多