Назад | Перейти на главную страницу

SSH direct stdin и stout в и из клиента postgres

мой локальный может подключиться к удаленному, но он не может подключиться к 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.

В качестве примечания вам может потребоваться изучить проблемы безопасности при подключении к системе базы данных, особенно если вы делаете это удаленно через ненадежную сеть.