首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Escapable)沙盒REPL over socket?

(Escapable)沙盒REPL over socket?
EN

Stack Overflow用户
提问于 2014-07-31 17:05:36
回答 1查看 225关注 0票数 0

最近,我使用了Guile,它允许将其REPL重定向到一个相当整洁的套接字。然后我在the Wikipedia page of Racket features上找到了下面的代码。为了方便起见,我将代码粘贴到这里:

代码语言:javascript
复制
#lang racket
(require racket/sandbox)
(define e (make-evaluator 'racket/base))
(let-values ([(i o) (tcp-accept (tcp-listen 9999))])
  (parameterize ([current-input-port  i]
                 [current-output-port o]
                 [current-error-port  o]
                 [current-eval e]
                 [current-read-interaction (λ (x in) (read in))])
    (read-eval-print-loop)
    (fprintf o "\nBye...\n")
    (close-output-port o)))

据我所知,这应该会创建一个新的(沙箱!)在TCP套接字上执行REPL,所有输入和输出都被重定向以在其上运行。但是当我用(Dr)球拍6.0来尝试这个功能时,它并不能很好的工作。我可以连接到套接字(使用netcat)并发出命令(即"(+ 1 2)"),但结果不会发回,而是出现在DrRacket的交互窗口中。通过阅读文档,我猜我可能需要参数化"current-print",但我不确定如何正确地做到这一点。

我如何才能使我在套接字通信上拥有完整的REPL?另外,我希望沙箱能够规避我自己定义的某些功能。那么最好的方法是什么呢?

问候

EN

回答 1

Stack Overflow用户

发布于 2014-08-01 10:15:03

感谢你在评论中解释了更多。尽管我可能仍有误解,但这里有一个我认为你的意思的答案。

您的REPL可以支持命令,就像could的XREPL一样。因此,在提示符下输入,pwd,它会将其视为“命令”,而不是球拍表达式。

该命令可以执行在沙箱REPL中运行的用户代码不能执行的特权操作。

REPL中的用户在尝试执行此操作时将出现错误:

代码语言:javascript
复制
(find-files (lambda (_) #t) (current-directory))

但是,您可以实现允许执行此操作的,pwd命令,例如,通过提供您自己的current-prompt-read处理程序:

代码语言:javascript
复制
#lang racket

(require racket/sandbox)

(define (our-prompt-read)  ;; <-- NEW
  (display "> ")
  (flush-output (current-output-port))
  (define in ((current-get-interaction-input-port)))
  (define stx ((current-read-interaction) (object-name in) in))
  (syntax-case stx ()
    [(uq cmd)
     (eq? 'unquote (syntax-e #'uq))
     (case (syntax-e #'cmd)
       [(pwd) (displayln (find-files (lambda (_) #t) (current-directory)))])]
    [_ stx]))

(define e (make-evaluator 'racket/base))
(let-values ([(i o) (tcp-accept (tcp-listen 9999))])
  (parameterize ([current-input-port  i]
                 [current-output-port o]
                 [current-error-port  o]
                 [current-eval e]
                 [current-read-interaction (λ (x in) (read in))]
                 [current-prompt-read our-prompt-read])  ;; <--- NEW
    (read-eval-print-loop)
    (fprintf o "\nBye...\n")
    (close-output-port o)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25054898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档