Opção 1: SSH + ngrok
- Eu acredito que o servidor SSH que escuta em 22 portas vem por padrão no Ubuntu.
- Instale o ngrok com
sudo apt-get install ngrok-client
- Inscreva-se em ngrok.com para obter um token de autenticação (necessário para usar protocolos não-http).
- Deixe o ngrok local saber sobre sua conta
echo 'auth_token: YOUR_AUTH_TOKEN' > ~/.ngrok
- Executar
ngrok -proto=tcp 22
Você receberá algo como
Tunnel Status online
Version 1.6/1.6
Forwarding tcp://ngrok.com:52418 -> 127.0.0.1:22
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
ngrok.com:52418
é o seu servidor SSH local acessível de qualquer lugar. Por padrão, a porta é dada aleatoriamente, mas você pode configurá-la no arquivo de configuração. Consulte docs para mais informações.
Teste com ssh ngrok.com -p 52418
. Você pode se conectar a ele de qualquer cliente SSH do seu smartphone (estou usando o VX ConnectBot ) e fazer tudo o que você pode fazer com a linha de comando no seu computador local, como executar scripts:]
Opção 2: servidor HTTP simples + ngrok
Para um exemplo simplificado, criarei dois arquivos em ~/test/
:
-
test.sh
, que exibirá o registro de data e hora atual e o anexará alog.txt
:#! /bin/sh date +%s date +%s >> log.txt
-
server.py
, que aguardará solicitação HTTP remota e executarátest.sh
:#!/usr/bin/env python3 import http.server, os, subprocess class HTTPRequestHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): path = 'test.sh' # Make path absolute if path[0] != '/': path = os.getcwd() + '/' + path # If file exists, execute it and return output if os.path.isfile(path): if os.access(path, os.X_OK): p = subprocess.Popen(path, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() content = stdout.decode('UTF-8') else: content = path + ' is not executable' self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(content.encode('UTF-8')) else: self.send_header('Content-type', 'text/html') self.send_response(404, 'File Not Found') self.end_headers() PORT = 8000 handler_class = HTTPRequestHandler httpd = http.server.HTTPServer(('', PORT), handler_class) print('Listening at port', PORT) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() print('Server stopped')
Agora, podemos executar server.py
executável, executá-lo e, em seguida, abrir http://127.0.0.1:8000
em um navegador e ver se o script realmente funcionou - ele exibirá o registro de data e hora atual em nossa janela do navegador + anexá-lo a ~/test/log.txt
.
Mas 127.0.0.1
é apenas localhost e queremos acessar nosso servidor da Internet. É aí que entra o ngrok
. Instale-o com sudo apt-get install ngrok-client
e execute ngrok 8000
, ele lhe dará algo como:
Tunnel Status online
Version 1.6/1.6
Forwarding http://a1b2c3d4.ngrok.com -> 127.0.0.1:8000
Forwarding https://a1b2c3d4.ngrok.com -> 127.0.0.1:8000
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms
Esse https://a1b2c3d4.ngrok.com
é o endereço público (ou seja, acessível pela Internet) que será realmente servido pelo seu servidor local (que executará o seu script, como você se lembra :)). Por padrão, o nome do subdomínio é dado aleatoriamente, mas você pode configurá-lo no arquivo de configuração. Consulte docs para mais informações.
Você pode executar o seu servidor e o ngrok em segundo plano, mas isso é outra história:]
Opção 3: TeamViewer (ou VNC + ngrok)
Você pode até ter controle remoto gráfico completo com o host TeamViewer em seu laptop e o aplicativo cliente TeamViewer em seu smartphone. Fácil, mas pode consumir muito tráfego para uso móvel.
Em vez do TeamViewer, você provavelmente poderia usar o servidor VNC + ngrok em seu laptop e o cliente VNC em seu smartphone.