Как я могу SSH к машине A через B в одной команде?

Эта проблема не имеет никакого отношения к выравниванию раздела (хотя могут быть проблемы выравнивания, также). В основном проблема состоит в том, что два основных раздела (/dev/sda2 и /dev/sda3) находятся в расширенном разделе (/dev/sda4). Это недопустимо. Эта проблема может быть решена моим программа FixParts , которая является частью пакета Ubuntu gdisk; но надлежащая идентификация того, что делает каждый из тех разделов, необходима перед продолжением. В частности, разделы начальной загрузки не должны становиться логическими разделами.

103
задан 24.03.2020, 22:31

7 ответов

Да, используя ProxyCommand в вашей конфигурации SSH.

Создайте файл конфигурации SSH в своем домашнем каталоге (если вы не хотите делать это для всей системы), ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

Теперь вы можете напрямую связаться с машиной A, используя

[111 ]

Также обратите внимание, что теперь у вас есть одно целевое имя хоста SSH для него, вы можете использовать его и в других приложениях. Например :

  • SCP для копирования файлов.

    scp somefile user@internalmachine:~/
    
  • В приложениях с графическим интерфейсом:

    используйте sftp://user@internalmachine/ в качестве местоположения для просмотра на машине.

    На основе KDE (Dolphin): используйте fish://user@internalmachine/

Примечания

Измените hostname.or.IP.address.internal.machine и порт (22) на понравившуюся машину чтобы достичь, как если бы вы из машины unibroker.

В зависимости от версии netcat на хосте unibroker, опция -q0 должна быть опущена. Что касается аутентификации; вы в основном настраиваете два SSH-соединения со своей рабочей станции. Это означает, что как хост unibroker, так и хост internalmachine проверяются / аутентифицируются один за другим (как для пар ключей / паролей, так и для проверки ключей хостов).

Объяснение

Этот подход использования ProxyCommand и 'netcat' является лишь одним из способов сделать это. Мне это нравится, потому что мой SSH-клиент общается напрямую с целевым компьютером, чтобы я мог проверить ключ хоста с моего клиента и использовать аутентификацию с открытым ключом, не используя другой ключ в брокере.

Каждый Host определяет начало новой секции хоста. Hostname является целевым именем хоста или IP-адресом этого хоста. User - это то, что вы предоставили бы как пользовательскую часть в ssh user@hostname.

ProxyCommand будет использоваться в качестве канала к целевой машине. Используя SSH для первой машины и напрямую настраивая простую 'netcat' (nc) от цели к получателю, это в основном просто открытый текст на внутреннюю машину от посредника между ними. Опции -q предназначены для отключения любого вывода (только личное предпочтение).

Убедитесь, что на брокере установлен netcat (обычно он доступен по умолчанию в Ubuntu) - либо netcat-openbsd Install netcat-openbsd , либо netcat-Traditional Install netcat-traditional .

Обратите внимание, что вы все еще используете SSH с шифрованием дважды здесь. Пока канал netcat является открытым текстом, ваш SSH-клиент на вашем ПК настроит другой зашифрованный канал с конечным целевым компьютером.

97
ответ дан 24.03.2020, 22:35

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

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

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

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

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

[111 ]

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

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

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

1
ответ дан 24.03.2020, 22:31

Прыжок за один раз

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

ssh -t user@machineB ssh user@machineA
[ 118] Обратите внимание на -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

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

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

