Как SSH обрабатывать A через B одной командой?

Он будет установлен автоматически при подключении. Если нет, загрузитесь в Windows и попробуйте просмотреть его в Windows и повторите попытку на Ubuntu. (Помните, что вы удаляете устройство в Windows!)

1
задан 22 June 2013 в 20:57

5 ответов

Хоп за один раз

Очевидная альтернатива подходу ProxyCommand, представленная мной в другом ответе, будет «прыгать» непосредственно на целевую машину:

ssh -t user@machineB ssh user@machineA

Обратите внимание на -t в первой команде ssh. Без этого он будет терпеть неудачу:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Это заставит реальный TTY быть выделенным

. Недостатком этого является то, что теперь вся конфигурация, проверка и аутентификация происходит на Machine B , что мне действительно не нравится в моей ситуации по соображениям безопасности. Мне нравится моя ключевая пара на моем собственном компьютере, а также проверять и проверять конечную целевую машину на моем собственном компьютере. Кроме того, вы можете использовать только интерактивную оболочку для SSH, поэтому это не будет иметь дело с другими инструментами, такими как SCP или с вашим файловым менеджером графического интерфейса.

По всем вышеперечисленным причинам я настоятельно рекомендую ответ , но для быстрого подключения это прекрасно работает.

34
ответ дан 24 May 2018 в 20:46

Попробуйте использовать

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

в вашем файле ~ / .ssh / config и сделайте все за один снимок с помощью ключей, которые находятся только на вашем компьютере.

11
ответ дан 24 May 2018 в 20:46
  • 1
    Ужасно отформатирован по умолчанию: – SSH Help 29 July 2014 в 18:50
  • 2
    Это более чисто, чем введение netcat в смесь. Кроме того, частный SSH-ключ не обязательно должен существовать на машине B. – danemacmillan 14 July 2016 в 00:47

Вы можете использовать опцию командной строки -J:

ssh -J user@machineB user@machineA

Из man ssh:

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

Это было введено в OpenSSH версии 7.3 (выпущено в августе 2016). Он доступен в Ubuntu 16.10 и более поздних версиях.

8
ответ дан 24 May 2018 в 20:46
  • 1
    +1, потому что это работает, даже если вам нужно указать файл ключа для machineS – Grief 21 February 2018 в 14:36

ProxyCommand - это чистое решение для случая, когда вы разрешаете доступ к оболочке в обеих системах. Мы хотели предоставить удаленным пользователям доступ к внутренней машине (A) через брокера (B), но без предоставления пользователю доступа оболочки к B для повышения безопасности. Это сработало:

Замените оболочку входа

Замените оболочку входа (используйте chsh) для extuser в брокере со следующим скриптом (хранящимся в файле): [ ! d2]

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

Если в extuser @ B для удаленного пользователя не было введен пароль, а во внутреннем сервере @ A для extuser @ B, то выполнение следующей команды напрямую приведет к удалению пользователя A

ssh extuser@B

Совет. Создайте необязательный пароль для входа в систему authorized_keys в extuser @ B перед тем, как перейти к пользовательской оболочке входа. После изменения, поскольку эта учетная запись недоступна для кого-либо через оболочку, только sudoer @ B может вносить изменения в файл authorized_keys, редактируя его напрямую.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

Последняя строка - это подавление логина баннер с B, поэтому удаленный пользователь имеет прозрачный доступ к A.

1
ответ дан 24 May 2018 в 20:46
  • 1
    Очень интересный подход. Однако основными недостатками этого являются: 1) Использование ограничено стандартным использованием SSH (без поддержки SFTP / SCP). 2) Пользователь не может выбрать другой целевой хост, отличный от одного (потому что он жестко закодирован в оболочке входа) 3) Проверка ключа хоста не может быть выполнена с рабочей станции до конечный целевой хост (с момента использования бинарного SSH-брокера). 4) Частные ключи для доступа пользователей к конечному целевому хосту находятся у брокера, а не у пользователя. Это позволяет олицетворять пользователя администратором (что обычно невозможно). – gertvdijk 5 August 2016 в 16:01
  • 2
    Все верно, спасибо за разработку. Однако основной целью является предоставление надежного доступа пользователя ssh к A без входа в B. Поскольку только администратор может добавить открытый ключ доверенного пользователя на B (через sudo, без входа в систему), это уже подразумевает, что пользователь имеет ( admin) доступ к закрытому ключу extuser @ B (а не к доверенному пользователю за пределами), и он настроил его на первом месте! – Sunthar 29 September 2016 в 23:55

Это очень полезное предложение. После частых разговоров я нашел эту заметку & amp; подтвердил, что это работает точно так же, как документировано. Чтобы подключиться через MachineA к MachineB, из удаленной машиныC:

например: [xuser @ machineC ~] ssh -t MachineA ssh MachineB

«-t» имеет решающее значение, ssh терпит неудачу, если его нет. Вы получите запрос дважды, сначала для пароля на MachineA, затем второй раз для MachineB. Кроме того, обратите внимание, что это предполагает, что пользователь «xuser» определен на всех трех машинах. Если нет, просто используйте синтаксис ssh: «yuser @ MachineA ...». Также обратите внимание, что вы можете использовать dotted quad raw IP # s, если хотите. Это полезно, если вы связываетесь через частную локальную сеть, которая использует IP-адреса, не подверженные действию в мире, т.е. не в вашем локальном файле хоста, ни в любом DNS. Чтобы получить файл с MachineB, на удаленный machineC, вы можете scp от MachineB до MachineA, а затем от MachineA до удаленного machineC. (Например, удаленный machineC может ping MachineA, но не MachineB.) Предостережение: я тестировал с Fedora и WindowsXP, MachineA - это XP-box, на котором работает ICS (общий доступ к подключению к Интернету), а MachineB и удаленный machineC - это коробки Fedora-Linux. Это предложение решило для меня ключевую проблему - т.е. ограниченный, контролируемый удаленный доступ к моему удаленному языку сайта. Также обратите внимание, что когда вы выходите из MachineB, вы должны увидеть два «Соединение с xxx.xxx.xxx.xxx закрыто». сообщения.

0
ответ дан 24 May 2018 в 20:46
  • 1
    Если вы настроили и настроили аутентификацию открытого ключа, вам не нужно беспокоиться о вводе паролей. Но -t все еще требуется. – Felipe Alvarez 19 February 2015 в 16:45
  • 2
    @FelipeAlvarez Вам все равно придется беспокоиться о вводе второго пароля, если вы не доверяете машине B для входа в систему без пароля в A! – Michael 24 April 2017 в 00:59

Другие вопросы по тегам:

Похожие вопросы: