Ubuntu – How to suspend over ssh

dbusserversshsuspend

I guess this question is pretty much the same as How to configure dbus to allow ssh-user to suspend server?; except I wanted to formulate it better.

Assume I have an Ubuntu server running nonstop, let's call it MyServer. Let's say then, I have another PC on the same local network as MyServer, let's call it MyLocalPC.

MyLocalPC is then kept in suspend, unless it is turned on via wakeonlan by MyServer. This part of the process works perfectly for me: I can log in via ssh to MyServer, and on the MyServer ssh prompt I can issue wakeonlan, and MyLocalPC wakes up – great.

Then, however, as soon as I'm done working with MyLocalPC, I'd like to put it into suspend again. The problem is as follows – I can put the machine in suspend easy, if I ssh into MyLocalPC first via ssh:

[MyServer]$ ssh MyLocalPC
[MyLocalPC]$ dbus-send --session --dest=org.freedesktop.PowerManagement --type=method_call --print-reply --reply-timeout=2000 /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Suspend

This will suspend MyLocalPC – but will also block the ssh exiting properly, and eventually the ssh to MyServer ends up frozen. I try to get tricky and issue something like this:

[MyServer]$ ssh MyLocalPC "dbus-send --session --dest=org.freedesktop.PowerManagement --type=method_call --print-reply --reply-timeout=2000 /org/freedesktop/PowerManagement org.freedesktop.PowerManagement.Suspend"
Failed to open connection to "session" message bus: /bin/dbus-launch terminated abnormally with the following error: Autolaunch error: X11 initialization failed.

Then I read somewhere DISPLAY variable should be defined – but that fails too:

[MyServer]$ ssh MyLocalPC "DISPLAY=:0 dbus-send --session --dest=org.freedesktop.PowerManagement --type=method_call --print-reply --reply-timeout=2000 /org/freedesktop/PowerManagement  org.freedesktop.PowerManagement.Suspend"
Error org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.PowerManagement was not provided by any .service files

So does anyone know how can I issue a suspend to MyLocalPC, without the ssh connection to MyServer freezing?

Best Answer

Just type <enter>~& (that's three keystrokes: enter, squggle, ampersand) and ssh will go into the background, and eventually timeout by itself. That's good if you want to just abandon an interactive session in a case like this.

Or, alternatively, put that into a shell script on MyLocalPC and connect in a way that will background the connection:

ssh -f MyLocalPC go-to-sleep