rsync sobre conexão ssh ativa

3

Tentando criar um script o mais limpo possível, gostaria de saber se existe alguma solução para a seguinte situação:

Um servidor Linux executando o sshd e um dispositivo Android, com o cliente dropshear ssh e o rsync instalado (sem servidor).

Estou escrevendo um script para ser executado remotamente com um cron que faz backup da memória android para o servidor linux. O cron chama algo como:

ssh remoteuser@linuxserver -i path_to_rsa_key runthisscript.sh

runthisscript.sh executa algumas coisas com os dados existentes, e, o que eu quero fazer, no meio do script, é rsync do dispositivo android de volta para o servidor, aproveitando a conexão ssh que é já abriu (como não há sshd rodando no android).

Desenvolvi outras soluções, como quebrar meu script de servidor em várias partes e chamá-las uma após a outra, com o rsync (direção do android para o servidor) no meio, mas eu estava procurando por uma solução mais elegantemente implementada script, a maior parte do trabalho feito no lado do servidor).

Idéias?

    
por Abilio Marques 04.01.2014 / 22:51

2 respostas

0

Suponho que você queira se conectar de qualquer lugar, portanto, não é possível garantir o endereço IP público no qual o tablet estará (ou mesmo se isso permitir conexões ao tablet a partir do servidor, já que é improvável que seja um endereço público), caso contrário, você deve instalar um deamon SSH e ash rsync para se conectar dessa forma. Caso contrário, um "túnel reverso" pode ser o que você está procurando.

Se o seu cliente SSH no dispositivo Android suportar o encaminhamento reverso de portas, procure usá-lo para criar um túnel. Por exemplo, com o openssh você pode especificar -R 2222:127.0.0.1:22 na linha de comando, o que significaria que as coisas no servidor podem se conectar a um servidor SSHd no tablet (escutando na porta 22 no 127.0.0.1 até o tablet) conectando-se a porta 2222 em 127.0.0.1 (é importante perceber que a partir do código no servidor PoV 127.0.0.1 é o servidor, o 127.0.0.1 na linha de comando é relativo ao cliente SSH ). Então, se isso funciona, você pode, em seu script de servidor, executar algo como rsync [email protected]:/path/to/stuff/on/tablet /path/to/destination/on/server -e 'ssh -p 2222' -a --compress . A opção -e é usada aqui para especificar a porta não padrão para o SSH se conectar.

Algumas notas mais detalhadas sobre o que foi dito acima (desculpe, isso é um pouco de "dump da mente" e pode não ser bem administrado, embora esperamos que ele ajude você a experimentar e / ou procure exemplos úteis em outros lugares)

  • Isso é chamado de um túnel reverso ou remoto porque é mais comum configurar redirecionamentos do cliente para o servidor (não o servidor para o cliente, conforme necessário aqui) ). Um túnel local (do lado do cliente para algo do lado do servidor) é configurado usando a opção -L em vez de -R (pelo menos com o OpenSSH, verifique a documentação do servidor para confirmação).
  • Você pode fornecer muitas opções -R e / ou -L na mesma linha de comando com o OpenSSH, para poder configurar mais de um túnel em qualquer direção usando uma única conexão SSH.
  • Você pode precisa de GatewayPorts yes ou similar especificado no sshd_config do servidor para que os túneis reversos funcionem. Verifique a documentação da implementação do SSHd para detalhes.
  • Não importa de onde o tablet liga: o túnel criado pelo encaminhamento de porta sempre apontará (via conexão SSH) de volta para seu cliente SSH. Você pode até mesmo apontar para algum outro recurso local com um encaminhamento como -R 8888:192.168.42.42:80 , o que significará conexões com 127.0.0.1:8888 no servidor, passará pelo túnel SSH e atingirá a porta 80 em qualquer máquina que responder a 192.168.42.42 na rede em que o tablet está atualmente (isso pode até ser outra máquina remota em um local completamente diferente).
  • Você precisará que o cliente rsync no tablet para o servidor possa executá-lo pelo SSH através do túnel.
  • O exemplo acima usa uma porta não padrão, pois é provável que o SSHd esteja escutando na porta 22 em todas as interfaces no servidor. Se você estiver se conectando ao servidor como root, usar um número de porta abaixo de 1024 (ou seja, 222 em vez de 2222) será mais seguro, embora você deva evitar conectar-se a recursos remotos como raiz, sempre que possível. A lista de pedidos em uma porta abaixo de 1024 é bloqueada para usuários não priveligiados por padrão em sistemas da Uinx-a-like.
  • Se você não quiser executar um daemon SSH no tablet, poderá executar uma instância do rsync no modo daemon. O encaminhamento de porta seria algo como 537:127.0.0.1:537 ou (se você estiver executando o rsync no modo de servidor no servidor já para que a porta 537 seja executada, algo como 5537:127.0.0.1:537 e adicione -p 5537 ao comando rsync para informar o servidor não está no lugar padrão).
  • Se o SSHd do seu servidor não escutar na porta 22 em todas as interfaces / endereços do servidor, você poderá usar 22 em vez de uma porta não padrão especificando que o encapsulamento deve atuar interface adicionando esse endereço ao início da parte -R , assim: -R 192.168.1.1:22:127.0.0.1:22 . O endereço de ligação é relativo ao servidor, portanto, não precisa ser algo publicamente roteável (na verdade, um endereço em uma interface fictícia, mesmo que o resto da LAN local não possa ver, funcionaria). Você definitivamente precisa de GatewayPorts para que isso funcione com o OpenSSH. Se você não GatewayPorts on (ou seja, se estiver usando 127.0.0.1 do lado do servidor e uma porta não padrão e isso funcionar com a implementação SSHd do seu servidor sem GatewayPorts yes ou equivelant), deixe isto fora: é mais seguro assim.
  • Eu assumi o IPv4 em todos os itens acima. Se o seu cliente e servidor o suportarem e suas redes em cada extremidade forem configuradas apropriadamente, o endereçamento IPv6 também funcionará.

Túneis através de SSH configurados desta forma podem ser muito poderosos depois de você ter jogado com eles e descobrir o que é possível e como fazê-lo, assumindo que as implementações SSH / SSHd de seu cliente e servidor suportam tudo isso.

    
por 05.01.2014 / 01:17
0

Você pode dar uma olhada no argumento --rsh / -e do rsync.

Você pode substituir o rsh por cat ou algo parecido. Mas você tem que adicionar um script no lado do Android, que envia a saída do seu script de servidor para um shell.

Android:

socat 'EXEC:/bin/bash' 'TCP-LISTEN:20000' &
ssh remoteuser@linuxserver -i path_to_rsa_key -R 20000:127.0.0.1:20000 runthisscript.sh

helper.sh:

#!/bin/sh
host=$2
port=$1
shift 2
{
    echo exec "$@"
    socat 'STDIN' 'STDOUT'
} | socat '-' "TCP:$host:$port"

runthisscript.sh:

rsync -e './helper.sh 20000' --blocking-io <SRC> <DST>
    
por 04.01.2014 / 23:02

Tags