Проблемы с разрывом соединения после запуска сценариев на удаленном компьютере с использованием сценария оболочки - PullRequest
2 голосов
/ 02 февраля 2011

Это первый раз, когда я пишу скрипт оболочки. Я старался провести как можно больше исследований, чтобы избежать глупых / повторяющихся вопросов. Прошу прощения, если его повторить / тупой вопрос.

У меня есть сценарий оболочки, который подключается к удаленной машине Linux и запускает сценарии там. Я использую функцию «ожидается», чтобы создать ssh-соединение и выполнить команды для запуска задания. Однако у меня возникают проблемы при закрытии соединения после завершения задания.

Это мой сценарий:

set prompt "(%|#|\\$|%\]) $"


    expect -c 'spawn ssh $UN@$STAGE ;
                    expect password ; send "$PASS \n";
                    expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n";
                    interact'

Этот сценарий успешно запускает файл сценария для меня (параметры $ UN и $ STAGE вводятся в сценарий. Я здесь опущен для простоты). Тем не менее, это оставляет меня с открытой связью. Я попытался закрыть соединение после запуска сценария, используя следующую команду вместо указанной выше

expect -c 'spawn ssh   $UN@$STAGE ;
                expect password ; send "$PASS \n";
                expect -regexp "$PROMPT"; send "./settings.$UN.sh > settings_log.txt \n";
                expect -regexp "$PROMPT"; send "exit \n"'

Это закрывает соединение, но я заметил, что мой файл скрипта вообще не запускался. Также файл settings_log.txt вообще не создается.

Значит ли это, что команда выхода прерывает процесс до его завершения? Я пытался использовать «сон» перед выходом, но это не помогло. Есть ли лучший способ разорвать соединение при использовании ожидаемого? Любая помощь приветствуется.

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

с ожиданием, вы прекращаете отправлять команды с \r не \n, поэтому

 expect -c 'spawn ssh   $UN@$STAGE
            expect password
            send "$PASS\r"
            expect -regexp "$PROMPT"
            send "./settings.$UN.sh > settings_log.txt\r"
            expect -regexp "$PROMPT"
            send "exit\r"
            expect eof'
1 голос
/ 02 февраля 2011

Обратите внимание, что вы можете выполнять команды удаленной оболочки и копировать файлы, используя ssh и scp , напрямую, без использования Ожидайте .

Например,

scp ./settings.$UN.sh $UN@$STAGE:settings_log.txt
ssh $UN@$STAGE whatever-you-need-to-execute

Соединение закроется, как только все, что вам нужно для выполнения завершится.

0 голосов
/ 02 февраля 2011

Ваш внешний скрипт написан на csh и устанавливает переменную с именем «prompt», но ваш expect скрипт использует переменную с именем «PROMPT». Попробуйте сделать так, чтобы имена двух переменных совпадали с регистром.

...