Eu tenho um PC atrás de um NAT que faz uma conexão SSH reversa ao meu VPC Digitalocean. Utilizo essa conexão SSH invertida de casa para fazer login no PC do meu escritório (estou autorizado a fazê-lo), copiar arquivos e fazer outras coisas importantes.
Embora não seja frequente, notei que o PC do escritório reinicia (devido a falhas de energia, etc.) e interrompe a conexão SSH invertida que ele fez com o meu VPC. Nesse tipo de caso, não consigo conectar do meu PC em casa ao meu escritório.
Executo o script a seguir para fazer a conexão reversa + o proxy dinâmico para anonimizar meu tráfego (como não sou obrigado a compartilhar informações de navegação) gerado no PC do escritório.
autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
Não há como executar esse script novamente no PC do escritório após a reinicialização, pois não estou lá fisicamente. Para resolver esse problema, instalei o seguinte crontab.
Nota: o rev.sh
arquivo contém a linha acima. O certificado "digitalOcean" e rev.sh está localizado em Ubuntu home
. Portanto, quando executo ./rev.sh
no meu terminal Ubuntu, obtenho um proxy dinâmico e também acesso ao servidor DigitalOcean. Este método funciona 100%.
No entanto, quando instalo o chrontab no método a seguir, meu PC ubuntu nunca cria um proxy dinâmico. Percebo isso porque, quando verifico esse proxy do Google Chrome, ele diz que o proxy está recusando a conexão.
Aqui estão os cronejobs que tentei como raízes cronejobs. Eu também tentei isso como um usuário normal, ainda assim eles não funcionaram.
@reboot bash /home/user/rev.sh
@reboot /home/user/rev.sh
@reboot cd /home/user && ./rev.sh
Instalei um chrontab alguns minutos antes da hora atual e esperei que ele fosse executado.
24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh
estes também não foram executados.
Por favor, tenha a gentileza de me ajudar a identificar meu erro. Há muitas perguntas semelhantes neste site sobre o meu problema. Eu já referi muitas respostas, mas nenhuma delas parecia ajudar.
fonte
/var/log/cron*
. Para fins de teste, você pode simplesmente escrever algo como*/2 * * * * /path/to/script
- ele executará um script a cada 2 minutos. Verifique também se há e-mails para o usuário executando o cron. É raiz? Use omail
comando Oh, eu posso ver que você está usando a chave ssh? Duvido que o trabalho cron possa encontrá-lo se você não fornecer um caminho completo para ele após a-i
troca.Respostas:
Não sei se o uso
cron
para executar um script na inicialização é uma boa idéia. Uma alternativa que considero mais adequada é criar um serviço SystemD, conforme descrito aqui . Crie um arquivo chamado/etc/systemd/system/autossh.service
:Em seguida, execute o seguinte comando como root:
fonte
Você pode tentar algumas coisas:
Às vezes, seu caminho não está totalmente definido no momento da inicialização ou através dos cronjobs; portanto, substitua autossh pelo caminho completo, no meu sistema
O motivo @reboot depende do tempo de inicialização do daemon cron, portanto, pode ser chamado antes que outros subsistemas (rede?) estejam em funcionamento.
E seu exemplo do crontab:
invocará apenas no dia 8 de cada mês. E tem um campo extra. Tentar
fonte
/usr/bin
está sempre no padrãoPATH
, mesmo paracron
Parece que, quando o script é executado via crontab, ele não consegue encontrar seu certificado.
Quando você como usuário executa o script, ele usa o certificado de /home/ubuntu-user/.ssh / ... No entanto, quando o script é executado no crontab, ele é executado como root. root obtém os certificados de /root/.ssh
Então você tem várias maneiras de fazê-lo funcionar, mas acho que a execução do script como ubuntu-user no crontab faz isso.
Editar:
certifique-se de fornecer um caminho completo e qualificado para o certificado
fonte
Tente usar
su
:Isso ajudará no seu problema?
fonte
como a pergunta não possui muitos dados, começarei do zero com o que faria
Eu colocaria todas as configurações em / etc / ssh / ssh_config:
Eu colocaria a chave
/etc/ssh/mytunnel_key
então eu tentaria com uma entrada cron (um serviço upstart / systemd seria melhor) assim:
fonte
Você precisa usar -f e executar um comando quando executar sem um terminal. Então, aqui está um exemplo:
-f coloca em segundo plano, mas colocá-lo em segundo plano significa que o ssh se conectará e desconecte assim que concluir sua tarefa. Então você precisa de uma tarefa.
sleep 31536000 diz ao ssh para executar "sleep" por 1 ano após a conexão. Durante esse período, seus túneis permanecerão ativos.
Se você não executar um comando, o ssh se conectará, configure o túnel reverso na porta 2205 e, quando terminar, sairá. Usando autossh, se a conexão falhar, ela será reconectada e reiniciará o sono novamente. Mesmo com uma conexão de internet realmente estável, duvido que um ano seja possível.
BTW - ao contrário desses outros curingas, eu sei que isso funciona, porque eu realmente testei porque, obviamente, estou fazendo algo semelhante e, como o trabalho agora, com muita confiabilidade, posso lhe dar a resposta correta.
-f e "comando"
Está faltando isso.
fonte