Хобрук: Ваш путь к мастерству в программировании

Ожидаемый сценарий — автоматический пароль

Я пытаюсь создать скрипт, который автоматически вводит пароль «root» для копирования ssh-ключа из A в B. Поскольку ssh-copy не работает на B, а также не может быть установлен, я использовал:

ssh root@$ip mkdir -p .ssh
cat "~/.ssh/id_rsa.pub" | ssh "root@$ip" 'cat >> .ssh/authorized_keys'

Для передачи ключа. Но B удаляет свое хранилище при перезагрузке. Поэтому я должен автоматизировать этот процесс. Я думал, что сценарий ожидания будет самым простым решением? Однако я не очень опытен в этом.

#!/usr/bin/expect
#31.09.2015

set timeout 30

spawn ssh "root@$ip mkdir -p .ssh"
expect "password:"
send "root\r"
expect "(yes/no)? "
send "yes\r"

spawn cat "~/.ssh/id_rsa.pub" | ssh "root@$ip" 'cat >> .ssh/authorized_keys'
expect "password:"
send "root\r"

interact

Вроде работает до первой отправки. Однако потом застревает и ждет входа? (неправильно ожидать?)


  • Но B удаляет свое хранилище при перезагрузке, это ожидаемое поведение? 03.09.2015
  • Другим вариантом может быть использование ключей ssh ​​вместо записи пароля в скрипт. 14.03.2020

Ответы:


1

Это та часть, с которой у вас возникли проблемы:

spawn ssh "root@$ip mkdir -p .ssh"
expect "password:"
send "root\r"
expect "(yes/no)? "
send "yes\r"

После отправки пароля вы ждете 30 секунд, пока не появится (yes/no?, но он может не появиться, если вы ранее подключались к этому компьютеру. Вы хотите условно ожидать приглашение y/n:

spawn ssh "root@$ip mkdir -p .ssh"
expect {
    "(yes/no)? " { send "yes\r"; exp_continue }
    "password:"  { send "root\r" }
}
expect eof

Эта форма команды expect позволяет вам искать несколько строк одновременно. Если первым увиденным является «(да/нет)?», затем отправьте «да» и продолжите эту команду ожидания. Когда вы увидите «пароль:», отправьте пароль и дайте ожидаемой команде завершиться.

Возможно, вы захотите изменить вторую команду spawn, чтобы оболочка могла обрабатывать конвейер.

set cmd [format {cat "~/.ssh/id_rsa.pub" | ssh "root@%s" 'cat >> .ssh/authorized_keys'} $ip]
spawn sh -c $cmd
03.09.2015

2

spawn не обрабатывать перенаправление ввода так, как вы этого хотите. Самое простое решение — создать отдельный сценарий оболочки, который будет выполнять копирование, и позволить expect обрабатывать только запрос пароля.

Это то, что работает для меня:

cat copykey.sh:

#!/bin/bash
ssh user@host "cat >> .ssh/authorized_keys" < ~/.ssh/id_rsa.pub

cat copykey.expect:

#!/usr/bin/expect -f
set timeout 30

spawn ssh user@host mkdir -p .ssh
expect "password:"
send "password\n"
expect "$ "

spawn ~/copykey.sh 
expect "password:"
send "password\n"
expect "$ "
03.09.2015
  • использовал ваш скрипт -›идентификатор спавна exp6 не открыт 03.09.2015
  • убедитесь, что ~/.ssh не существует на удаленной стороне. 03.09.2015
  • @TheCheatsrichter: это решило твою проблему? Если нет, то какое исправление, если вы его нашли? 09.10.2015

  • 3

    Необходимо указать ip, имя пользователя, пароль в качестве аргумента командной строки (Remotelogin.exp)

        #!/usr/bin/expect
        set ip [lindex $argv 0]
        set user [lindex $argv 1]
        set password [lindex $argv 2]
        spawn ssh $user@$ip
        expect {
        "(yes/no)?" {
    
                      send "yes\r"
    
                      expect "password:"
    
                      send "$password\r"
    
                    }
    
        "password:" {
                       send "$password\r"
                    }
               }
    

    `

    Пример: ./Remotelogin.exp

    03.10.2016
    Новые материалы

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..

    Обзор 20 основных и современных методов работы с массивами в JavaScript
    Вы знаете их всех? В этом коротком посте я покажу сводку методов, доступных в JavaScript для работы с массивами. Я надеюсь, что вы найдете это полезным! В конце поста вы найдете ссылку на..

    Да, но я чувствую необходимость указать, что это или не единственные два.
    Да, но я чувствую необходимость указать, что это или не единственные два. Обучение с подкреплением (в качестве примера) также является важным.