
Isso parece muito complicado para mim.
Configurei meus dois sistemas para poder rsync
arquivar entre eles como eu, sem especificar senha. Agora o problema são os rsync
arquivos 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 rsync
atualizar 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 rsync
arquivos que pertencem ao root entre dois sistemas como um usuário normal sem privilégios, sem especificar senha, sob a condição de que,
- A
root
conta está bloqueada em ambos os sistemas. Ou seja, não hároot
senhas. A única maneira de se tornar root é através desudo
(prática de segurança recomendada, consultehttp://help.ubuntu.com/community/RootSudo) - Não quero um ambiente completamente sem senha
sudo
, mas também não quero digitar senhas o tempo todo. - 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-path
opçã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 -v
remotamente antes de executar o rsync (ideal para trabalhos rsync únicos). Seu sudo não deve usartty_tickets
a opção para que isso funcione. - instalando
username ALL= NOPASSWD:/usr/bin/rsync
em/etc/sudoers
host 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/rsync
no 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.
- Adicionar a chave ssh do usuário à raiz remota funciona, mas apenas na metade, ou seja, agora
rsyn ... root@remote:...
funciona. A parte desafiadora é conseguirsudo rsyn ...
trabalho também. - 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/ - 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 rsync
como root, mas efetuando login no servidor remoto como seu usuário normal.
Crie uma chave para o local root
fazer login como usuário normal remoto (usarei xpt
como 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 ssh
ou 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 sudo
conforme 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:
Execute
rsync
para copiar para um diretório gravável pelo usuário (eu usomktmp
para criar um nome de diretório aleatório):dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
Mova o conteúdo para
remote:/root
ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
A
-t
opção força a alocação tty e é necessária para executarsudo
comandos no sistema remoto.
Você pode combinar os dois adicionando isto ao seu ~/.bashrc
arquivo (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-keygen
e ssh-copy-id
como root conforme descrevi no início. Você ainda terá que inserir sua senha para os dois sudo
comandos, uma para sua máquina local e outra para a remota.