мой локальный может подключиться к удаленному, но он не может подключиться к dbserver. удаленный может подключиться к dbserver (с psql).
Я хочу запускать сценарии sql с моего локального компьютера против db.
Я ищу способ открыть psql на пульте дистанционного управления и направить мои stdin и stdout на мой локальный с помощью ssh.
Теперь в глупом варианте я делаю так:
ssh remote
psql -h db report
password
run my commands
Я могу сделать это в скрипте таким образом, но его уродливость и нехватка позволяют мне интерактивный сеанс с psql.
PSQL="PGPASSWORD=mypassword psql -h dbserver -d report"
SQL="SELECT 1"
ssh remote "$PSQL --command 'COPY ($SQL) TO STDOUT WITH CSV;'"
Ps- Python тоже ОК.
Используйте порт ssh вперед с фоновым сеансом ssh без команд:
$ ssh -N -f -L 5433:localhost:5432 remoteserver
с которым вы можете затем использовать:
$ psql -h localhost -p 5433
psql
такие команды как \o
, \i
и т. д. будут ссылаться на файлы на локальном компьютере.
Если вы пытаетесь сделать это в сценариях, возможно, вы захотите использовать ssh -n
вариант и ключ SSH без пароля с параметрами, установленными в authorized_keys
чтобы предотвратить появление оболочки, чтобы все вы можете перенаправить данный порт. Это очень важно для безопасности при использовании ключей без пароля. ssh-agent
предоставляет несколько более безопасную альтернативу, но более неуклюжую для написания сценариев. Помните, что ваш сценарий должен будет записать идентификатор процесса фонового сеанса ssh, который он породил, и завершить его в конце задачи. Иногда проще использовать управление заданиями оболочки, чем собственный режим демонизации ssh; таким образом оболочка отслеживает процесс на фоне &
и это может быть прекращено с помощью kill %jobid
. Видеть управление заданиями bash. (Вам необходимо фоновый сеанс перенаправления портов ssh, чтобы выполнение сценария могло продолжаться и запускаться psql
).
Для интерактивного использования вы можете просто вызвать удаленный psql
над ssh
, и в этом случае такие команды, как \o
, \i
, \copy
, и т. д. будут относиться к файлам, локальным для сервера, к которому вы подключены, а не к вашему локальному компьютеру:
$ ssh remoteserver psql
Это также работает для сценариев, но несколько менее безопасно, чем перенаправление портов, поскольку psql
- довольно мощная программа, которая позволяет вам читать и записывать произвольные файлы, запускать оболочку и т. д. Вы не можете реально ограничить то, что может делать беспарольный ssh-ключ, если ему разрешено удаленно вызывать psql
. С другой стороны, это много проще написать:
ssh remoteserver psql <<'__END__'
BEGIN;
INSERT INTO blah(a,b,c) VALUES (1,2,3);
UPDATE otherblah SET x = 99, y = 912;
COMMIT;
__END__
чем возиться с фоновыми сессиями ssh. На самом деле это зависит от ваших приоритетов.
Вы можете использовать iptables на удаленном компьютере для перенаправления трафика postgresql на сервер db. Например:
iptables -A PREROUTING -s your_machine_ip -p tcp --dport 5432 -j DNAT --to-destination db_server_ip
Конечно, для этого требуются права администратора на удаленном компьютере. Вам также необходимо включить переадресацию IP.
Со своего компьютера вы просто подключаетесь к удаленному компьютеру, и он перенаправляет вас на сервер db. Таким образом, вам не нужно показанное соединение ssh.
В качестве примечания вам может потребоваться изучить проблемы безопасности при подключении к системе базы данных, особенно если вы делаете это удаленно через ненадежную сеть.