gpt4 book ai didi

r - 通过 R 建立到另一台计算机的 SSH 隧道来访问 postgreSQL 表

转载 作者:行者123 更新时间:2023-12-02 22:00:46 25 4
gpt4 key购买 nike

作为我的一个项目的 R 工作流程的一部分,我从远程服务器上的 postgreSQL 表加载数据。

我的代码如下所示(匿名凭据)。

我首先在终端打开与远程服务器的 ssh 连接

ssh -p Port -L LocalPort:IP:RemotePort servername"

然后我连接到 R 中的 postgres 数据库。

# Load the RPostgreSQL package
library("RPostgreSQL")

# Create a connection
Driver <- dbDriver("PostgreSQL") # Establish database driver
Connection <- dbConnect(Driver, dbname = "DBName", host = "localhost", port = LocalPort, user = "User")

# Download the data
Data<-dbGetQuery(Connection,"SELECT * FROM remote_postgres_table")

这种方法效果很好,我可以毫无问题地下载数据。

但是,我想在 R 中而不是在终端中执行第一步 - 即创建 ssh 连接。这是我这样做的尝试,但伴随着错误。

# Open the ssh connection in R
system("ssh -T -p Port -L LocalPort:IP:RemotePort servername")

# Load the RPostgreSQL package
library("RPostgreSQL")

# Create a connection
Driver <- dbDriver("PostgreSQL") # Establish database driver
Connection <- dbConnect(Driver, dbname = "DBName", host = "localhost", port = LocalPort, user = "User")

# Download the data
Data<-dbGetQuery(Connection,"SELECT * FROM remote_postgres_table")

Error in postgresqlExecStatement(conn, statement, ...) :
RS-DBI driver: (could not Retrieve the result : server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

为了澄清我的问题,我想完全在 R 中执行整个工作流程(建立连接、下载 postgreSQL 数据),而无需在终端中执行任何步骤。

最佳答案

根据 @r2evans 的建议。

##### Starting the Connection #####
# Start the ssh connection to server "otherhost"
system2("ssh", c("-L8080:localhost:80", "-N", "-T", "otherhost"), wait=FALSE)

您可以通过手动查找并输入 pid 来终止该进程,也可以通过自动终止与您的服务器名称匹配的所有 pid 来终止该进程。请注意,只有当您使用相对唯一的服务器名称且不太可能在其他进程中重复时,您才需要使用后一个版本。

##### Killing the Connection: Manually #####
# To end the connection, find the pid of the process
system2("ps",c("ax | grep otherhost"))
# Kill pid (x) identified by the previous grep.
tools::pskill(x)

##### Killing the Connection: Automatically #####
# To end the connection, find the pid of the process
GrepResults<-system2("ps",c("ax | grep otherhost"),stdout=TRUE)
# Parse the pids from your grep into a numeric vector
Processes<-as.numeric(sub(" .*","",GrepResults))
# Kill all pids identified in the grep
tools::pskill(Processes)

关于r - 通过 R 建立到另一台计算机的 SSH 隧道来访问 postgreSQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38212693/

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