Là một phần của quy trình làm việc R của tôi cho một trong các dự án của tôi, tôi tải dữ liệu từ bảng postgreSQL trên máy chủ từ xa.Tạo đường hầm SSH cho máy tính khác qua R để truy cập bảng postgreSQL
Mã của tôi trông như thế này (thông tin đăng nhập ẩn danh).
Lần đầu tiên tôi mở kết nối ssh tới máy chủ từ xa trong thiết bị đầu cuối.
ssh -p Port -L LocalPort:IP:RemotePort servername"
sau đó tôi kết nối với cơ sở dữ liệu Postgres trong R.
# 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")
Cách tiếp cận này hoạt động tốt, và tôi có thể tải dữ liệu với không có vấn đề.
Tuy nhiên, tôi muốn thực hiện bước đầu tiên - tức là, tạo kết nối ssh - trong R, thay vì ở đầu cuối. Đây là nỗ lực của tôi để làm như vậy, kèm theo lỗi.
# 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.
Để làm rõ câu hỏi của tôi, tôi muốn thực hiện toàn bộ công việc này (thiết lập kết nối, tải dữ liệu PostgreSQL) hoàn toàn bằng R mà không cần bất kỳ bước trong thiết bị đầu cuối.
'system2 ("ssh", c ("- L8080: localhost: 80", "-N", "-T", "otherhost"), wait = FALSE) 'đã làm việc cho tôi trên linux. Tuy nhiên, không hoạt động trên các cửa sổ, có thể do thiếu 'fork', vì vậy bạn có thể cần một thứ gì đó trong nền (chẳng hạn như' parallel' hoặc ['future'] (https://github.com/HenrikBengtsson/future)) để chạy phiên R khác). Dừng nó có thể hoạt động với 'tools :: pskill', chưa được thử nghiệm. – r2evans
@ r2evans Làm việc cho tôi, cảm ơn bạn. – Andy