Я скомпилировал shadow в ходе сборки Linux From Scratch 8.4, и я мог войти в систему как root или непривилегированный пользователь, но не мог su перейти от непривилегированного пользователя к root, как для Эрика выше. Оказалось, что бинарный файл su принадлежал моему непривилегированному пользователю. Это сработало после того, как я подключил двоичный файл su к root и сделал «chmod u + s» для двоичного файла su.
По сути, это укороченная версия подхода AdminBee:
$ subscription-manager list --installed |
awk '{
if(sub(/^Product Name: */,"")){
a=0;
n=$0;
if(/<Server>/){ a++ }
}
}/Ends/ && a{print n,$2}'
Red Hat Enterprise Linux Server 27/11/20
Сценарий установит a
в 0
, если текущая строка начинается с Product Name:
, поскольку мы хотим сбрасывать ее каждый раз, а затем, если в строке также есть строка Server
, он установит ее к 1
. Затем, если текущая строка начинается с Ends:
и a
не равно 0, будет напечатано второе поле.
Обратите внимание, что это также будет соответствовать Product Name:
, содержащему notAServer
, или любому другому элементу, содержащему Server
. Чтобы ограничиться только совпадениями слов, вы можете использовать это вместо (, предполагая, что у вас есть gawk
, GNU awk):
subscription-manager list --installed |
gawk '{if(sub(/^Product Name: */,"")){a=0; n=$0;if(/\<Server\>/){a++}} }/Ends/ && a{print n,$2}'
Обратите внимание, что сочетание awk
, sed
и grep
для одной задачи требуется редко. В вашем случае должно работать следующее:
subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;print;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print;}'
Это установит флаг relevant_section
в 1
, если строка, начинающаяся с «Имя продукта :» (или, скорее, где второй разделяемый пробелом -токен равен Name:
), содержит строку Server
. Для удобства эта строка также печатается.
Когда встречается строка, начинающаяся с Ends:
при установленном флаге 1
, она печатает эту строку и сбрасывает флаг на 0
.
Если вы действительно хотите напечатать только дату окончания, вы можете сократить ее как:
subscription-manager list --installed | awk '$2=="Name:" && $0~/Server/ {relevant_section=1;} \
$1=="Ends:" && (relevant_section==1) {relevant_section=0;print $2;}'