我有一台计算机正在工作,我有时会从家里唤醒以便访问它但是当我们启动并从我们的DHCP服务器获取另一个IP地址时,我该如何访问它?
情况和我的“工作流程”如下:
现在理论上,如果我只知道其IP地址,我就可以通过SSH连接到我的办公室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
。
我尝试了服务文件中的所有内容,以便在 网络启动后只运行 ,但我无法获得它。我试过Wants=network.target
,
After=network.target
,WantedBy=multi-user.target
,甚至插入ExecStartPre=/usr/bin/sleep 30
。没有任何效果。
我的脚本被调用后总是得到Network is unreachable
并尝试通过SSH连接到办公室服务器。
问题:我的服务文件中需要哪些设置,以便在可以通过SSH访问办公室服务器之后只运行?
注意:当我在办公室并且办公室电脑正常运行时,我的脚本和服务都能正常运行,即systemctl start publish-ip.service
工作没有任何错误。
答案 0 :(得分:1)
我尝试了所有这些目标,并且在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地址。 (https://www.fastly.com/blog/caching-cors,但也可以为您服务)
(在debian9 / stretch上)
答案 1 :(得分:1)
答案 2 :(得分:0)
曾经有一个名为arpwatch的工具,它记录了所有联网设备的IP地址和MAC地址,因此您可以简单地为您的计算机的MAC获取IP并获取IP。
还有一个名为arping的工具,你可以通过输出获取MAC地址。
另一种选择是在您的计算机上保持随机端口打开并使用nmap扫描整个网络以获取该特定端口,或者为整个网络nmap整个网络以获取MAC地址为up和grep的主机...
nmap -sP 192.168.1.0/24
答案 3 :(得分:0)
不是完整的解决方案,但是一旦计算机启动,我就建立了一个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