Хотя в настоящее время у меня есть обходной метод, я чувствую, что должен быть лучший способ сделать это, что-то вроде SSHTunnelForwarder в Python.
(здесь) https://sshtunnel.readthedocs.io/en/latest/
Мой текущий обходной путь:
1) Напишите файл /.ssh/config
, в котором указаны параметры переадресации локального порта.
2) В окне терминала выполнить ssh -N location_of_db
3) В R выполните следующее:
library(RPostgres)
drv <- RPostgres::Postgres()
dbName <- "my_database"
host <- "127.0.0.1"
port <- '5439'
user <- "username"
db <- dbConnect(drv, dbname=dbName, host=host, port=port, user=user,
password=readLines("/Users/me/keys/db_password.txt"))
Есть ли способ сделать это на языке R?
Примечание. Вместо 1) и 2) вы можете просто подключиться и настроить переадресацию локального порта с параметром -L
в команде ssh
(теперь в комментариях), но для этого необходимо найти свой ssh-agent
для базы данных и предоставить другую информацию о безопасности. , настроенный системным администратором.
ssh
, да и не хотел бы. Если вы действительно этого хотите, вам нужно (1) разветвить отдельный процесс R, чтобы вы могли (2) запустить что-то вродеsystem2("ssh", c("-L", "5439:localhost:5439", "-N", host)
, чтобы он оставался активным все время, пока вы работаете. Кажется немного неэффективным, я бы предложил (и на самом деле я делаю это ежедневно) просто использовать простой терминал (например, mintty или xterm) сssh
-proper. - person r2evans   schedule 23.01.2018-L
не имеет ничего общего с файломid_rsa
. Кроме того, если вы используете что-то вродеssh-agent
(илиKeePass
с плагиномKeeAgent
), вы также можете найти способы обойти это. Моя нормаssh -L lport:host:rport myhost
(с-N
или без) на регулярной основе. И хотя рекомендуется (особенно при повторном подключении к одному и тому же местоположению), использование~/.ssh/config
также не требуется. - person r2evans   schedule 23.01.2018ssh.utils
, но он не видел обновление в годах, так что будьте бдительны. Концепция фоновых процессов не нова для R; см.rmote
,opencpu
, дажеblogdown
(черезservr
а>). - person r2evans   schedule 23.01.2018RCurl
поддерживаетscp
команды; возможно его можно будет продлить. (Независимо от того, этот вопрос кажется дубликатом того, хотя еще нет принятого ответа, или этого stackoverflow.com/q/ 17347450/3358272.) - person r2evans   schedule 23.01.2018system
не обрезает его, поскольку не принимает его использование в качестве псевдотерминала. У меня тоже была проблема с отсутствием своевременного обновления. Я мог бы поиграть сscp
, но пока. Я доволен своим текущим решением. Учитывая возраст и отсутствие решения, я думаю, я понимаю, почему эти вопросы не появлялись как возможные дубликаты, пока я писал / искал - person Taylor Pellerin   schedule 23.01.2018system2("ssh", c("somehost", "ls"))
(с ssh-агентом и настроенным хостом), и он работал без предупреждений (win10, OpenSSH_7.6p1, OpenSSL 1.0.2m 2 ноября 2017). Какая у вас ОС? - person r2evans   schedule 23.01.2018RPostgres
иRPostgreSQL
— совершенно разные пакеты, используйте один или другой. Это разные реализации для одной и той же цели, подключение (черезDBI
) на сервер postgres sql. В своем коде вы никогда не используете (или не нуждаетесь)library(RPostgreSQL)
. Во-вторых, рекомендуетсяlibrary(DBI)
и никогдаlibrary(<driver-package>)
, так как все остальное обрабатывается внутри компании. - person r2evans   schedule 23.01.2018system
, а неsystem2
, что могло быть проблемой - person Taylor Pellerin   schedule 23.01.2018system("ssh remotehost touch '/tmp/hello world'")
илиsystem2("ssh", c("remotehost", "touch", "/tmp/hello world"))
или дажеsystem2("ssh", c("remotehost", "touch", "'/tmp/hello world'"))
.) - person r2evans   schedule 23.01.2018