Em uma rede local, você tem duas máquinas nas quais deseja sincronizar com segurança e automaticamente /home/<username>/Desktop
a cada 10 minutos: "Host" que executa seu servidor OpenSSH e "Client", que se conecta por SSH a "Host".
Visão geral da solução *
- Configurar um servidor OpenSSH no host
- Instale o Unison no cliente e no host
- Crie o Script 1 para que
cron
possa usar a chave RSA de <username>
- Adicione duas linhas ao crontab de
<username>
e
- Defina o script 1 para ser executado na inicialização.
Configurar o OpenSSH Server no Host
Veja Setup SFTP Server para configurar um servidor OpenSSH que escuta para conexões SSH como <username>
no Host, usa um IP Estático, escuta em uma porta não padrão, recusa conexões baseadas em senha e permite conexões de chave RSA se o Host possuir a chave pública RSA.
Instale o Unison no cliente e no host
Em ambas as máquinas, execute (unison-gtk é GUI se você quiser):
sudo apt-get install unison unison-gtk
Crie um script
cron
não compartilha o mesmo AMBIENTE que <username>
e, portanto, não conseguirá localizar a chave RSA do Cliente necessária para se conectar ao Host. O Script 1 fornece esse ENVIRONMENT para o arquivo crontab de <username>
.
O script 1 também gera o Script 2, que é executado pelo arquivo crontab do <username>
a cada 10 minutos e executa o Unison.
- CAVEAT! Não sou especialista em scripts e adaptei este [1]
Script 1 ( /home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
)
#!/bin/sh
SSH_ENV=$HOME/.ssh/environment_for_cron ## file to be generated
SSH_ENV2=$HOME/Documents/Scripts/unison_sync.sh ## Script 2 to be generated
function start_agent {
echo "Initialising new SSH agent..."
env | grep SSH | sed 's/SSH_AUTH_SOCK=//' > ${SSH_ENV} ## send output of env | grep SSH minus "SSH_AUTH_SOCK=" so cron can get output from SSH_ENV
## create a new script with three lines, line 3 is unison command
echo "#!/bin/sh" > ${SSH_ENV2} ## line 1
env | grep SSH >> ${SSH_ENV2} ## line 2
echo "/usr/bin/unison /home/<username>/Desktop ssh://<Host's local IP address>:<Host's listening SSH Port>//home/<username>/Desktop -batch -debug update+ -ignore 'Name *.gvfs' -ignore 'Name .cache*' -ignore 'Name [Cc]ache*' -ignore 'Name .thumbnails*' -ignore 'Name [Tt]rash*' -ignore 'Name *.backup*' -ignore 'Name *~' -ignore 'Name .dropbox*' -ignore 'Name /proc/*' -ignore 'Name /sys/*' -ignore 'Name /dev/*' -ignore 'Name /run/*' -ignore 'Name /root/Ubuntu One/*'" >> ${SSH_ENV2} ## line 3
echo succeeded
chmod 644 ${SSH_ENV} ## change permissions so cron can read SSH_ENV
chmod 775 ${SSH_ENV2} ## change permissions so cron can execute SSH_ENV2
. ${SSH_ENV} > /dev/null
ssh-add id_rsa ## unlocks your RSA key and loads it into the ssh-agent which holds keys in memory throughout login session
}
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
Edite o crontab de <username>
para executar a sincronização a cada 10 minutos
crontab -e
Agora acrescente as seguintes linhas ao crontab
do
<username>
SSH_AUTH_SOCK=/home/<username>/.ssh/environment_for_cron
*/10 * * * * /home/<username>/Documents/Scripts/unison_sync.sh
- Verifique se há uma nova linha em branco seguindo as duas linhas acima no novo crontab!
Saia com Ctrl + x ; y
para "SIM"; Digite para confirmação. Verifique o arquivo crontab:
crontab -l
Definir o Script 1 para ser executado na inicialização
Use Dash
> Startup Applications
(ou Applications
> System Tools
> Preferences
no Gnome) para adicionar um novo programa de inicialização. Onde diz "Comando:", digite:
/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
Parabéns!
Se tudo correu bem, você digitará a senha da chave RSA do Cliente no login do Cliente e não precisará digitar a senha novamente durante a sessão de login. A cada 10 minutos, o Cliente negociará automaticamente uma conexão SSH sem senha, com o Host e o Unison sincronizando /home/<username>/Desktop
e //HOST//home/<username>/Desktop
. Seu laptop e desktop agora podem ser unidos em síncrona sagrada.
* Detalhes:
Minha configuração final se comunica como <username>
(não root
) usando uma porta SSH não padrão para "Host" em um IP estático. A Autenticação de Senha está desabilitada em "Host" (exigindo uma chave RSA pré-autenticada), enquanto a minha chave RSA em "Cliente" requer uma senha para uso (uma vez por sessão de login). Assim, um invasor precisa adivinhar a porta, a chave RSA e a senha corretas para criar um shell como <username>
com "Host".
Após essa entrada de senha por sessão de login, "Client" e "Host" se sincronizam automaticamente a cada 10 minutos. Esse foi o método que achei que funcionaria usando a chave RSA de <username>
e o cron
's ENVIRONMENT. **
CAVEAT! Claro, se uma ou ambas as máquinas estiverem offline, desligadas, etc., elas não serão sincronizadas!
** Por favor, não hesite em nos informar se existe um método mais simples usando uma chave RSA pertencente a root
no Cliente que não requer uma senha para uso enquanto o Host simultaneamente recusa conexões SSH baseadas em senha. / p>