首页 > 解决方案 > 服务调用的 Python 脚本(打开反向 SSH 隧道)不起作用

问题描述

这是我的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,此脚本退出 0/成功,即使 ssh 隧道连接在 .

● 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,否则脚本脚本会显示“主机无法访问”为此,我最后使用了此服务文件:

[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。

标签: pythonsshservicesystemd

解决方案


最后,分叉不是解决方案。分叉没问题,但是对于这种类型的服务,脚本一直处于激活状态,直到用户按下按钮。这是一个问题,其他服务正在等待该服务运行、停止或至少加载但未卡在激活状态。这个问题是由 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 进程(由该脚本引起)。


推荐阅读