Per*_*uck 6 linux ssh networking systemd
我有一台工作中的计算机,有时我会从家里唤醒以访问它,但是当启动并从我们的 DHCP 服务器获取另一个 IP 地址时,我该如何访问它?
情况和我的“工作流程”如下:
现在理论上,只要我知道它的 IP 地址,我就可以通过 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"
Run Code Online (Sandbox Code Playgroud)
为了在启动时运行这个脚本,我为我的办公室 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
Run Code Online (Sandbox Code Playgroud)
但这就是我在办公室 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
Run Code Online (Sandbox Code Playgroud)
显然,我的服务启动并调用了我的脚本,但该脚本中的 SSH 命令失败并显示Network is unreachable.
我尝试了我的服务文件中的所有内容,以便它仅在网络启动后运行,但我不明白。我试过Wants=network.target,
After=network.target, WantedBy=multi-user.target, 甚至插入了一个ExecStartPre=/usr/bin/sleep 30. 没有任何效果。Network is unreachable当我的脚本被调用并尝试通过 SSH 连接到办公室服务器时,我总是得到消息。
问题:我的服务文件需要哪些设置才能仅在通过 SSH 访问办公服务器后才运行?
注意:当我在办公室并且我的办公室 PC 启动并运行时,我的脚本和服务都运行良好,即systemctl start publish-ip.service
运行没有任何错误。
Pet*_*rch 11
我尝试了所有这些目标,并且在 DHCP 获得 IP 地址之前都达到了。去搞清楚:
network-online.targetremote-fs.targetnfs-client.targetdbus.service有效的是启用这两个:
systemctl enable systemd-networkd.service systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)
然后设置
After=systemd-networkd-wait-online.service
Wants=systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)
现在它在DHCP 获得 IP 地址后开始。(在我的情况下是一个挂载点,但也可能是您的服务)
(在 debian9/stretch 上)
小智 11
您可以通过添加 ping 循环作为 ExecStartPre 脚本来延迟作业的开始:
[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16401 次 |
| 最近记录: |