gpt4 book ai didi

linux - systemd:在网络真正启动后在启动时启动服务(用于 WoL 目的)

转载 作者:太空狗 更新时间:2023-10-29 11:07:57 29 4
gpt4 key购买 nike

我有一台工作中的计算机,有时我会从家里醒来以便访问它,但是当启动并从我们的 DHCP 服务器获取另一个 IP 地址时,我该如何访问它?

情况和我的“工作流程”如下:

  • 我从家里的 PC 连接到办公室的 VPN
  • ssh 到办公室 LAN 中的专用服务器(它具有固定的 IP 地址)
  • 在那台服务器上,我调用了一个脚本,该脚本使用我办公室 PC 的 MAC 地址广播 WoL 数据包
  • 我的办公室 PC 启动了(它真的启动了,当然!)

现在理论上,只要我知道它的 IP 地址,我就可以通过 SSH 连接到我的办公室 PC。有时它变得相同,有时它会改变。为了避免这种情况,我有以下想法:

  • 启动办公室 PC 后,通过 SSH 连接到办公室服务器,并将其自己的 IP 地址写入服务器上的某个文本文件
  • 我在服务器上检查该文件(由于其固定 IP,我可以连接到该文件),找到我办公室 PC 的 IP 地址,然后可以从我的家用 PC 通过 SSH 连接到我的办公室 PC

所有计算机都运行 Linux;家里的 Ubuntu 14.04,办公室服务器上的 SLES,我办公室 PC 上的 OpenSUSE 13.1。这都不是问题。

为了让这一切正常工作,我只需要在我的办公室 PC 上安装一个脚本,该脚本可以在启动时当网络启动并运行时运行。

我的脚本(publish_ip.sh)如下:

# get own IP address:
ip=$(ip addr show | awk '$1=="inet" && $2 !~ /127\.0\.0\.1/ { split($2, a, "/"); print a[1]}');

# SSH to the office server (10.64.5.84) and write own IP address to a file there:
ssh -x -e none 10.64.5.84 "echo $(date) $ip >> office_pc_address.txt"

为了在启动时运行这个脚本,我为我的办公室 PC 创建了一个 systemd 服务文件 publish-ip.service:

[Unit]
Description=publishes own IP address
Wants=network.target
After=network.target

[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep 30
ExecStart=/home/perldog/bin/publish_ip.sh
User=perldog

[Install]
WantedBy=multi-user.target

但这是我在办公室 PC 上经常看到的:

linux-tz7m:/usr/lib/systemd/system # systemctl status publish-ip.service
publish-ip.service - publishes own IP address
Loaded: loaded (/usr/lib/systemd/system/publish-ip.service; enabled)
Active: failed (Result: exit-code) since Mon 2016-02-29 12:17:34 CET; 4 days ago
Process: 1688 ExecStart=/home/perldog/bin/publish_ip.sh (code=exited, status=255)
Process: 1016 ExecStartPre=/usr/bin/sleep 30 (code=exited, status=0/SUCCESS)
Main PID: 1688 (code=exited, status=255)

Feb 29 12:17:34 linux-tz7m publish_ip.sh[1688]: ssh: connect to host 10.64.5.84 port 22: Network is unreachable

很明显,我的服务启动并调用了我的脚本,但该脚本中的 SSH 命令失败并显示 Network is unreachable

我尝试了我的服务文件中的所有内容,以便它仅在 网络启动后运行,但我不明白。我试过 Wants=network.targetAfter=network.targetWantedBy=multi-user.target,甚至还插入了一个ExecStartPre=/usr/bin/sleep 30。没有任何效果。当我的脚本被调用并尝试通过 SSH 连接到办公室服务器时,我总是得到 Network is unreachable

问题:我的服务文件需要哪些设置才能使其仅在 办公室服务器可通过 SSH 访问后运行?

注意:当我在办公室并且我的办公室 PC 启动并运行时,我的脚本和服务都可以完美运行,即 systemctl start publish-ip.service工作没有任何错误。

最佳答案

我尝试了所有这些目标,它们都在 DHCP 获得 IP 地址之前就已达到。去图:

  • network-online.target
  • remote-fs.target
  • nfs-client.target
  • dbus.service

起作用的是启用这两个:

systemctl enable systemd-networkd.service systemd-networkd-wait-online.service

然后设置

After=systemd-networkd-wait-online.service
Wants=systemd-networkd-wait-online.service

现在 DHCP 获得 IP 地址后它开始了。 (一个 mount point in my case ,但也可能是您的服务)

(在 debian9/stretch 上)

关于linux - systemd:在网络真正启动后在启动时启动服务(用于 WoL 目的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35805354/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com