SSH direciona stdin e stout de e para o cliente postgres

2

meu local pode se conectar ao remoto, mas não pode se conectar ao dbserver. remoto pode se conectar ao dbserver (com psql).

Eu quero executar scripts SQL do meu local no banco de dados.

Eu estou procurando uma maneira de abrir um psql no controle remoto e direcionar meu stdin e stdout para meu local com ssh.

Agora, na opção estúpida, faço isso:

ssh remote
psql -h db report
password
run my commands

Eu posso fazer isso em um script dessa maneira, mas é feio e dosnt me permite uma sessão interativa com o psql.

PSQL="PGPASSWORD=mypassword psql -h dbserver  -d report"
SQL="SELECT 1"
ssh remote "$PSQL --command 'COPY ($SQL) TO STDOUT WITH CSV;'"

Ps-Python também está OK.

    
por Avihai Marchiano 21.04.2013 / 13:39

2 respostas

5

Use uma porta ssh para frente com uma sessão ssh de comando sem suporte:

$ ssh -N -f -L 5433:localhost:5432 remoteserver

com o qual você pode usar:

$ psql -h localhost -p 5433
Os comandos

psql , como \o , \i , etc., se referem aos arquivos no computador local.

Se você estiver tentando fazer isso para fins de script, provavelmente desejará usar a opção -n do ssh e uma chave ssh sem senha com opções definidas em authorized_keys para evitar que um shell seja gerado. all você pode fazer é encaminhar uma determinada porta. Isso é muito importante para a segurança ao usar chaves sem senha. ssh-agent fornece uma alternativa um pouco mais segura, mas é mais desajeitado para scripts. Lembre-se de que seu script precisará registrar o ID do processo da sessão ssh em segundo plano gerada e eliminá-lo no final da tarefa. Às vezes é mais fácil usar o controle de tarefa do shell do que o modo de daemonização do próprio ssh; Dessa forma, o shell controla o processo em background com & e pode ser finalizado com kill %jobid . Consulte controle de trabalho bash . (Você precisa basear a sessão ssh de encaminhamento de porta para que a execução do script possa continuar e executar psql ).

Para uso interativo, você pode simplesmente chamar o controle remoto psql over ssh , nesse caso, comandos como \o , \i , \copy , etc se referirão aos arquivos locais do servidor que você ssh'd para, não o seu computador local:

$ ssh remoteserver psql

Isso também funciona para scripts, mas é um pouco menos seguro do que fazer o redirecionamento de portas, pois psql é um programa bastante poderoso que permite ler e gravar arquivos arbitrários, gerar um shell, etc. uma chave ssh sem senha pode fazer se for permitido invocar remotamente psql . Por outro lado, é um muito mais simples de escrever:

ssh remoteserver psql <<'__END__'
BEGIN;
INSERT INTO blah(a,b,c) VALUES (1,2,3);
UPDATE otherblah SET x = 99, y = 912;
COMMIT;
__END__

do que mexer com sessões de fundo ssh. Realmente depende de quais são suas prioridades.

    
por 21.04.2013 / 15:26
0

Você pode usar o iptables na máquina remota para redirecionar o tráfego postgresql para o servidor db. Por exemplo:

iptables -A PREROUTING -s your_machine_ip -p tcp --dport 5432 -j DNAT --to-destination db_server_ip

Claro, isso requer privilégio de administrador na máquina remota. Você também precisa ativar o encaminhamento de IP.

Da sua máquina, basta conectar-se à máquina remota e ela será redirecionada para o servidor db. Desta forma, você não precisa da conexão ssh mostrada.

Como nota, talvez seja necessário analisar os problemas de segurança em como você se conecta ao sistema de banco de dados, especialmente se estiver fazendo isso remotamente em redes não confiáveis.

    
por 21.04.2013 / 13:54