gpt4 book ai didi

r - 没有防火墙弹出窗口的“本地主机”连接

转载 作者:行者123 更新时间:2023-12-03 21:22:05 25 4
gpt4 key购买 nike

考虑以下 R 脚本:

con <- socketConnection(host = "localhost", port = 8, server = TRUE, blocking = TRUE, open = "a+b")
close(con = con)

将这些行保存为 .R 文件,然后从命令行运行它会产生(在 Windows 上)防火墙警告。至少,如果第一次之后出现的“高级安全Windows防火墙”下没有R的规则。有人告诉我在 Mac 上也会发生同样的情况,但我自己无法验证。如何更改它以允许本地主机环回,但避免弹出窗口?

上下文:我为使用并行处理(在一台本地机器上)的人编写了一些代码。然而,这个警告突然出现在他们的屏幕上,他们起了疑心。愚蠢的是,即使人们点击“否”或忽略弹出窗口,并行处理似乎仍然有效。我认为这表明可以修改此代码以不提供此弹出窗口并仍然起作用。

我在其他语言( 123 )中看到了非常相似的问题,我想知道是否可以用 R 做同样的事情。

Windows 10 防火墙首次提示示例:

Enter image description here

最佳答案

我的感觉是,解决此问题的最简单方法是在应用程序安装过程中添加防火墙规则。

  • 您可以使用 netsh添加规则(需要 管理员权限 )以编程方式启用防火墙访问。

  • 我在下面提供了一个示例脚本,我希望这可以帮助您指明正确的方向。

    示例防火墙配置脚本
    netsh advfirewall firewall add rule name="RScript" action=allow program="C:\Program Files\Microsoft\R Client\R_SERVER\bin\x64\Rscript.exe" enable=yes Localip="127.0.0.1" localport="9999" protocol=tcp interfacetype=any profile=private dir=in

    命令输出:
    PS <hidden>\dev\stackoverflow\47353848> netsh advfirewall firewall add rule name="RScript" action=allow program="C
    :\Program Files\Microsoft\R Client\R_SERVER\bin\x64\Rscript.exe" enable=yes Localip="127.0.0.1" localport="9999" protoco
    l=tcp interfacetype=any profile=private dir=in
    Ok.

    添加防火墙规则

    Enter image description here

    假设您使用 RScript 运行 R 文件,则上述 netsh脚本将使 RScript 应用程序能够使用专用网络上的 TCP 访问端口 9999 上的环回地址 127.0.0.1。从此时起,您不应收到防火墙提示。

    没有防火墙提示的命令行
    c:\<hidden>\dev\stackoverflow\47353848> Rscript.exe .\server.R
    Listening...

    为什么要这样做?好吧,据我所知,没有办法使用 R 的 base::socketConnection在 Windows 上,即使使用环回连接器也不会触发 Windows Defender 防火墙提示。有趣的是,如果您使用 Java,则不会收到提示。我查看了这两种实现,但我无法确定为什么不这样做。

    测试服务器代码:
    server <- function() {
    while (TRUE) {
    writeLines("Listening...")
    con <- socketConnection(host = "loopback",
    port = 9999,
    server = TRUE,
    blocking = TRUE,
    timeout = 0,
    open = "r+")
    data <- readLines(con, 1)
    print(data)
    response <- toupper(data)
    writeLines(response, con)
    close(con)
    }
    }
    server()

    测试客户端代码
    client <- function() {
    while (TRUE) {
    con <- socketConnection(host = "loopback",
    port = 9999,
    server = FALSE,
    blocking = TRUE,
    open = "r+")
    f <- file("stdin")
    open(f)
    print("Enter text to be upper-cased, q to quit")
    sendme <- readLines(f, n = 1)
    if (tolower(sendme) == "q") {
    break
    }

    write_resp <- writeLines(sendme, con)
    server_resp <- readLines(con, 1)
    print(paste("Your upper cased text: ", server_resp))
    close(con)
    }
    }
    client()

    关于r - 没有防火墙弹出窗口的“本地主机”连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47353848/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com