Это продолжение другой темы здесь. https://shorturl.at/kyAu3
Я получаю enigineID SMMPv3 от нескольких тысяч устройств, которые могут быть заменены новыми в любое время из-за поломки/исправления. У меня есть входной список устройств. Мне нужно записать этот результат в /etc/snmp/snmptrapd.conf, когда все будет сказано и сделано.
createUser -e 800092C404534E2D353332303435383232 UserName SHA Authphrase AES passphrase
Вот что я делаю
while IFS=, read -r myIP UserIn _
do
UserName=''
case $UserIn in
EverNeXT)
UserName = "DeviceType_1"
;;
UPS)
UserName = "DeviceType_2"
;;
*)
echo "$(date '+%Y-%m-%d %H:%M:%S') Exception! Missing or incorrect information in $DeviceList, look for $myIP or $UserIn" >> $myLog
UserName = "foobar"
esac
Затем я выполняю snmpget для указанных выше полных доменных имен, чтобы получить engineID, который представляет собой шестнадцатеричную строку с пробелом между каждыми двумя значениями. Мне нужно убрать пробелы и записать это в snmptrapd.conf.
if test $snmpget_RC -eq 0
then
set -- $(snmpget -v3 -l authPriv -u $UserName -a SHA -A Authphrase -x AES -X Passphrase $myIP SNMP-FRAMEWORK-MIB::snmpEngineID.0)
shift 3
IFS = ""
echo "Hex value for $myIP is $*"
echo 'createUser -e' "$*" $UserName' SHA Authphrase AES Passphrase ' >>$snmpPath/$MyFile
else
echo "$(date '+%Y-%m-%d %H:%M:%S') $myIP is not reachable" >> $myLog
RC=0
fi
Я получил очень ценную помощь в другой теме, но комментарии не позволяют мне публиковать дополнительную информацию, и я не отвечаю на свой вопрос.
Я получаю один экземпляр engineID, написанный правильно, но остальное — мусор. Вот как выглядит соответствующая часть моего snmptrapd.conf после завершения
createUser -e 800092C404534E2D353332303435383232 UserName SHA Authphrase AES passphrase
createUser -e SNMP-FRAMEWORK-MIB::snmpEngineID.0 = Hex-STRING: 80 00 92 C4 04 53 4E 2D 35 33 32 30 36 30 35 37
39 UserName SHA Authphrase AES Passphrase
Первая строка идеальна, остальное непригодно для использования. Это потому, что я использую IFS дважды? или что-то другое? Что еще более важно, как мне сделать так, чтобы все строки в snmptrapd.conf были такими же, как первая?
С уважением, Том
Ваше изменение на IFS
на первой итерации цикла все равно будет действовать на следующей итерации. Таким образом, это меняет способ разделения вывода snmpget
на слова. Зачем нужен IFS = ""
?
мне кажется, что у вас проблемы с обработкой звонка snmpget
; если это правильно, обновите вопрос, сосредоточив внимание исключительно на вызове snmpget
(например, удалите (ненужный и неполный) блок кода while/case
); вы показали 3 разные строки вывода... обновите вопрос, чтобы показать полный необработанный результат 3 вызовов snmpget
, которые сгенерировали ваши 3 строки вывода; также обновите вопрос (правильными) ожидаемыми createUser
командами для тех же 3 snmpget
вызовов
Пожалуйста, прочитайте раздел Как превратить плохой скрипт в хороший вопрос (этот совет касается всех языков, а не только bash). Удачи!
IFS
в цикле while работает по назначению, передавая правильные myIP
и UserName
команде snmpget
. В другой теме мне сказали, что мне нужны IFS = "
и "$*"
, чтобы избавиться от пробелов. Как уже говорилось, первая строка результата правильна, но остальные неверны (идентификатор двигателя не извлекается и не объединяется, как в первой строке).
Я подчищу сообщение завтра утром, когда снова получу root-доступ к серверу и смогу проверить, что публикую.
Вы не указали этот контекст в своем предыдущем вопросе. Да, цикл по этой последовательности вызывает проблемы, потому что на второй итерации действует настройка IFS = ""
для set -- $(snmpget ...)
, поэтому она не разделяется так, как вы хотите.
Однако в предыдущем вопросе вы также не указали bash. С bash первое решение, которое я дал раньше -- read -d '' x x x hex < <(snmpget ...)
затем ${hex//[:space:]}
-- вероятно, лучше. Или вы можете использовать этот модифицированный подход, который не меняется IFS
:
set -- $(snmpget ...) # unquoted, splits on default IFS including newline
shift 3; hex=$* # rebuilt with spaces (but not newline)
echo createuser -e ${hex// } ... # removes spaces in some shells including bash
Это сделало это!! Shelcheck говорит двойную кавычку $(snmpget.....)
, но это нарушает ее, поэтому я игнорирую Shellcheck в этом случае.
Поставьте
set -x
в начале скрипта, тогда вы увидите расшифровку всех команд с заменой переменных.