首页 文章

systemd:网络启动后启动时启动服务(用于WoL目的)

提问于
浏览
4

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

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

  • 从家用电脑上我连接到办公室的VPN

  • ssh到办公室局域网中的专用服务器(它有固定的IP地址)
    在该服务器上

  • 我调用一个脚本,该脚本使用我办公室PC的MAC地址广播WoL数据包

  • 我的办公室电脑启动了(确实如此!)

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

  • 启动我的办公室后,PC对办公室服务器进行SSH操作,并将自己的IP地址写入服务器上的某个文本文件

  • 我检查服务器上的那个文件(由于其固定的IP,我可以连接到该文件),查找我的办公室PC的IP地址,然后可以从家用PC连接到我的办公室PC

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

为了实现这一切,我只需要在办公室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

但这是我在办公室电脑上总是得到的:

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 .

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

问题:我的服务文件中需要进行哪些设置才能在使用SSH访问办公室服务器后才能运行?

注意:当我在办公室并且我的办公室PC正常运行时,我的脚本和服务都能正常工作,即 systemctl start publish-ip.service 可以正常运行 .

3 回答

  • 0

    曾经有一个名为arpwatch的工具,它记录了所有联网设备的IP地址和MAC地址,因此您可以简单地为计算机的MAC获取IP并获取IP .

    还有一个名为arping的工具,你可以通过输出获取MAC地址 .

    另一种选择是在您的计算机上保持随机端口打开并使用nmap扫描整个网络以查找该特定端口,或者为整个网络nmap显示已启动且grep为您的MAC地址的主机...

    nmap -sP 192.168.1.0/24
    
  • 0

    不是一个完整的解决方案,但是一旦计算机启动我就 Build 了一个SSH隧道;它会每5秒重新启动一次,以防止在网络仍然停机时因垃圾邮件而被杀死;如果您可以使用固定IP系统作为堡垒主机,您可以使用与您的WOL配对的类似内容:

    [Unit]
    Description=Keep open a reverse tunnel to my home server
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/ssh -NT hometunnel
    RestartSec=5
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    root的.ssh / config的相关部分:

    Host                    hometunnel
    HostName                <redacted>
    IdentityFile    /root/.ssh/<redacted>
    User                    <redacted>
    RemoteForward   <redacted> localhost:22
    ExitOnForwardFailure yes
    ServerAliveInterval 60
    ServerAliveCountMax 5
    
  • 0

    我尝试了所有这些目标,并且在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地址后开始了 . (A mount point in my case,但也可能是你的服务)

    (关于debian9 / stretch)

相关问题