Вы можете сделать это несколько прозрачно, заставляя пользователя использовать локальный ProxyCommand локально, рассматривая ваш собственный сервер как хост-бастион SSH.
На вашем сервере (бастионе) ограничьте пользователя nc, как показано в sshd_config:
Match User restricted_usr
ForceCommand nc -w 600 restricted_usr_vm 22
На клиенте (предполагается OpenSSH) в ~/.ssh/config:
Host myserver
ProxyCommand ssh bastion nc -w 600 restricted_usr_vm 22
(пользователи Windows могут [d1 ] bastion host , используя PuTTY plink).
Хотя, благодаря вашему ForceCommand, я уверен, что команда ssh игнорируется; ProxyCommand ssh bastion I am a bannana должен иметь тот же эффект. Прямое соединение (отсутствует ProxyCommand) от пользователя приведет к необработанному дампу SSH для limited_usr_vm.
Как отмечено в комментарии к другому ответу здесь, ForceCommand будет очень сложно управлять SSH ключ доступа к бастионному хосту. Я могу подумать о двух простых решениях: (1) Установите для SSS-ключа без пароля SSH для этого пользователя на бастионе, который предоставляет доступ к целевому хосту, и у него есть crontab этого пользователя на bastion run scp restricted_usr_vm:.ssh/authorized_keys ~/.ssh/ или (2) Создайте веб-форму (например, GitHub), чтобы разрешить загрузку этого файла. (3) NFS также может работать, но я не очень люблю его, потому что каталог .ssh может быть скомпрометирован кем-то с root (или тем же UID) в любой системе, которая его монтирует.
Я отправил комментарий к другому ответу здесь (с более подробной информацией о ProxyCommand) на очень похожий вопрос ServerFault Имя пользователя SSH proxy.
Мне это нравится намного лучше, чем ForceCommand ssh -t restricted_usr_vm, потому что он лучше справляется с тайм-аутами, а ssh -t является довольно неуклюжим (и, возможно, в прошлом, иногда ненадежным). Я также предполагаю, что такие вещи, как scp, не будут работать через этот метод, пока они отлично работают через ProxyCommand.