Je veux exécuter un script linux sur mon ordinateur portable à distance depuis mon smartphone (iPhone, à savoir). Pour plus de simplicité, supposons que le script s'appelle myscript.sh
et qu'il se trouve dans /root/Desktop
. Je cours en tant qu'utilisateur root (ouais, je sais ce que je fais en cours d'exécution en tant que root.)
D'après les informations que j'ai recueillies, voici les solutions possibles:
1. Ecrivez une sorte d'application pour iPhone pour communiquer (Cela semble trop complexe et trop complexe pour moi.)
2. Envoi d'e-mails et utilisation de "Procmail"
3. Envoi d'emails et utilisation de "Postfix"
Toutes les méthodes mentionnées ci-dessus me sont plutôt inconnues; Je n'ai entendu parler d'eux que récemment. Quelqu'un peut-il m'éclairer sur N'IMPORTE QUELLE méthode qui me permet d'exécuter un linux de mon ordinateur portable à partir de mon smartphone.
Je vous remercie!
EDIT: Au fait, je n’ai pas de serveur à la maison.
Sudo apt-get install ngrok-client
echo 'auth_token: YOUR_AUTH_TOKEN' > ~/.ngrok
ngrok -proto=tcp 22
Vous obtiendrez quelque chose comme
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
est votre serveur SSH local accessible de n’importe où. Par défaut, le port est donné au hasard, mais vous pouvez le définir dans un fichier de configuration. Voir docs pour plus d'informations.
Testez-le avec ssh ngrok.com -p 52418
. Vous pouvez vous y connecter depuis n'importe quel client SSH depuis votre smartphone (j'utilise VX ConnectBot ) et faire tout ce que vous pouvez faire avec la ligne de commande sur votre ordinateur local, comme l'exécution de scripts:]
Pour un exemple simplifié, je créerai deux fichiers dans ~/test/
:
test.sh
, qui générera l'horodatage actuel et l'ajoutera à log.txt
:
#! /bin/sh
date +%s
date +%s >> log.txt
server.py
, qui attend la requête HTTP distante et exécute 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')
Maintenant, nous pouvons créer server.py
exécutable, l'exécuter, puis ouvrir http://127.0.0.1:8000
dans un navigateur et voir que le script a réellement fonctionné - il affichera l'horodatage actuel dans notre fenêtre de navigateur + l'ajoutera à ~/test/log.txt
.
Mais 127.0.0.1
n'est que localhost, et nous voulons accéder à notre serveur depuis Internet. C'est là que ngrok
entre. Installez-le avec Sudo apt-get install ngrok-client
et exécutez ngrok 8000
, il vous donnera quelque chose comme:
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
Ce https://a1b2c3d4.ngrok.com
est une adresse publique (c’est-à-dire accessible depuis Internet) qui sera effectivement servie par votre serveur local (qui exécutera votre script, si vous vous en souvenez :)). Par défaut, le nom du sous-domaine est donné au hasard, mais vous pouvez le définir dans un fichier de configuration. Voir docs pour plus d'informations.
Vous pouvez exécuter votre serveur et ngrok en arrière-plan, mais ceci est une autre histoire:]
Vous pouvez même avoir un contrôle à distance graphique complet avec TeamViewer Host sur votre ordinateur portable et l'application client TeamViewer sur votre smartphone. Facile, mais pourrait être trop consommateur de trafic pour une utilisation mobile.
Au lieu de TeamViewer, vous pourriez probablement utiliser VNC server + ngrok sur votre ordinateur portable et le client VNC sur votre smartphone.
Bien que ce ne soit en aucun cas le moyen le plus rapide ni le plus avancé de répondre à votre question, je pense que c'est probablement le plus facile à mettre en œuvre et à comprendre.
La méthode que j'utilise habituellement consiste à configurer un compte de messagerie factice et à l'interroger à chaque seconde pour obtenir de nouveaux courriers électroniques. Cela prend généralement environ 5 à 10 secondes entre l'envoi du courrier électronique sur votre téléphone et l'exécution du script. Notez que vous devez activer imap dans l'adresse électronique que vous avez créée.
Assurez-vous également que votre script bash commence par la ligne:
#!/usr/bin/env bash
Le script python que j'utilise est présenté ci-dessous. Bien sûr, vous devez entrer les informations pertinentes dans les quatre premières variables majuscules. Ouvrez un éditeur de texte et enregistrez ce qui suit sous le nom email-run.py
:
#!/usr/bin/env python
import imaplib,time,serial,subprocess
IMAP_SERVER = 'imap.gmail.com'
USERNAME = 'username'
PASSWORD = 'password'
PATH_TO_SCRIPT = '/root/Desktop/myscript.sh'
EXECUTE_IF_EMAIL_HAS = 'run'
def main():
imap_conn = imaplib.IMAP4_SSL(IMAP_SERVER)
imap_conn.login(USERNAME,PASSWORD)
imap_conn.select()
while(True):
text = get_new_body(imap_conn)
if text is not None:
if EXECUTE_IF_EMAIL_HAS.lower() in text.lower():
subprocess.call(PATH_TO_SCRIPT)
imap_conn.store(1,'+FLAGS','\\Deleted')
imap_conn.expunge()
time.sleep(1)
def get_new_body(imap_conn):
imap_conn.recent()
(typ, data) = imap_conn.search(None, 'ALL')
if data[0] == '':
return None
(typ, data) = imap_conn.fetch(1,'(RFC822)')
msg = data[0][1].split('\r\n\r\n')
index = 0
while(True):
if "text/plain" in msg[index]:
break
index += 1
return msg[index+1]
if __== "__main__":
main()
Vous pouvez le lancer avec:
python email-run.py
Jetez un oeil à Pushbullet . Depuis votre smartphone, envoyez un message ("Push") à votre PC. Un simple écouteur dbus s'exécute sur votre PC et exécute le script lorsque le Push est reçu. Il existe un AppIndicator Ubuntu qui vous permet d'écouter les envois sans navigateur. Voir ici .