Как настроить переадресацию портов SSH исключительно в R?

Хотя в настоящее время у меня есть обходной метод, я чувствую, что должен быть лучший способ сделать это, что-то вроде 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 для базы данных и предоставить другую информацию о безопасности. , настроенный системным администратором.


person Taylor Pellerin    schedule 23.01.2018    source источник
comment
Я не знаю ни одной реализации R ssh, да и не хотел бы. Если вы действительно этого хотите, вам нужно (1) разветвить отдельный процесс R, чтобы вы могли (2) запустить что-то вроде system2("ssh", c("-L", "5439:localhost:5439", "-N", host), чтобы он оставался активным все время, пока вы работаете. Кажется немного неэффективным, я бы предложил (и на самом деле я делаю это ежедневно) просто использовать простой терминал (например, mintty или xterm) с ssh-proper.   -  person r2evans    schedule 23.01.2018
comment
Кстати: использование -L не имеет ничего общего с файлом id_rsa. Кроме того, если вы используете что-то вроде ssh-agent (или KeePass с плагином KeeAgent), вы также можете найти способы обойти это. Моя норма ssh -L lport:host:rport myhost-N или без) на регулярной основе. И хотя рекомендуется (особенно при повторном подключении к одному и тому же местоположению), использование ~/.ssh/config также не требуется.   -  person r2evans    schedule 23.01.2018
comment
@r2evans спасибо за ответы. Учитывая, насколько плавно работает SSHPortForwarder в Python, я надеялся воспроизвести этот процесс в R... Мне нравится tidyverse! Я попытался пойти по такому обходному пути, это было не очень плодотворно ... Я просто буду придерживаться bash! Спасибо за «кстати», я знаю об этом, просто использовал один в моем случае, но отредактировал сообщение, чтобы сделать это более очевидным для других читателей. Поскольку я подключаюсь только к одному месту на этой машине, конфигурация удобна :)   -  person Taylor Pellerin    schedule 23.01.2018
comment
Я определенно вижу в этом какую-то пользу для некоторых, когда терминал не используется или загромождает. На самом деле есть пакет (я был в шоке!) под названием ssh.utils, но он не видел обновление в годах, так что будьте бдительны. Концепция фоновых процессов не нова для R; см. rmote, opencpu, даже blogdown (через servr).   -  person r2evans    schedule 23.01.2018
comment
Кроме того, stackoverflow.com/a/34906738/3358272 предполагает, что RCurl поддерживает scp команды; возможно его можно будет продлить. (Независимо от того, этот вопрос кажется дубликатом того, хотя еще нет принятого ответа, или этого stackoverflow.com/q/ 17347450/3358272.)   -  person r2evans    schedule 23.01.2018
comment
Возможный дубликат как вы подключаетесь к удаленный сервер с ssh в R   -  person r2evans    schedule 23.01.2018
comment
Я обнаружил, что system не обрезает его, поскольку не принимает его использование в качестве псевдотерминала. У меня тоже была проблема с отсутствием своевременного обновления. Я мог бы поиграть с scp, но пока. Я доволен своим текущим решением. Учитывая возраст и отсутствие решения, я думаю, я понимаю, почему эти вопросы не появлялись как возможные дубликаты, пока я писал / искал   -  person Taylor Pellerin    schedule 23.01.2018
comment
Я только что сделал system2("ssh", c("somehost", "ls")) (с ssh-агентом и настроенным хостом), и он работал без предупреждений (win10, OpenSSH_7.6p1, OpenSSL 1.0.2m 2 ноября 2017). Какая у вас ОС?   -  person r2evans    schedule 23.01.2018
comment
Кстати: RPostgres и RPostgreSQL — совершенно разные пакеты, используйте один или другой. Это разные реализации для одной и той же цели, подключение (через DBI) на сервер postgres sql. В своем коде вы никогда не используете (или не нуждаетесь) library(RPostgreSQL). Во-вторых, рекомендуется library(DBI) и никогда library(<driver-package>), так как все остальное обрабатывается внутри компании.   -  person r2evans    schedule 23.01.2018
comment
У меня OSX 10.12.6, и я использовал system, а не system2, что могло быть проблемой   -  person Taylor Pellerin    schedule 23.01.2018
comment
Ни то, ни другое мне не нравится, если честно. Они оба немного бедны в том, что они полагаются на то, что пользователь выполняет кавычки оболочки для всех аргументов. (Попробуйте system("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
comment
Я попробую, когда вернусь на работу, спасибо за помощь!   -  person Taylor Pellerin    schedule 24.01.2018