Автоматизация входа в SSH - PullRequest
1 голос
/ 21 июля 2010

Я хотел автоматизировать ssh логины. После некоторого исследования казалось, что tcl / Ожидает, что маршрут был.

Тем не менее, моя проблема в том, что, когда Interactive захватывает мой терминал, все работает не так, как ожидалось (игра слов не предназначена).

Например, если я изменяю размер терминала, он не "берет". Кроме того, иногда взаимодействие не реагирует, а иногда просто зависает без причины. Я включил свой код ниже. Мой вопрос по коду: я что-то упустил?

Кроме того, есть ли лучший способ сделать это (с другим языком сценариев?) Мне нужно, чтобы терминал был очень отзывчивым, и ничем не отличается от того, если бы я набрал ssh вручную на консоли.

proc Login {username server password} {
    set prompt "(%|>|\#|\\\$) $"

    spawn /usr/bin/ssh $username@$server
    expect { 
        -re "Are you sure you want to continue connecting (yes/no)?" {
            exp_send "yes\r"
            exp_continue 
            #continue to match statements within this expect {}
        }

        -nocase "password: " { 
            exp_send "$password\r" 
            interact
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 28 августа 2010

Проблема, которую вы подняли о «взаимодействии», когда вы не заметили, что размер окна изменился, заключается в том, что по умолчанию взаимодействует только просмотр потоков символов.Когда вы изменяете размер окна, появляется сигнал WINCH.По умолчанию Expect имеет действие по умолчанию, которое заключается в его игнорировании.Вы должны использовать команду Expect trap, чтобы поймать SIGWINCH.Затем вы можете делать то, что вы хотите - например, распространять новый размер на другую сторону или предпринимать какие-то другие локальные действия.

Примеры вы можете найти в примерах сценариев Expect, которые делают это.И в книге Expect есть объяснение и пример того, как обращаться с SIGWINCH.

0 голосов
/ 22 июля 2010

Как упоминает W. Craig Trader в комментарии, «правильный» способ сделать это - использовать ssh-keygen для генерации ключа для аутентификации.

Вы можете избежать запроса «продолжить», установив -o StrictHostKeyChecking=no.

...