Copiando arquivos protegidos entre servidores em uma linha?

13

Gostaria de copiar squid.conf de um servidor para outro.

  • Os servidores não se comunicam. Eu gostaria de passar pela minha estação de trabalho.
  • Os dois servidores possuem o arquivo, portanto, ele será substituído no destino.
  • Os arquivos têm 600 de permissão e são de propriedade de root.
  • O login raiz do
  • via ssh está desativado ( PermitRootLogin no ).
  • Gostaria de fazer isso em uma linha, se possível, já que 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/'

para 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 -t permite que o sudo peça a senha do administrador antes de exibir o conteúdo do arquivo.

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

UPDATE : Aqui está o melhor que consegui:

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 trecho. Acho que vou dividi-lo em passos separados no guia de configuração.

    
por itsadok 29.12.2011 / 12:46

4 respostas

11

É mais fácil encadear ssh com ssh do que encadear ssh com sudo. Então, alterando a configuração do servidor ssh é ok, sugiro abrir o ssh para a raiz de cada servidor, mas apenas do localhost. Você pode fazer isso com uma cláusula Match 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 registros digam quem está logado como root, e as etapas de autenticação são as mesmas que se o sudo estivesse envolvido.

Para se conectar a um servidor como root, defina um alias em ~/.ssh/config da seguinte forma:

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 sudo insiste na leitura de um terminal (mesmo que tenha um ticket para sua conta) ¹ e nenhum arquivo usual os métodos de cópia (scp, sftp, rsync) suportam a interação com um terminal remoto.

Continuando com o ssh e o sudo, seus comandos propostos podem ser simplificados. Em cada lado, se você tiver sudo configurado para não pedir uma senha novamente, você pode executá-lo uma vez para superar o requisito de senha e outra hora para copiar o arquivo. (Você não pode copiar o arquivo diretamente porque o prompt de senha fica no caminho.)

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'

¹ a menos que você tenha NOPASSWD , mas você não estaria perguntando isso.

    
por 30.12.2011 / 02:26
4

Você pode configurar sudo para não perguntar a senha da seguinte maneira:

Na fonte:

user    ALL=NOPASSWD:/bin/cat

Na segmentação:

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 de resolver seu problema com a distribuição de arquivos de configuração.

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

    
por 29.12.2011 / 14:32
2

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

Faça login no servidor de destino:

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

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

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

    
por 29.12.2011 / 14:01
2

Sem alterar a configuração do ssh, você pode criar dois ssh tunnels host- > server1 e server2- > host através da conexão ssh ao server2. Conecte esses dois túneis na máquina host (mesma porta). E execute o sudo no server2 para recuperar dados dos túneis conectados no servidor1 e salve-os 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- para 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 acessar sua máquina

-R60000:localhost:60000

2- conectar à máquina de destino

-t ${target}

3- execute todos como root na máquina alvo para escrever

'sudo bash -c "..."'

4- conecte à máquina de origem através do túnel. whoami e em localhost significando o localhost na máquina $ {target}.

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

5- empacote o (s) arquivo (s) remoto (s) e envie-o zipado para 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 -

Observação: você pode receber até 3 confirmações de sshkey e 3 solicitações de senha. Mas os arquivos serão copiados.

    
por 13.02.2015 / 02:15