Copiando arquivos protegidos entre servidores em uma linha?

13

Eu gostaria de copiar squid.confde um servidor para outro.

  • Os servidores não se falam. Eu gostaria de passar pela minha estação de trabalho.
  • Ambos os servidores têm o arquivo, portanto ele será substituído no destino.
  • Os arquivos têm 600permissão e pertencem à raiz.
  • o login root via ssh está desativado ( PermitRootLogin no).
  • Eu gostaria de fazê-lo em uma linha, se possível, pois fará parte de um guia de configuração.

Eu sei fazer

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

copiar arquivos entre servidores e preservar permissões. No entanto, neste caso, receberei "Permissão negada".

Eu também sei que posso fazer isso:

ssh -t source 'sudo cat /etc/squid/squid.conf'

Dessa forma, o -tsudo pode solicitar a senha de administrador antes de enviar o conteúdo do arquivo.

O problema é que não sei como combinar essas técnicas em algo que solicite a senha do sudo em cada servidor e transfira o arquivo para o seu destino. Isso é possível?

ATUALIZAÇÃO : Aqui está o melhor que eu poderia apresentar:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

Chamar isso de one-liner parece um exagero. Acho que vou dividi-lo para separar as etapas no guia de configuração.

itsadok
fonte

Respostas:

11

É mais fácil encadear ssh com ssh do que encadear ssh com sudo. Portanto, alterar a configuração do servidor ssh é bom, sugiro abrir o ssh para a raiz de cada servidor, mas apenas a partir do host local. Você pode fazer isso com uma Matchcláusula em sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Em seguida, você pode configurar uma cadeia de autenticação baseada em chave de usuário remoto para usuário local e de usuário local para raiz. Você ainda tem uma trilha de autenticação, para que seus logs digam quem fez login como root e as etapas de autenticação são as mesmas que se o sudo estivesse envolvido.

Para conectar-se a um servidor como root, defina um alias da ~/.ssh/configseguinte maneira:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Se você insistir em usar sudo, acredito que precisará de comandos separados, pois sudoinsiste na leitura de um terminal (mesmo que tenha um ticket para sua conta) ¹ e nenhum dos métodos usuais de cópia de arquivos (scp, sftp, rsync) suporte à interação com um terminal remoto.

Seguindo o ssh e o sudo, seus comandos propostos podem ser simplificados. Em cada lado, se você tiver configurado o sudo para não solicitar uma senha novamente, poderá executá-la uma vez para suprir o requisito de senha e outra para copiar o arquivo. (Você não pode copiar facilmente o arquivo diretamente porque o prompt de senha atrapalha.)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ menos que você tenha NOPASSWD, mas não perguntaria isso.

Gilles 'SO- parar de ser mau'
fonte
A primeira solução funcionou bem para mim, mas a segunda linha deve ser Match host localhost.
cduck
4

Você pode configurar sudo para não pedir senha da próxima maneira:

Na fonte:

user    ALL=NOPASSWD:/bin/cat

No alvo:

user    ALL=NOPASSWD:/usr/bin/tee

E faça na sua máquina:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Mas eu recomendo usar algo como fantoche . É muito melhor e mais fácil resolve seu problema com a distribuição de arquivos de configuração.

PS. A propósito, se você configurar sudopara solicitar a senha do usuário, a string com [sudo] password for useraparecerá no arquivo de destino.

pressa
fonte
+1 por sugerir fantoches, mas sua solução parece insegura. Eu também poderia permitir o login como root.
itsadok
2

Em vez de usar o ssh, você pode usar o scp para transferir o arquivo entre os servidores.

Efetue login no servidor de destino:

Mude para o diretório de destino em que deseja copiar o arquivo.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - recursivo p - preserva os tempos de modificação, os tempos de acesso e os modos do arquivo original

Mughil
fonte
Isso pressupõe que eu possa fazer login como root, o que não posso. Atualizando a pergunta.
itsadok
2

Sem alterar a configuração do ssh, você pode criar dois túneis ssh host-> servidor1 e servidor2-> host através da conexão ssh ao servidor2. Conecte esses dois túneis na máquina host (mesma porta). E execute o sudo no servidor2 para recuperar dados dos túneis conectados no servidor1 e salvá-los no servidor2.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

A ideia é: 1- criar um túnel local da sua máquina para a máquina de origem na porta 60000

ssh -L60000:${source}:22

1b- Crie um túnel remoto para retornar à sua máquina

-R60000:localhost:60000

2- conectar à máquina alvo

-t ${target}

3- execute tudo como root na máquina de destino para escrever

'sudo bash -c "..."'

4- conectar à máquina de origem através do túnel. whoami e on localhost significam o host local na máquina $ {target}.

ssh -p 60000 '$(whoami)'@localhost

5- empacote o (s) arquivo (s) remoto (s) e envie-o zipado para o stdout

cd /path/to/dir; tar -czf - file

6- receba o pacote através do stdout e extraia os arquivos adequadamente no diretório / path / to / target

|tar -C/path/to/target -xzf -

Nota: Você pode receber até 3 confirmações de tecla ssh e 3 solicitações de senha. Mas os arquivos serão copiados.

Marco Aurelio
fonte