繁体   English   中英

服务调用的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,则此脚本退出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。

最后,分叉不是解决方案。 分叉是可以的,但是使用这种类型的服务,脚本一直处于激活状态,直到用户按下按钮为止。 这是一个问题,其他服务正在等待该服务运行,停止或至少已加载,但没有卡在激活上。 该问题是由while循环引起的(直到用户按下按钮,才返回true)。 然后,一旦用户按下按钮,服务就会运行或退出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进程(由该脚本引发)将关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM