Я хочу запустить скрипт Linux на своем ноутбуке удаленно с моего смартфона (iPhone, а именно). Для простоты скажем, называют сценарий myscript.sh
и это расположено в /root/Desktop
. Я работаю как пользователь root (Да, я знаю то, что я делаю выполнение как корень.)
От информации я имею, заключают, что это возможные решения:
1. Запишите своего рода приложение для iPhone для передачи (Звуки, кропотливые и слишком сложные для меня.)
2. Отправка электронных писем и использование вещи "Procmail"
3. Отправка электронных писем и использование "Постфиксной" вещи
Все упомянутые выше методы довольно неизвестны мне; я не услышал о них до недавнего времени. Так может кто-либо просвещать меня на ЛЮБОМ методе, которые позволяют мне запускать Linux своего ноутбука с моего смартфона.
Спасибо!
Править: Между прочим, у меня нет серверов, работающих дома.
sudo apt-get install ngrok-client
echo 'auth_token: YOUR_AUTH_TOKEN' > ~/.ngrok
ngrok -proto=tcp 22
Вы получите что-то как
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
Ваш локальный сервер SSH, доступный отовсюду. Портом по умолчанию дан наугад, но можно установить его в файле конфигурации. См. документы для большего количества информации.
Протестируйте его с ssh ngrok.com -p 52418
. Можно соединиться с ним от любого клиента SSH со смартфона (я использую VX ConnectBot), и сделайте все, что можно сделать с командной строкой на локальном компьютере, как выполняющиеся сценарии:]
Для упрощенного примера я создам два файла в ~/test/
:
test.sh
, который произведет текущую метку времени и добавит ее к log.txt
:
#! /bin/sh
date +%s
date +%s >> log.txt
server.py
, который будет ожидать удаленного Запроса HTTP и выполняться 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')
Теперь мы можем сделать server.py
исполняемый файл, выполненный это, затем открывается http://127.0.0.1:8000
в браузере и видят, что сценарий на самом деле работал — он произведет текущую метку времени в нашем окне браузера +, добавляют его к ~/test/log.txt
.
Но 127.0.0.1
просто localhost, и мы хотим достигнуть нашего сервера из Интернета. Это то, где ngrok
входит. Установите его с sudo apt-get install ngrok-client
и выполнитесь ngrok 8000
, это даст Вам что-то как:
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
Это https://a1b2c3d4.ngrok.com
общедоступный адрес (т.е. доступный из Интернета), который будет на самом деле подаваться Вашим локальным сервером (который выполнит Ваш сценарий, как Вы помните :)). Субдоменом по умолчанию имя дано наугад, но можно установить его в файле конфигурации. См. документы для большего количества информации.
Можно выполнить и сервер и ngrok в фоне, но это - другая история:]
У Вас может даже быть полное графическое дистанционное управление с хостом TeamViewer на Вашем ноутбуке и клиентским приложением TeamViewer по Вашему смартфону. Легкий, но могло быть также транспортное потребление для мобильного использования.
Вместо TeamViewer Вы могли, вероятно, использовать сервер VNC + ngrok на Вашем ноутбуке и клиенте VNC по Вашему смартфону.
В то время как это ни в коем случае не самый быстрый или самый усовершенствованный способ ответить на Ваш вопрос, я думаю, что является, вероятно, самым легким реализовать и понять.
Метод, который я обычно использую, должен настроить фиктивный почтовый ящик и опросить его относительно новых электронных писем каждую секунду. Это обычно занимает приблизительно 5-10 секунд от того, когда Вы послали электронное письмо по своему телефону и до выполнений сценария. Обратите внимание, что необходимо включить IMAP в адресе электронной почты, который Вы создаете.
Также удостоверьтесь, что Ваш сценарий удара запускается со строки:
#!/usr/bin/env bash
Сценарий Python, который я использую, показывают ниже. Конечно, необходимо ввести соответствующую информацию в первые четыре переменные всех заглавных букв. Откройте текстовый редактор и сохраните следующее как 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 __name__ == "__main__":
main()
Можно выполнить его с:
python email-run.py
Смотрите на Pushbullet. С Вашего смартфона отправьте сообщение ("нажатие") к Вашему ПК. Простой dbus слушатель работает на Вашем ПК и выполняет сценарий, когда нажатие получено. Существует Ubuntu AppIndicator, который позволяет Вам прислушиваться к нажатиям без браузера. См. здесь .