51
ответ дан 24.03.2020, 22:32
  • 1
    В других руководствах говорится для использования, кроме того, переключателя-A, но указать, что это имеет последствия безопасности. Вы знаете то, что это означает передавать, или нет, соединение агента аутентификации? – mrbinky3000 24.03.2020, 22:32
  • 2
    @demure That' s, как работают сайты StackExchange... См.: , Каков официальный этикет при ответе на вопрос дважды? говорит " It' s лучше для регистрации двух различных ответов, чем поместить их в один ответ " . И я don' t полагают, что это то же решение. Постоянный/временно не то, что делает этот подход по-другому, по-моему. – Rodrigo Manguinho 24.03.2020, 22:33
  • 3
    @gertvdijk супер ниндзя здесь! у Вас есть лучшие ДВА решения. i' ve, никогда замечаемый это прежде. очень прикольный. путь лучше, чем создание одного мега долгого решения с решениями N (который является тем, что я обычно вижу). – vulgarbulgar 24.03.2020, 22:33
  • 4
    Почему бы не один ответ с обоими ' Один Off' и Постоянные решения? – shingokko 24.03.2020, 22:33
  • 5
    Это намного более удобно, чем установка конфигурации, которая будет препятствовать другому ssh' s также. – jgivoni 24.03.2020, 22:34

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

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 и сделайте все это за один раз, используя только ключи на вашем компьютере.

17
ответ дан 24.03.2020, 22:33
  • 1
    Это более чисто, чем введение netcat в соединение. Кроме того, частный ключ SSH не должен существовать на B машина, также. – Billy 24.03.2020, 22:33

Вы имеете в виду, что вам нужно несколько перемычек:)

Недавно я столкнулся с этой проблемой с перемычкой jumper1 и моей конечной машиной, как для моего локального скрипта sol

:

#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh

Затем на 1-й перемычке (которая является моим маршрутизатором) я поместил скрипт с именем Y00.sh:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final

Вы можете заменить их своими IP-адресами и паролями, удачи!

1
ответ дан 24.03.2020, 22:34

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

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

«-t» имеет решающее значение, ssh завершается ошибкой, если он нет Вам будет предложено дважды, сначала для пароля на MachineA, затем второй раз для MachineB. Также обратите внимание, что это предполагает, что у вас есть пользователь "xuser", определенный на всех трех машинах. Если нет, просто используйте синтаксис ssh: "yuser @ MachineA ...". Также обратите внимание, что при желании вы можете использовать точечные четырехточечные IP-адреса. Это полезно, если вы соединяетесь через частную локальную сеть, которая использует IP-адреса, не представленные миру. не в вашем локальном файле хоста или в любом DNS. Чтобы получить файл с MachineB на удаленный machineC, вы можете перейти с MachineB на MachineA, а затем с MachineA на удаленный machineC. (Например, удаленный компьютер C может пропинговать MachineA, но не MachineB.) Предостережение: Я тестировал с Fedora и WindowsXP, MachineA - это XP-блок с ICS (Internet Connection Sharing), а MachineB и удаленный machineC - это блоки Fedora-Linux. Это предложение решило ключевую проблему для меня - т.е. ограниченный, контролируемый удаленный доступ к моей локальной сети. Также обратите внимание, что когда вы «выходите из системы» из MachineB, вы должны видеть два «Соединение с xxx.xxx.xxx.xxx закрыто». сообщений.

1
ответ дан 24.03.2020, 22:34
  • 1
    @FelipeAlvarez все еще необходимо волноваться о вводе второго пароля если Вы don' t доверительная машина B для имения passwordless входят в систему к A! – dylanfm 24.03.2020, 22:34
  • 2
    Если Вы настраиваете и настраиваете аутентификацию с открытым ключом, то Вы don' t должен волноваться о вводе в Ваши пароли. Но -t все еще требуется. – Pat Hermens 24.03.2020, 22:35

Вы можете использовать опцию командной строки -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 и более поздних версиях.

36
ответ дан 24.03.2020, 22:35
  • 1
    +1, потому что это работает, даже если необходимо определить файл ключей для machineA – Filip 24.03.2020, 22:35
  • 2
    +1, это - лучшая версия по сравнению с моим ответом ProxyCommand, если все Ваши хосты выполняют версию OpenSSH, достаточно недавнюю. – Rodrigo Manguinho 24.03.2020, 22:35
  • 3
    Сервер OpenSSH должен быть установлен и на A и на машинах B в этом случае? Действительно ли я прав понятый? – Rodrigo Manguinho 24.03.2020, 22:36

Теги

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