Создайте скрипт bash для подключения к шести удаленным серверам

#bash #expect

Вопрос:

этот скрипт позволяет мне подключиться к удаленному серверу. Я хочу преобразовать его для подключения к шести удаленным серверам, чтобы иметь возможность загружать данные с этих серверов. Кто-нибудь может дать мне направление.

  #!/usr/bin/expect
        set username "username"
        set password "password"
        set hosts "hostname"
        spawn ssh  $username@$hosts
        expect "$username@$hosts's password:"
        send -- "$passwordn"
        expect "$password"
        sleep 20
    
    send -- "exitn"
 

Комментарии:

1. Вы хотите, чтобы он был параллельным или соединялся 1 после другого, все в порядке? Если серийный номер в порядке, вы можете создать массив с шестью IP-адресами, а затем просмотреть их во время выполнения кода, который у вас уже есть

2. Привет @abhishek phukan, я хочу, чтобы это было параллельно

3. Почему вы используете expect?

4. Привет @KamilCuk, ожидание позволяет мне автоматически отвечать на вопросы, когда мне нужно ввести пароль или какие-либо другие вещи.

5. Для параллельного выполнения вы можете использовать gnu.org/software/parallel . Это должно помочь

Ответ №1:

  1. Привет, пока не могу прокомментировать, поэтому я отвечу здесь.
  2. Во-первых, если подключение требуется по умолчанию (каждый раз, когда ваша машина включена), рекомендуется использовать службу автоматической синхронизации.
    • вы можете найти пример и руководство по сервису autossh здесь Пример autosshExample
    • после написания этой службы вы можете запустить ее с параметром systemctl ServiceName.service.
    • служба позволит машине автоматически запускать службу при ее включении.
  3. Другой способ решения этой проблемы ( примитивный, но работающий) — это:
    • создайте сценарий, который запускает другие сценарии.
    • создайте сценарий для каждого сервера, а затем сценарий для запуска всех сценариев: (используйте путь к сценарию, чтобы выполнить их один за другим).
 #/bin/bash!
    /usr/local/sbin/./scriptOne
    sleep 10
    /usr/local/sbin/./scriptTwo
    sleep 10
    /usr/local/sbin/./scriptThree
 
  1. Для параллельного запуска ssh вы можете использовать эти параметры:
    • запустите сценарии из основного сценария с помощью amp;
    • например /usr/local/sbin/scriptOne amp;amp; /usr/local/sbin/scriptTwo
    • поскольку это служба ssh, вам следует использовать флаг, чтобы не открывать новый терминал, и запускать процесс в фоновом режиме, чтобы избежать ошибок.
    • используйте флаги-f-n в сценариях вашего ssh, чтобы избежать открытия новых окон терминала.
    • это должно позволить вам запускать несколько процессов ssh из одних и тех же окон терминала, отправляя каждую команду и процесс для запуска в фоновом режиме.
    • также обратите внимание, что использование ssh-ключей вместо пароля обеспечивает большую безопасность.

Комментарии:

1. Привет @CrazyTux, по умолчанию подключение не требуется. Я хочу его выполнить, я хочу, чтобы он был параллельным .

2. я отредактировал свой ответ, вы можете запустить несколько ssh из одного сценария параллельно. Если что-то не понятно, я здесь, чтобы помочь

3. отправив команду в фоновом режиме , вы не сможете правильно отследить ее позже

4. @abhishekphukan ну , вы можете найти команду с pgrep -a ssh помощью, тогда вы получите полную команду и PID, если единственное, чего хочет Джастин, — это иметь доступ к серверам, которые должны работать, но это правда, что есть больше способов справиться с этой проблемой.

5. @JustinCoulibaly я все еще рекомендую создать службу ssh или autossh, тогда вы могли бы запустить соединение с помощью команды systemctl start/stop serviceName.service .Это самый чистый и лучший способ, о котором я могу подумать, чтобы решить эту проблему.