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 进程(由该脚本引起)将在程序退出时关闭。
这是我的 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 进程(由该脚本引起)将在程序退出时关闭。