Arquivos raiz Rsync entre sistemas sem especificar senha

Arquivos raiz Rsync entre sistemas sem especificar senha

Isso parece muito complicado para mim.

Configurei meus dois sistemas para poder rsyncarquivar entre eles como eu, sem especificar senha. Agora o problema são os rsyncarquivos que pertencem a root. Em ambos os meus sistemas, não há senhas de root. A única maneira de se tornar root é via sudo. Portanto, não posso fornecer uma senha sudo rsyn local root@remote:nem usar meu agente ssh para fornecer uma senha. Não quero configurar uma senha root em nenhum sistema; e preciso que os arquivos sejam de propriedade do root em ambos os sistemas.

EDITAR: Usar os arquivos que pertencem rooté apenas um exemplo, preciso de uma maneira para que minha conta sem privilégios leia/grave arquivos do sistema (incluindo de propriedade do root) facilmente. Um exemplo é copiar meu ambiente /root configurado para o sistema recém-instalado. Os dois sistemas são, na verdade, duas VMs em um único host, portanto, não é uma grande preocupação copiar arquivos de propriedade do root entre eles.

EDITAR 2: Se eu quiser apenas copiar meu ambiente /root configurado para o sistema recém-instalado, posso usar tar:

sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /

Mas preciso rsyncatualizar de vez em quando. Alguma maneira fácil de fazer isso acontecer?

EDIT 3: Formule formalmente a pergunta

Tudo bem, tudo começou com a pergunta, como fazer rsyncarquivos que pertencem ao root entre dois sistemas como um usuário normal sem privilégios, sem especificar senha, sob a condição de que,

  1. A rootconta está bloqueada em ambos os sistemas. Ou seja, não há rootsenhas. A única maneira de se tornar root é através de sudo(prática de segurança recomendada, consultehttp://help.ubuntu.com/community/RootSudo)
  2. Não quero um ambiente completamente sem senha sudo, mas também não quero digitar senhas o tempo todo.
  3. O usuário normal sem privilégios inseriu sua senha ssh no agente ssh.

Obrigado

Responder1

Você pode fazer isso diretamente com o rsync com o uso criativo da --rsync-pathopção. Então você usaria:

rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/remotedir

Observe que isso exige que "sudo rsync" no host remoto NÃO solicite a senha. Isso pode ser feito de várias maneiras:

  • fazendo sudo -vremotamente antes de executar o rsync (ideal para trabalhos rsync únicos). Seu sudo não deve usar tty_ticketsa opção para que isso funcione.
  • instalando username ALL= NOPASSWD:/usr/bin/rsyncem /etc/sudoershost remoto.
  • usandopam-ssh-agente-authno controle remoto para/etc/pam.d/sudo

Claro, você também pode, em vez de "rsync over ssh", usar "rsync no modo daemon" (veja rsyncd.conf(5)e /etc/default/rsyncno Debian GNU/Linux, por exemplo) para realizar o que deseja, com o benefício adicional de melhor velocidade de transferência.

Responder2

A solução.

  1. Adicionar a chave ssh do usuário à raiz remota funciona, mas apenas na metade, ou seja, agora rsyn ... root@remote:...funciona. A parte desafiadora é conseguir sudo rsyn ...trabalho também.
  2. Para conseguir sudo rsyn ...trabalho, o que é necessário é: usar o agente SSH para autenticação sudo,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. Para instalar o módulo pam-ssh-agent-auth PAM no Ubuntu, você pode usar o ppa que acabei de construir,https://launchpad.net/~suntong001/+archive/ppa. Testado bem no Ubuntu 12.04 preciso e 13.10 atrevido.

HTH

Responder3

Outra forma seria criar um script .sh em ambos os servidores, contendo seus scripts rsync.

Em seguida, execute-os via cronjob ou via ssh:

ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh

Ou apenas execute seu script rsync diretamente através do ssh

ssh not-your-root-user@remoteserver sudo rsync local root@remote

Eu preferiria o cronjob se fosse um trabalho rsync agendado.

Responder4

Bem, depende do que você quer fazer. Os arquivos precisam pertencer ao root em ambos os sistemas? Eles não acontecerão se você estiver simplesmente fazendo um backup para poder executar rsynccomo root, mas efetuando login no servidor remoto como seu usuário normal.

Crie uma chave para o local rootfazer login como usuário normal remoto (usarei xptcomo seu nome de usuário normal):

sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote

Agora você deve ser capaz de fazer uma operação sem senha sshou rsync(como root) assim:

rsync /path/to/local xpt@remote

Se os arquivos precisarem pertencer ao root em ambos os sistemas, as coisas ficam um pouco mais complexas. A coisa mais fácil a fazer seria apenas configurar uma senha root em ambos os sistemas:

sudo -i
passwd 

Agora você pode fazer login como root o quanto quiser.

Claro, omelhorcoisa a fazer serianão copie arquivos pela rede como root. Eu realmente não consigo imaginar por que você iria querer isso e o risco não vale o esforço, apenas copie os arquivos e brinque sudoconforme necessário, uma vez que eles tenham sido copiados.


ATUALIZAR:

Repito que a maneira mais simples de fazer isso é criar uma senha root para cada máquina e depois copiá-la como root. Não entendo por que você não quer isso, é tão simples quanto executar sudo passwd.

De qualquer forma, se você insiste que não deseja criar uma senha de root, a única maneira de contornar isso é executar dois comandos:

  1. Execute rsyncpara copiar para um diretório gravável pelo usuário (eu uso mktmppara criar um nome de diretório aleatório):

    dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
    
  2. Mova o conteúdo pararemote:/root

    ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
    

    A -topção força a alocação tty e é necessária para executar sudocomandos no sistema remoto.

Você pode combinar os dois adicionando isto ao seu ~/.bashrcarquivo (avise-me se você não usa o bash):

function Rrsync(){
    dir=`mktemp -u` &&
    sudo rsync -avz $1 $2:$dir &&
    ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}

Você pode então chamar a função assim:

Rrsync /root xpt@remote /root
------ ----- ---------- -----
   |     |       |        |---> The target directory on the remote server
   |     |       |------------> username@server 
   |     |--------------------> Path to local source directory
   |--------------------------> The function name

Lembre-se de que pode ser necessário adicionar/remover uma barra final /da origem e dos destinos do rsync, dependendo se você está copiando um diretório ou o conteúdo do diretório. Ver man rsync.

Para que isso funcione sem uma senha, você terá que executar ssh-keygene ssh-copy-idcomo root conforme descrevi no início. Você ainda terá que inserir sua senha para os dois sudocomandos, uma para sua máquina local e outra para a remota.

informação relacionada