选项 1:SSH +恩格罗克

选项 1:SSH +恩格罗克

我想通过我的智能手机(即 iPhone)远程运行笔记本电脑上的 Linux 脚本。为简单起见,我们假设该脚本名为 ,myscript.sh位于/root/Desktop。我以 root 用户身份运行(是的,我知道以 root 用户身份运行该做什么。)

根据我收集到的信息,以下是可能的解决方案:
1. 编写某种用于 iPhone 通信的应用程序(听起来很费力,而且对我来说太复杂了。)
2. 发送电子邮件并使用“Procmail”
3. 发送电子邮件并使用“Postfix”

上述所有方法我都不太了解;直到最近我才听说过。所以有人能告诉我任何一种允许我从智能手机运行笔记本电脑的 Linux 的方法吗?

谢谢你!

编辑:顺便说一句,我家里没有运行服务器。

答案1

选项 1:SSH +恩格罗克

  1. 我相信 Ubuntu 上默认监听 22 端口的 SSH 服务器。
  2. 使用以下方式安装 ngroksudo apt-get install ngrok-client
  3. 注册ngrok.com获取身份验证令牌(需要使用非 http 协议)。
  4. 让本地 ngrok 知道你的帐户echo 'auth_token: YOUR_AUTH_TOKEN' > ~/.ngrok
  5. 跑步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

答案3

看一眼推弹。从您的智能手机向您的 PC 发送一条消息(“推送”)。一个简单的 dbus 监听器在您的 PC 上运行,并在收到推送时运行脚本。有一个 Ubuntu AppIndicator 允许您在没有浏览器的情况下监听推送。请参阅这里

相关内容