我想使用 elisp 执行特权命令,然后在看到某些输出时使用过滤器进行进一步处理。
我的理解是,在详尽的 RTFM'ing 之后,我可以:
- 设置
default-directory
为以“/sudo::/”开头的路径。 - 调用
start-file-process
以启动将在 sudo 下运行的进程。
这是我编写的一个尝试执行此操作的函数:
(defun start-vpn (config-file password-file callback)
"Starts the VPN connection, waits for a DHCP address,
then invokes callback with the address it got."
(let* ((default-directory "/sudo::/tmp")
(buff (get-buffer-create "*openvpn*"))
(proc (start-file-process "openvpn" "*openvpn*"
"/usr/local/sbin/openvpn"
(concat "--config " config-file)
(concat "--auth-user-pass " password-file))))
(set-process-filter proc
(lambda (proc output)
(message "Got output: " output)
(let ((ip (get-vpn-ip-address output)))
(when ip
(callback ip)))))))
*Messages*
当我运行它时,我在缓冲区中看到以下输出:
start-vpn
Tramp: Opening connection for root@localhost using sudo...
Tramp: Sending command `exec sudo -u root -s -H -p Password:'
Tramp: Waiting for prompts from remote shell
Tramp: Sending command `exec sudo -u root -s -H -p Password:'
Tramp: Found remote shell prompt on `localhost'
Tramp: Opening connection for root@localhost using sudo...done
(lambda (proc output) (message "Got output: " output) (let ((ip ...)) (if ip (progn ...))))
Got output:
*openvpn*
...并且函数创建的缓冲区中没有输出。
我不是 elisp 的专家,所以我怀疑我犯了一些愚蠢的错误。我也很好奇缓冲区"(lambda (proc ..."
中的。*Messages*
任何建议、批评或提示表示赞赏。谢谢!