我在工作中有一台电脑,有时我会在家里启动它以便访问,但是当它启动并从我们的DHCP服务器获取另一个IP地址时,我该如何访问它呢?
情况和我的“工作流程”如下:
- 我从家里的电脑连接到办公室的VPN
- ssh到办公室局域网中的一台专用服务器(它有一个固定的IP地址)
- 在那台服务器上,我调用一个脚本来广播一个带有我的办公室电脑MAC地址的WoL数据包
- 我的办公室电脑启动(确实如此,肯定没错!)
现在理论上我应该能够通过SSH连接到我的办公室电脑,只要我知道它的IP地址。 有时它保持不变,有时它会改变。 为了规避这个问题,我有以下想法:
- 在启动后,我的办公室电脑会通过SSH连接到办公室服务器,并将自己的IP地址写入服务器上的某个文本文件中
- 我可以通过检查服务器上的那个文件(因为它有固定的IP地址)找到我的办公室电脑的IP地址,然后可以从家里的电脑通过SSH连接到我的办公室电脑
为了让这一切正常运行,我只需要在办公室个人电脑上有一个脚本,在网络启动并运行时自动执行。
我的脚本(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"
为了在启动时运行此脚本,我创建了一个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命令失败,显示“网络不可达”。
我尝试了在我的服务文件中的所有设置,以便它只在网络连接正常后运行,但是我无法解决这个问题。我尝试了“Wants=network.target”,“After=network.target”,“WantedBy=multi-user.target”,甚至插入了“ExecStartPre=/usr/bin/sleep 30”。但是都没有起作用。每次当我的脚本被调用并尝试SSH连接到办公室服务器时,我总是得到“网络不可达”的错误。
问题:我在我的服务文件中需要哪些设置,才能确保它只在办公室服务器可通过SSH连接时运行?
注意:当我在办公室,我的办公电脑正常运行时,我的脚本和服务都能正常工作,即“systemctl start publish-ip.service”可以正常运行,没有任何错误。
network.target
更改为network-online.target
解决了我的问题。 - mgilbert