The problem is that this requires an APlayerController to be on the local game to do, but there are noAPlayerControllers on clients ever. So naturally I was assuming that there was some sort of behind the scenes black magic that was happening where the subsystem would somehow replicate to the client and that way the callbacks for the UInputActions would call so the server could know to move the character. Otherwise the character would never move.
But nope, as I suspected, the input callbacks never call on clients, and thus clients never move. So leading back to my question: How are you supposed to setup input on clients if there are no APlayerControllers?
So I think your a bit mistaken on the Player Controllers there. The Player Controller is only valid on the Owning Client and the Server, so you aren’t able to access other Client’s PlayerControllers but you can your own. The network compedium is a great resource for things like that - Multiplayer Network Compendium | An Unreal Engine Blog by Cedric Neukirchen
What you may be seeing however is this being null at certain points on the Client such as Begin Play as the Client has to wait to be Possessed and then Replicate that down to the Client. So if your looking to grab the Player Controller at the first point its valid then on the Pawn you want to look at the OnRep_Controller function;
Its also worth adding that Subsystems aren’t replicated at all and the EnhancedInput Subsytem is a Local Player Subsystem and therefore should only really run logic on the Owning Clients not the Server.