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

时间:2019-08-01 08:13:50

标签: python ssh service systemd

这是我的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。

1 个答案:

答案 0 :(得分:0)

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