Я пишу скрипт для сопоставления локальных значений с удаленными. На данный момент мой код работает и выглядит так:
#!bin/bash
MY_ARRAY=('value1' 'value2' 'value3' 'wrongValue)
for VALUE in "${MY_ARRAY[@]}"
do
if [[ $VALUE =~ ^v ]] ; then
echo "$VALUE : $(ssh admin@machine matching_function $VALUE)" >> output.file
else
echo "$VALUE : this is a wrong value" >> output.file
fi
done
Единственная проблема заключается в том, что для каждой итерации цикла создается и закрывается новое соединение ssh. Поскольку мой исходный набор данных довольно большой, его выполнение занимает много времени.
Я искал способ оптимизировать это и прочитал о передаче многострочных команд в ssh с помощью ssh admin@machine <<EOF
и адаптировал свой код:
MY_ARRAY=('value1' 'value2' 'value3' 'wrongValue)
ssh admin@machine << EOF
for VALUE in "${MY_ARRAY[@]}"
do
if [[ $VALUE =~ ^v ]] ; then
echo "$VALUE : $(matching_function $VALUE)" >> output.file
else
echo "$VALUE : this is a wrong value" >> output.file
fi
done
EOF
Однако это не работает, и я получаю несколько ошибок:
Pseudo-terminal will not be allocated because stdin is not a terminal.
. Я подозреваю, что это отчасти связано с тем, что моя удаленная оболочка ограничена и конфликтует с файломecho
.$MY_ARRAY кажется неразмещенным на удаленной машине:
-rbash: line 5: conditional binary operator expected -rbash: line 5: syntax error near unexpected token '^v' -rbash: line 5: ' if [[ =~ ^v ]] ; then'
Я также не уверен, как bash будет различать $VALUE
, который следует интерпретировать с моего локального компьютера, и matching_function
, который следует интерпретировать с удаленного компьютера.
<< HEREDOCS
является стандартным, в то время как попытка выполнить этот код в локальном пространстве не предпринимается, поэтому вашmacthing_function
должен выполняться удаленно. - person shellter   schedule 02.05.2014ssh [email protected] '/bin/ls -l $VAL'
иssh [email protected] "/bin/ls -ls $VAL"
. Затем добавьте в смесьmatch_func
. Все, что работает внутри"..."
, будет работать и в<<HEREDOC
, если только вы не вызовете жесткие кавычки, такие как<<'HEREDOC'
, что дает вам то же поведение, что и..com '/bin/ls -l $VAL'
. Удачи. - person shellter   schedule 02.05.2014ssh x@y "VAL=\$(match_func arg1)
. Я не могу приписать результат локальной переменной, скорее он создает удаленную переменную и выделяет ей результат функции (я пробовал другие синтаксисы, чтобы попытаться получить этот результат, но безрезультатно) - person Aserre   schedule 02.05.2014ssh x@y "VAL=\$(match_func arg1); echo \${VAL}"
И, что более важно, и снова возвращаясь к идее маленьких шагов, что происходит, когда вы делаетеssh x@y "match_func StringArg"
? Удачи! - person shellter   schedule 02.05.2014<<HEREDOC
(поскольку сообщение об ошибке показывает, что $VALUE пусто). Опять же, с небольшими тестовыми примерами И с вашей локальной отладкой оболочки, включенной с помощьюset -vx
, И включенной удаленной отладкой с помощьюset -vx;
перед любыми командами, отправленными через ssh, вы сможете увидеть, где это терпит неудачу. Это выглядит очень близко, как есть. - person shellter   schedule 02.05.2014