Você não precisa executar comandos de cron
via sudo
.
Crie um script como este abaixo e coloque-o no diretório pessoal do usuário que estabelecerá a conexão SSH reversa com seu servidor:
#!/bin/sh
### reverseSSHscript.sh ###
### (use public key authentication, so you don't need
### to enter password for your server)
PrivateKeyToAccessCentralServer='/path/to/the/private/ssh/ServerKey.pem'
(
/usr/bin/nohup \
/usr/bin/ssh -gNnT \
-i "${PrivateKeyToAccessCentralServer}" \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=1 \
-o TCPKeepAlive=no \
-o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-o CheckHostIP=no \
-R 2222:localhost:22 pi@publicserverIP
) &
Em seguida, crie a tarefa do cron para executá-lo:
echo "@reboot User /path2the_script_shown_above/reverseSSHscript.sh" |
sudo tee /etc/cron.d/reverseSSH2home
Então deve funcionar.
BTW, você pode querer executar este script em algum User
restrito em vez de como root
apenas para estar em um lado seguro.
Você também precisa implementar alguma lógica em reverseSSHscript.sh
que verifique se a conexão já está estabelecida, para evitar a criação de várias sessões.
Execute também algumas verificações adicionais do cron periodicamente para testar se a porta de conexão reversa ainda está ativa em seu servidor; algo assim:
chkRemPort() {
# Connect to intermediate host and check if remote forwarded port is alive
echo $(/usr/bin/ssh -4 -f -q \
-o BatchMode=yes \
-o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no \
-o CheckHostIP=no \
-i /path/to/the/private/ssh/ServerKey.pem \
pi@publicserverIP \
/bin/nc -w 3 -zv localhost 2222 2>&1 | /bin/grep succeeded > /dev/null ; \
[ $? -eq 0 ] && { echo 'OK'; } || { echo 'FAILED'; }; exit; )
}
Se a verificação falhar, tente estabelecer uma nova sessão reversa no seu servidor.
P.S.
Portas invertidas em cada Raspberry Pi devem ser diferentes, para evitar conflito entre portas no seu servidor