I have a computer at work which I sometimes wakeup from home in order to access it but when boots and gets another IP address from our DHCP server, how can I access it?
The situation and my “workflow” is as follows:
Now in theory I'd be able to SSH to my office PC if only I'd knew its IP address. Sometimes it gets the same, sometimes it changes. To circumvent this I had the following idea:
All computers run Linux; Ubuntu 14.04 at home, SLES on the office server, OpenSUSE 13.1 on my office PC. This is all not a problem.
For this all to work I simply need a script on my office PC that runs at boot time when the network is up and running.
My script (publish_ip.sh) is like follows:
# 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"
To run this script at boot time I created a systemd service file, publish-ip.service, for my office PC:
[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
But this is what I always get on my office 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
Obviously my service starts and also calls my script but the SSH command in that script fails with Network is unreachable
.
I tried everything in my service file so that it runs only after the network is up, but I don't get it. I tried Wants=network.target
,
After=network.target
, WantedBy=multi-user.target
, and even inserted an ExecStartPre=/usr/bin/sleep 30
. Nothing worked.
I always get Network is unreachable
when my script is called and tries to SSH to the office server.
Question: What settings are required in my service file so that it runs only after the office server is reachable with SSH?
Note: When I'm at office and my office PC is up-and-running, both my script and the service work perfectly, i.e. systemctl start publish-ip.service
works without any errors.
You can delay the starting of your job by adding a ping loop as an ExecStartPre script:
[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
Found here
I tried all these targets, and they all were reached before DHCP got an IP address. Go figure:
network-online.target
remote-fs.target
nfs-client.target
dbus.service
What did work was enabling these two:
systemctl enable systemd-networkd.service systemd-networkd-wait-online.service
And then setting
After=systemd-networkd-wait-online.service
Wants=systemd-networkd-wait-online.service
Now it got started after DHCP got an IP address. (A mount point in my case, but could have been your service too)
(On debian9/stretch)
Not a full solution, but I set up an SSH tunnel once the computer boots; it restarts every 5 seconds to prevent getting killed for spamming while the network is still down; you could use something like this paired with your WOL, if you can use the fixed IP system as a bastion host:
[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
Relevant part of root's .ssh/config:
Host hometunnel
HostName <redacted>
IdentityFile /root/.ssh/<redacted>
User <redacted>
RemoteForward <redacted> localhost:22
ExitOnForwardFailure yes
ServerAliveInterval 60
ServerAliveCountMax 5
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With