3

Я пытаюсь написать скрипт, который отправляет веб-сайт на мой сервер, где файлы веб-сайта находятся на моем локальном компьютере для тестирования.

Теперь он работает, используя rsync для обновления сервера, затем ssh чтобы заставить сервер запустить скрипт, который выполняет несколько действий (а именно: перезапустите apache - веб-сайт использует WSGI).

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

Есть ли способ сделать так, чтобы мне приходилось вводить пароль только один раз? Я не хочу, чтобы мне вообще приходилось вводить свой пароль, поэтому я хотел бы иметь какой-то способ сделать это без использования ssh-key .

3 ответа3

6

Найдите параметры -M и -S в ssh(1) . Идея состоит в том, чтобы открыть главное соединение с сервером, а затем сделать несколько обращений в качестве подчиненных соединений через открытый сокет. Также см. ControlMaster и ControlPath в руководстве по ssh_config(5) .

1

У нас похожая сложная установка в нашем университете. Пользователи обязаны использовать пароль для входа.

В конце концов я узнал об expect которое может автоматизировать это.

В моем случае я сделал свою программу немного нечитаемой, чтобы пароль не был очевидным.

В любом случае - первый хорошо читаемый пример, который я нашел здесь:

#!/usr/local/bin/expect
spawn  sftp  -b cmdFile user@yourserver.com
expect "password:"
send "shhh!\n"; 

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

Также команда в моем случае это была

spawn  ssh user@myserver.com

Замените строку в expect того, что показано в ВАШЕМ случае, а также на входные ответы, которые потребуются там.

Например, если вам нужно дважды ввести пароль, добавьте еще один

expect "password:"
send "my_super_secret_password\n"; 

Не забудьте добавить команды для размещения вашего сайта в скрипте;) Это будет выглядеть так:

expect "prompt:"
send "update my website\n"
0

Есть похожие вопросы с другим описательным ответом, который вы можете найти ЗДЕСЬ.

На всякий случай, если это полезно, я сделал этот общий сценарий с двумя различными процессами rsync следуя совету Кусалананды:

#!/usr/bin/env bash

REMOTEUSER=username
REMOTEHOST=hostname

mkdir -P ~/.ssh/ctl
ssh -nNf -o ControlMaster=yes -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir01/ $REMOTEUSER@$REMOTEHOST:/remotedir01/

rsync -axuv -e "ssh -o 'ControlPath=$HOME/.ssh/ctl/%L-%r@%h:%p'" --progress --delete-after /localdir02/ $REMOTEUSER@$REMOTEHOST:/remotedir02/

ssh -O exit -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" $REMOTEUSER@$REMOTEHOST

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .