Faço backups freqüentes em uma unidade local que desejo sincronizar diariamente com um servidor remoto.
O servidor de destino está configurado apenas para acesso à chave SSH (sem senha). Como minha chave SSH principal desse servidor é protegida por senha, criei uma segunda chave SSH (não protegida por senha) + usuário para usar em backups autônomos - dessa forma, não preciso estar presente para inserir minha senha quando o cron for executado .
Estou usando cron e rsync, e todos os comandos funcionam individualmente, mas falham quando combinados.
O máximo que eu tenho enquanto a solução de problemas está em execução
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
que retorna o erro
Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.0]
Alguma dica sobre como solucionar isso ainda mais?
Aqui está o que eu tentei até agora e estou sem ideias:
- Cron está definitivamente rodando
ps aux | grep cron
Nada incomum em / var / log / syslog
Sep 7 13:22:01 desktop CRON[6735]: (tom) CMD (sh /home/tom/Documents/Scripts/offsite-backup)
SSH no Terminal para servidor remoto enquanto o usuário de backup trabalha
ssh [email protected]
- A execução do comando no Terminal funciona perfeitamente
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
A especificação manual do caminho para a chave do usuário de backups não tem efeito
rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /home/tom/.ssh/backups-only' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Substituir o comando que não funciona por um comando de teste simples funciona
echo "Hello world" > ~/Desktop/test.txt
Gritar / xingar o computador não teve efeito (mas me fez sentir melhor temporariamente).
Editar 1:
Aqui está o meu arquivo crontab e o script que ele chama.
...
# m h dom mon dow command
MAILTO=""
* * * * * sh /home/tom/Documents/Scripts/offsite-backup
e
#!/bin/bash
rsync -lrstRO --delete --exclude 'lost+found' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/
Edição 2:
Apenas para esclarecer, /var/log/auth.log
o servidor de destino contém a linha Sep 11 08:23:01 <hostname> CRON[24421]: pam_unix(cron:session): session closed for user root
Isso é confuso, porque não estou mais executando o cron a cada minuto localmente, mas uma nova entrada ainda aparece a cada minuto nos logs do servidor. Os arquivos Crontab para todos os usuários (incluindo root) no servidor estão vazios e não fazem nada.
Além disso, o usuário 'somente backups' foi criado apenas no servidor e com direitos limitados, com uma chave SSH dedicada copiada para minha máquina desktop. Estou assumindo que este é o caminho a seguir, porque tudo funciona ao executar os comandos manualmente.
O arquivo crontab postado acima é para mim, usuário 'tom' na minha máquina desktop. Minha intenção é chamar o script que deve efetuar login no servidor como usuário 'apenas backups'. Eu apenas tentei executar o script de backup (em vez do comando dentro dele) e ele se conectou e funcionou com sucesso. Eu o executei na minha área de trabalho como usuário 'tom', o mesmo usuário que criou o trabalho cron que não funcionará. Aqui está a saída do log do servidor correspondente a esse login bem-sucedido
Sep 11 08:35:31 <hostname> sshd[25071]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
Sep 11 08:35:32 <hostname> sshd[25071]: Accepted publickey for backups-only from <desktop IP> port 54242 ssh2: RSA e2:e6:07:27:c1:continues...
Sep 11 08:35:32 <hostname> sshd[25071]: pam_unix(sshd:session): session opened for user backups-only by (uid=0)
Sep 11 08:35:32 <hostname> systemd-logind[638]: New session 12 of user backups-only.
Sep 11 08:36:00 <hostname> sshd[25133]: Received disconnect from <desktop IP>: 11: disconnected by user
Sep 11 08:36:00 <hostname> sshd[25071]: pam_unix(sshd:session): session closed for user backups-only
Sep 7 14:45:01 <hostname> CRON[18716]: pam_unix(cron:session): session closed for user root
Sep 7 16:06:02 <hostname> sshd[6747]...
. Você tem 100% de certeza de que esta linha de log é do servidor e que é a linha correta? O crontab que você postou é o crontab apenas de backups ? Além disso, tente adicionar o arquivo de identidade manualmente:rsync .... -e 'ssh -i /home/user/.ssh/identity' ...
auth.log
você postou em Edit 2 é para o cron sendo executado no servidor e não deve ter nada a ver com suas tentativas de login. Você pode tentartail -f /var/log/auth.log
no servidor enquanto tenta executar o script através do cron? Além disso, não tenho certeza se isso funcionaria, mas você pode tentar seu primeiroenv
comandorsync .... -e 'ssh -vvv -i /home/user/.ssh/identity ...
para ver se ele gera mais erros?Respostas:
Como tudo está funcionando bem na linha de comando, o erro
Permission denied (publickey)
significa que a parte SSHrsync
está usando um arquivo de identidade diferente do nome de usuário especificado.No comentário de Jan sobre a pergunta original, podemos especificar o arquivo de identidade no
rsync
comando usando-e 'ssh -i /path/to/identity.file' ...
.Usar o comando abaixo para começar com um ambiente novo no cron e especificar o caminho completo para o arquivo aparentemente resolve o problema:
Ainda estou realmente interessado nessa descoberta. Provavelmente tem a ver com cron, o fato de começar com variáveis de ambiente mínimas e com o ssh-agent. Vou configurar o mesmo cenário daqui a alguns dias para testá-lo e reportar de volta.
fonte
env -i sh -c "rsync -lrstRO --delete --exclude 'lost+found' -e 'ssh -i /path/to/identity.file' /Backups/auto-daily-backups/./ [email protected]:/backups/desktop/"
Acabei de resolver este problema que me manteve ocupado ..
Não é possível conectar no RSYNC pelo SSH, apesar de ter estipulado a identidade para o SSH ... Nada é feito ... O Rsync diz "permissão negada" e o ssh diz "read_passphrase: não pode abrir / dev / tty: nenhum dispositivo ou endereço de esse tipo"
Mas li um post que explicava que o crontab tem seu próprio ambiente que não é o mesmo que root. Eu já sabia disso, mas não entendi o impacto que poderia ter no SSH ao usar o SSH-AGENT
Mas minhas trocas de chaves SSH são feitas com PassPhrase ... portanto, se o ambiente for diferente e meu RSYNC sobre SSH esperar uma senha que não possa ser inserida => As informações de depuração SSH também indicarão o erro:
Na minha máquina, uso "Keychain" para ativar o agente SSH, para que não seja necessário inserir novamente a senha sempre que tento uma conexão remota. Keychain gera um arquivo que contém as seguintes informações
==> O comando SSH-AGENT retorna a mesma informação.
Portanto, no final, são essas informações relacionadas à sessão atual que permitem futuras autenticações da sessão atual, sem a necessidade de digitar a senha, pois já foram feitas anteriormente e memorizadas ...
==> A solução existe ... basta no script iniciado pelo crontab e "originar" o arquivo que contém essas informações ou fazê-lo na linha de comando ds crontab ...
=> Com essa fonte, não precisa mais se preocupar. As informações de SSH_AUTH_SOCK e SSH_AGENT_PID são carregadas no ambiente do Crontab e, portanto, são conhecidas, o RSYNC sobre SSH funciona sem nenhum problema.
Manteve-me ocupado, mas agora funciona :)
fonte
Advertência para quem usa o encaminhamento de agente SSH:
Se você observar esse comportamento ao depurar um script em um host remoto, é porque, mesmo com o
-e "ssh -i /path/to/key"
sinalizador, o ssh usará sua chave local (encaminhada) em vez da chave no servidor.Exemplo concreto: eu tenho um script no servidor de desenvolvimento que extrai dados do "servidor de dados" usando rsync sobre ssh. Quando eu entro no servidor dev e o executo, tudo está bem, mas ao executar a partir do cron, recebo a permissão negada. Adicionando alguma verbosidade ao processo SSH (flag
-vv
), observei o seguinte:O que me chamou a atenção aqui é que, por puro acaso, tenho um nome de usuário diferente no host local ("nighty") do que no servidor de desenvolvimento ("juanr").
Observe como ela marca a chave no servidor de desenvolvimento como "explícita", mas ainda usa a chave encaminhada do meu laptop para efetuar login. Fazer um
ssh-copy-id
neste momento não resolve nada, porque simplesmente reinstala a chave encaminhada em vez da chave do desenvolvedor servidor. Se você usar o ssh-copy-id com o encaminhamento agente, você precisa especificar qual chave de instalar com a bandeira -i:ssh-copy-id -i ~/.ssh/id_rsa.pub user@host
.fonte
Você já tentou o velho truque de limpar os arquivos de hosts? Quero dizer:
Vale a pena tentar, pois o ssh o reconstruirá e você se livrará de coisas obsoletas. Obviamente, você também pode remover as partes pertencentes a um determinado IP / host.
Mais perguntas: Seu trabalho do cron está sendo executado sob o seu UID ou como usuário cron ou root?
fonte
~/.ssh/known_hosts
mudaria alguma coisa? E o cron é executado como meu usuário 'tom' na área de trabalho, com a intenção de fazer login no servidor como usuário 'apenas backups' com a chave SSH correspondente (sem senha), que está no usuário tom~/.ssh
.-r
nem o-f
sinalizador são necessários para excluirknown_hosts
- é um arquivo regular (não um diretório) e não é somente leitura.rm .ssh/known-hosts
seria consideravelmente mais seguro, considerando que um erro de digitação de um caractere - adicionar acidentalmente um espaço entre.
essh/known_hosts
depoisrm -rf
(ourm -r
) geralmente excluiria todo o conteúdo da pasta pessoal do usuário!Use o
rrsync
script junto com uma chave ssh dedicada, da seguinte maneira:Servidor remoto
Computador LOCAL
Computador remoto
Anexe à linha recém-adicionada o seguinte
Para que o resultado pareça
LOCAL
Coloque seu
crontab
script a seguir comx
permissão:Fonte: http://www.guyrutenberg.com/2014/01/14/restricting-ssh-access-to-rsync/
fonte
Para tentar depurar, adicione à parte ssh "ssh -v" dessa maneira, você pode obter o modo detalhado com algumas informações úteis.
Editar: Na página de manual:
fonte
Eu acho que você não configurou o arquivo sshd_config corretamente. Verifique isso
PermitRootLogin yes
ePubkeyAuthentication yes
para manutenção remota.fonte
PermitRootLogin
habilitei e não tenho planos de mudar isso. A melhor prática é desabilitá-lo e ssh apenas como um usuário normal (adicione-o aos seus 'sudoers' se necessário) e nunca como root.