Вопрос или проблема
Я использую интерактивный кошелек spectre-cli
от Spectre, который по своей структуре похож на Kaspa. Когда я хочу вручную получить баланс своего кошелька, мне нужно запустить spectre-cli
, а затем connect
, open
из spectre-cli
. Все это выглядит так:
spectre-cli
Spectre Cli Wallet v0.3.16 (введите 'help' для списка команд)
$ connect
Подключено к узлу Spectre версии 0.3.16 по адресу ws://127.0.0.1:19110
$ open
Введите пароль от кошелька:
Ваш намек для кошелька: Это намек.
$ $
• ****************
• [********]: 4.47042578 SPR 1 UTXOs
spectre:******************************************************
[********] • 4.47042578 SPR $
Я написал скрипт expect, который предназначен для автоматизации этих шагов (чтобы мне нужно было ввести только свой пароль):
#!/usr/bin/expect -f
# Установите тайм-аут (в секундах) для ожидания каждого запроса
set timeout 5
spawn spectre-cli
expect "$ "
send "connect\r"
expect "$ "
send "open\r"
interact
Я получаю непостоянный вывод от скрипта. Примерно в 70% случаев я получаю:
./get_balance_works.exp
spawn spectre-cli
Spectre Cli Wallet v0.3.16 (введите 'help' для списка команд)
$ connect
connectopen
команда не найдена: connectopen
$
в то время как в остальное время скрипт работает, как ожидалось:
./get_balance_works.exp
spawn spectre-cli
Spectre Cli Wallet v0.3.16 (введите 'help' для списка команд)
$ connect
$ open
Подключено к узлу Spectre версии 0.3.16 по адресу ws://127.0.0.1:19110
Введите пароль от кошелька:
Ваш намек для кошелька: Это намек.
$ $
• ****************
• [********]: 4.47042578 SPR 1 UTXOs
spectre:******************************************************
[********] • 4.47042578 SPR $
Есть ли способ сделать так, чтобы скрипт работал должным образом и с постоянным успехом?
P.S. Я использую Ubuntu LTS.
Ответ или решение
Для решения проблемы с нестабильной работой вашего expect-скрипта, который автоматизирует процесс проверки баланса в кошельке Spectre, следует рассмотреть несколько ключевых аспектов, включая синхронизацию ожиданий в скрипте и обработку различных временных задержек при запуске команды.
1. Изучите вывод команд
Судя по вашему описанию, вывод команд может варьироваться, что приводит к ошибкам в скрипте. Важно точно указать, какие именно строки или символы вы ожидаете от программы после каждой команды. Убедитесь, что команды connect
и open
завершаются именно в том формате, который вы проверяете.
2. Увеличьте время ожидания
Поскольку время ответа от CLI может варьироваться, увеличьте значение параметра timeout
. Это даст системе больше времени для обработки команд, особенно если она занимает больше времени:
set timeout 10
3. Обработайте ввод пароля
Ваш скрипт не отправляет пароль для открытия кошелька. Для улучшения работы убедитесь, что вы добавили обработку ввода пароля. Вставьте соответствующий блок после команды open
:
expect "Enter wallet password:"
send "ваш_пароль\r"
4. Корректируйте регулярные выражения в expect
Убедитесь, что используете правильные regexp для ожидания вывода. Вы можете использовать точные строки и добавлять символы подстановки, если это необходимо:
expect {
"$ " {
send "connect\r"
exp_continue
}
"command not found" {
puts "Команда не найдена. Проверьте правильность ввода."
exit
}
}
5. Убедитесь в отсутствии конфликтов с другими программами
Убедитесь, что в вашей системе нет других процессов или программ, которые могут конфликтовать с запуском spectre-cli
. Это может привести к задержкам или ошибкам, с которыми сталкивается ваш скрипт.
6. Окончательный скрипт
На основе вышеперечисленных рекомендаций ваш скорректированный script может выглядеть следующим образом:
#!/usr/bin/expect -f
# Установка времени ожидания
set timeout 10
# Запуск spectre-cli
spawn spectre-cli
# Ожидание появления приглашения
expect {
"$ " {
send "connect\r"
exp_continue
}
}
# Ожидание подключения и появления следующего приглашения
expect {
"Connected to" {
expect "$ "
send "open\r"
}
}
# Ожидание ввода пароля
expect "Enter wallet password:"
send "ваш_пароль\r"
# Ожидание завершения операции
interact
Заключение
Следуя этим рекомендациям, вы должны добиться более стабильной работы вашего expect-скрипта. Тщательная обработка ожиданий и задержек, а также корректное управление вводом пароля помогут избежать большинства проблем, с которыми вы сталкиваетесь в данный момент. Если у вас всё ещё остаются вопросы или возникают проблемы, рассмотрите возможность использования логирования для диагностики: записывайте вывод консоли в файл, чтобы увидеть, что происходит при сбоях.