Вот как сбросить пароль root в CentOS 7 и RHEL 7:
linux16
, удалив параметры rhgb
и quiet
и добавив в конце rd.break
. switch_root
. mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
mount -o remount,ro /sysroot
exit
exit
Источник:руководство , которое я написал некоторое время назад.
Если у вас есть полный синтаксис оболочки, вы можете использовать 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
применит обычный синтаксический анализ команды оболочки, что, я думаю, приведет к меньшему количеству сюрпризов. Существуют и другие подходы (с использованием массивов, например ), которые более безопасны, если это команда, создаваемая внутри вашего скрипта, а не, например, строка, считанная из текстового файла.