Python 服务调用的脚本(打开反向 SSH 隧道)不起作用

Python script (which open Reverse SSH tunnel) called by service doesn't work

这是我的 python 脚本:

#!/usr/bin/env python3
import subprocess

subprocess.run(['ssh', '-fNT','-o', 'ExitOnForwardFailure=yes', '-R', '2222:localhost:22', 'martin@192.168.11.111'])

由我的服务调用:

[Unit]
Description=reverse SSH
After=multi-user.target
Conflicts=getty@tty1.service

[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py
User=pi
Group=pi
WorkingDirectory=/home/pi/Public/
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

如果我信任 systemctl,即使 ssh 隧道连接在 .

后不起作用,此脚本退出 0/成功
● reverse_ssh.service - reverse SSH
   Loaded: loaded (/lib/systemd/system/reverse_ssh.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2019-08-01 10:01:21 CEST; 6min ago
  Process: 549 ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py (code=exited, status=0/SUCCESS)
 Main PID: 549 (code=exited, status=0/SUCCESS)

août 01 10:01:19 raspberrypi systemd[1]: Started reverse SSH.

如果我独立执行这个脚本(我的意思是像“./script.py”)这个脚本工作。 在我用服务调用的时候出现了这个问题...我哪里做错了??

谢谢!

编辑

问题已解决。问题出在我的服务文件上。 我不得不将 "Type:simple" 更改为 "Type=forking",因为我需要从我的 python 脚本中调用另一个进程。 我还必须等到设备获得 @IP 否则脚本脚本 trew "Host unreacheable" 为此,我在最后使用了这个服务文件:

[Unit]
Description=reverse SSH
Wants=network-online.target
After=network.target network-online.target

[Service]
Type=forking
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/python3 /home/pi/Public/OnPushButton_PULLUP.py
User=pi
Group=pi
WorkingDirectory=/home/pi/Public/
TimeoutSec=infinity

[Install]
WantedBy=multi-user.target

通常只添加这个有效:

Wants=network-online.target
After=network.target network-online.target

但它不适合我。这就是为什么我放一个 :

ExecStartPre=/bin/sleep 10

此行向服务提及他将在尝试执行之前等待 10 秒。这将使设备有时间从 dhcp 获取@IP。

最后,分叉不是解决方案。分叉是可以的,但是对于这种类型的服务,脚本一直处于激活状态,直到用户按下按钮。这是个问题,其他服务正在等待此服务 运行、停止或至少已加载,但未卡在激活状态。此问题是由 while 循环引起的(在用户按下按钮之前为真)。然后,一旦用户按下按钮,服务就会 运行 或退出 0,而不是之前。 我用下面的这个改变了服务并且它起作用了:

[Unit]
After=network.target network-online.target
Description=reverse SSH
Wants=network-online.target

[Service]
ExecStart=/usr/bin/python3 /home/pi/OnPushButton_PULLUP.py
ExecStartPre=/bin/sleep 10
Group=pi
RemainAfterExit=yes
TimeoutSec=infinity
Type=simple
User=pi
WorkingDirectory=/home/pi/

[Install]
WantedBy=multi-user.target

注意 "RemainAfterexit=Yes" 否则 sshtunnel 进程(由该脚本引起)将在程序退出时关闭。