我想通过我的智能手机(即 iPhone)远程运行笔记本电脑上的 Linux 脚本。为简单起见,我们假设该脚本名为 ,myscript.sh
位于/root/Desktop
。我以 root 用户身份运行(是的,我知道以 root 用户身份运行该做什么。)
根据我收集到的信息,以下是可能的解决方案:
1. 编写某种用于 iPhone 通信的应用程序(听起来很费力,而且对我来说太复杂了。)
2. 发送电子邮件并使用“Procmail”
3. 发送电子邮件并使用“Postfix”
上述所有方法我都不太了解;直到最近我才听说过。所以有人能告诉我任何一种允许我从智能手机运行笔记本电脑的 Linux 的方法吗?
谢谢你!
编辑:顺便说一句,我家里没有运行服务器。
答案1
选项 1:SSH +恩格罗克
- 我相信 Ubuntu 上默认监听 22 端口的 SSH 服务器。
- 使用以下方式安装 ngrok
sudo apt-get install ngrok-client
- 注册ngrok.com获取身份验证令牌(需要使用非 http 协议)。
- 让本地 ngrok 知道你的帐户
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 连接机器人)并执行您在本地计算机上使用命令行可以执行的所有操作,例如执行脚本:]
选项 2:简单的 HTTP 服务器 +恩格罗克
为了简化示例,我将创建两个文件~/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,但那是另一个故事:]
选项 3:TeamViewer(或 VNC + ngrok)
您甚至可以使用笔记本电脑上的 TeamViewer 主机和智能手机上的 TeamViewer 客户端应用程序进行全图形远程控制。简单,但对于移动使用来说可能会消耗太多流量。
除了 TeamViewer,您可能还可以在笔记本电脑上使用 VNC 服务器 + ngrok,在智能手机上使用 VNC 客户端。
答案2
虽然这绝不是回答你的问题最快或最先进的方法,但我认为它可能是最容易实现和理解的方法。
我通常使用的方法是设置一个虚拟电子邮件帐户,并每秒轮询一次新电子邮件。从您在手机上发送电子邮件到脚本运行,这通常需要大约 5-10 秒。请注意,您必须在创建的电子邮件地址中启用 imap。
还要确保您的 bash 脚本以该行开头:
#!/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