Статус завершения связанных команд

Вот как сбросить пароль root в CentOS 7 и RHEL 7:

  1. Включите систему и на экране загрузки GRUB 2 нажмите E , чтобы отредактировать текущую запись.
  2. Отредактируйте строку с linux16, удалив параметры rhgbи quietи добавив в конце rd.break.
  3. Нажмите CTRL + X ; система загрузится с приглашением initramfs switch_root.
  4. Перемонтировать файловую систему как доступную для записи:mount -o remount,rw /sysroot
  5. Изменить корень файловой системы:chroot /sysroot
  6. Изменить пароль root:passwd root
  7. Заставить SELinux переименовывать контекст при следующей загрузке:touch /.autorelabel
  8. Перемонтировать файловую систему только для чтения:mount -o remount,ro /sysroot
  9. Выйти из среды chroot:exit
  10. Возобновить загрузку системы:exit

Источник:руководство , которое я написал некоторое время назад.

1
16.05.2019, 18:19
1 ответ

Если у вас есть полный синтаксис оболочки, вы можете использовать if, который не отображается как сбой оболочки:

if (eval "$cmd"); then
    : # do nothing, it worked
else
    printf 'Command %s failed with code %d\n' "$cmd" $?
fi

Обратите внимание, что вы не можете использовать более очевидный синтаксис if ! eval…, так как отрицание скроет код выхода. Бит «ничего не делать» присутствует, потому что синтаксис оболочки требует блока then с командой в нем; вы не можете опустить его или оставить пустым.

Важно то, что ifне является ошибкой оболочки, даже если оцениваемая команда не удалась.

Скобки означают запуск команды в оболочке sub -; это не позволяет команде, например, устанавливать переменные, влияющие на ваш скрипт, или делать что-то вроде exit 1, чтобы полностью убить ваш скрипт.

Наконец, обратите внимание, что я использовал evalвместо $cmdбез кавычек. Это потому, что команда без кавычек разделяет слова так, как вы, вероятно, не ожидаете. Если у вас было cmd='rm -Rf "foo * baz"', то когда вы запускаете $cmd, вы на самом деле запускаете rm -Rf \"foo * baz\", который будет расширять *на все файлы в каталоге, удаляя все (в дополнение к двум файлам "fooи baz"). Это три аргумента для rmперед расширением глобуса, а не тот, который вы ожидали. evalприменит обычный синтаксический анализ команды оболочки, что, я думаю, приведет к меньшему количеству сюрпризов. Существуют и другие подходы (с использованием массивов, например ), которые более безопасны, если это команда, создаваемая внутри вашего скрипта, а не, например, строка, считанная из текстового файла.

3
27.01.2020, 23:22

Теги

Похожие вопросы