Nano Hash - криптовалюты, майнинг, программирование

Ожидайте, что команды на SSH перестанут синхронизироваться

Я создал скрипт, в котором мне нужно запустить несколько команд на удаленном терминале, используя SSH. Итак, я использовал операторы ожидания, но проблема в том, что, предположим, мне нужно запустить 5 операторов на удаленном терминале, а затем из 6 раз, примерно 3-4 раза, эти 5 команд выходят из синхронизации, т.е. команда не выполняется в правильной последовательности и не должным образом, то есть сначала должна завершиться 1-я команда, а затем должна запуститься вторая. Я пытался установить тайм-аут 5 или даже 10, но это не помогло. Я даже пробовал спать 2 или 4, но это тоже не помогло. Вот сценарий, который я создал вместе с выводом. Помогите мне, пожалуйста. Спасибо.

Скрипт:

do some work on current shell
#echo $name 
## ssh part of script starts

/usr/bin/expect<<EXEOF

set timeout -1
match_max 100000
spawn ssh "myuser\@IP_ADDRESS"
expect "*assword:*"
send -- "mypassword\r"
send -- "\r"
#expect -re "(%|*>|#|\\$)"
expect "*>"
#expect "*OFR:offline-ure>"   #actual prompt of ssh terminal
send -- "\r"
set timeout 20
#sleep 1
send -- "tcsh\r"
send -- "\r"
set timeout 2
expect -re "(%|>|#|\\$)"
#set timeout 10
send -- "cd /home/myuser/cap/\r"
send -- "\r"
set timeout 4
expect -re "(%|>|#|\\$)"
send -- "source cap.env\r"
send -- "\r"
set timeout 10
send -- "cd /home/myuser/bin/\r"
set timeout 5
expect -re "(%|>|#|\\$)"
send -- "$myCommand\r"
#set timeout 50
#sleep 40
send -- "exit\r"
expect -re "(%|>|#|\\$)"
send -- "exit\r"
expect eof

EXEOF
echo "end of ssh script"
some task after ssh part of script

Когда я запускаю его, я вижу результат ниже:

spawn ssh myuser@IP_ADDRESS
[email protected]'s password:
Last login: Tue Mar 10 07:56:19 2015 from XX.XX.XX.XX

OFR:offline-ure> tcsh   (see here all commands are sent together)

source ccap.env

cd /home/myuser/bin/
mycommand_String_value
exit
exit
[sncpuser@offline-ure ~]$
[sncpuser@offline-ure ~]$ source ccap.env
ccap.env: No such file or directory.
[sncpuser@offline-ure ~]$
[sncpuser@offline-ure ~]$ cd /home/myuser/bin/
[sncpuser@offline-ure bin]$ mycommand_string_value
some output of my command
[sncpuser@offline-ure bin]$ exit
exit
OFR:offline-ure>
OFR:offline-ure> cd /home/myuser/cap/     (this was second command)
OFR:offline-ure> exit
Connection to xx.xx.xx.xxx closed.
end of ssh script

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

10.03.2015

  • добавьте exp_internal 1 в начало вашего ожидаемого скрипта, и ожидание сообщит вам, когда ваши ожидаемые шаблоны не совпадают (или совпадают неожиданно) 10.03.2015

Ответы:


1

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

Почему бы и нет:

ssh foo ". /home/myusr/cap/env ; /home/myusr/cap/bin/cmd"

И просто использовать expect, чтобы сделать бит имени пользователя/пароля?

Или лучше использовать аутентификацию с открытым ключом и вообще не использовать имя пользователя/пароль, а полностью отказаться от expect?

Вы спрашивали в комментариях, как передать несколько команд ssh. Попробуй это:

amb@nimrod-ubuntu:~/so$ ssh 192.200.0.1 'pwd ; ls | wc -l ; cd .. ; pwd ; ls | wc -l'
[email protected]'s password:
/home/amb
132
/home
2

ssh по умолчанию будет использовать вашу оболочку входа. Если вам действительно нужно использовать tcsh и это не ваша оболочка входа в систему, вот один из способов сделать это:

ssh 192.200.0.1 '/bin/sh -c "pwd ; ls | wc -l ; cd .. ; pwd ; ls | wc -l"'

Альтернативой может быть размещение файла сценария в удаленной системе, например. в /home/myuser/cap/bin/dostuff пишем:

#!/bin/tcsh
cd /home/myuser/cap/
source cap.env
cd /home/myuser/bin/
# next line will run the file given as the first parameter
$1
exit

Затем вызовите его как:

ssh 192.200.0.1 /home/myuser/cap/bin/dostuff /path/to/file/to/run

Я подозреваю, что реальная проблема связана с выделением псевдотерминалов. Вы можете поиграть с опциями -t и -T до ssh.

10.03.2015
  • Спасибо ablig за такой быстрый ответ. Я немного новичок в этих вещах, но мне нужно использовать имя пользователя/пароль. Как это использовать: ssh foo . /home/myusr/cap/env ; /home/myusr/cap/bin/cmd означает, что после того, как я выполнил SSH, мне нужно последовательно выполнить около 5 команд. Итак, как можно использовать код, который вы предложили. Можете ли вы помочь немного больше здесь. Я не знаю, как использовать ожидание только для имени пользователя/пароля, а затем запускать команду в обычном режиме или на удаленном терминале.... 10.03.2015
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..