Как я могу распечатать только переменные, определенные в моем сценарии оболочки?

Проверить passwd и соответствующий shadow файл, использовать pwck. Проверить group и соответствующий gshadow fiile, использовать grpck'. См. страницы справочника для деталей действий, которые они выполняют.

Рука-editting /etc/passwd лучше всего сделан (если вообще) с vipw и vipw -s для shadow файл. Для /etc/group и /etc/gshadow использовать vigr и vigr -s, соответственно. Используя эти инструменты обеспечивают не только блокировку для предотвращения нескольких, обновлений параллельного пользователя, но также и проверки законности предложения.

В целом модификации к паролю и файлам группы лучше всего сделаны с помощью стандарта user(add|mod|del) и group(add|mod|del) инструменты.

3
09.12.2014, 09:28
3 ответа

Это один из уродливых угловых вариантов модели разрешений Unix. Предоставление доступа на запись к файлу позволяет жестко связать его. Если пользователь A имеет разрешение на запись в каталог, содержащий файл, он может переместить его в каталог, к которому пользователь B не имеет доступа. Пользователь B не может получить доступ к файлу, но он по-прежнему считается пользователем B в целях квоты.

Некоторые старые системы Unix имели хуже дыру: пользователь мог вызвать chown , чтобы предоставить один из своих файлов другому пользователю; если бы они сделали файл доступным для записи раньше, они могли бы продолжать использовать этот файл, но файл будет считаться квотой другого пользователя. Это одна из причин, по которой современные системы резервируют chown для root .

Нет чисто технического решения. Пользователь B должен заметить, что его использование диска ( du ~ ) не соответствует его использованию в квотах, и пожаловаться системному администратору, который будет исследовать и подвергать сомнению пользователя A.

-121--55933-

Да, возможно.

Посмотрите на эту полезную вики-страницу от Fedora , которая объясняет, что «скрипты» перед и после сборки принимают аргумент, который передается им, когда они запускаются как часть установки RPM.

Можно добавить проверку, чтобы определить, выполняется ли модернизация или новая установка на ваш скрипт. Приведенная ссылка содержит пример того, как это сделать в сценарии предустановки.

-121--111684-

Вот портативное средство получения отсортированного списка всех текущих определенных вариаций:

v(){ set "${IFS+IFS=\$2}" "$IFS"; unset IFS
     set  $(set|sed -n '/^[_[:alpha:]][[:alnum:]]*=/s/=.*//p'|sort -u) "$@"
     while [ "$#" -gt 2 ] 
     do    eval '[ "${'$1'+1}" = 1 ]' && 
           echo "$1"; shift
     done; eval "$1"
}

Этот список имеет значение echo от v () - одно имя на строку. Поскольку это сортировка , это хороший кандидат для последующего сравнения с аналогичным созданным списком, как в случае с comm или подобным. Список намеренно исключает $ IFS - и это потому, что - set или not - $ IFS всегда является действительным, и таким образом в таком списке в любом случае должен быть дан. Это может быть изменено, как:

set "${IFS+IFS=\$2}" "$IFS"; IFS='
'; set $(set|... 

... но это будет только всегда включать в список, независимо от того, был ли этот набор или нет - что возвращает меня к моему предыдущему пункту...

0
27.01.2020, 21:23

Решение с использованием COMM на основе хранения всех переменных до и после:

#!/bin/bash 

# Storing variables before:
set -o posix
set > $TMP/VariablesBefore.txt
sort $TMP/VariablesBefore.txt -o $TMP/VariablesBeforeSorted.txt

a=3
b=7

# Storing variables after:
set > $TMP/VariablesNow.txt
sort $TMP/VariablesNow.txt -o $TMP/VariablesNowSorted.txt

# Computing differences:
echo "The variables inside the script are: "
comm -3 $TMP/VariablesBeforeSorted.txt $TMP/VariablesNowSorted.txt

Ну, есть еще несколько переменных, оставшихся вроде _ или Bash_Lineeno ], но это ставка, которую я достиг.

Обратите внимание, что это решение не может работать во всех случаях, например Переменные очень длинные (КБ), с новой строкой коды или переменные включая имена переменной. Спасибо, Миксерв, для указывающего.

1
27.01.2020, 21:23

Вы находитесь на правильном треке с sed: все, что вам нужно сделать, это преобразовать свой список номеров строк, за которыми следует p и newline, и использовать это в качестве скрипта sed. Например, если у вас есть список, разделенный пробелами:

lines="2 3 5 7 11 13"
<sourcefile.tsv sed -n "$(echo "$lines" | sed 's/$/p/; s/ /p\n/')"  >extractedrecords.tsv

Awk - это еще одна возможность.

lines="2 3 5 7 11 13"
export lines
<sourcefile.tsv awk '" "ENVIRON["lines"]" " ~ " "NR" "' >extractedrecords.tsv
-121--105517-

Вы можете использовать:

tr -dc '\-0-9\n' | sort -u -t- -nk1,1 | grep -c .

... что, по общему признанию, более чем немного вдохновлено ответом муру здесь. Однако, по-другому, я использую grep для подсчета строк, а не wc , если на входе пустые строки. Его ответ не имеет проблемы пустых строк, так как grep -o будет печатать только строки с их совпадением (так как grep -c только считает их здесь) , но tr делает печатает пустые Это означает, что любое количество пустых строк на входе приведет к смещению результатов wc на единицу.

Поэтому tr здесь, вероятно, эффективнее, чем grep -o , но, вероятно, wc бьет grep в счетном отделе. Мне нравится это так, я думаю из соображений переносимости, а также потому, что я обычно стараюсь сначала обрезать данные с наиболее эффективным фильтром, а затем использовать менее эффективные в цепочке.

Это позволяет отсортировать выбрать биты на строку, которые он будет рассматривать в своей -u nique сортировке на основе своей -n цифровой сортировки -k ey, которую он разделяет на своем разделителе -t- ab. tr -d удаляет -c комплимент любого числового, тире или байта новой строки на его входе. Это путь - при условии, что нет - тире, встречающихся перед числовым последовательностям, который вы хотите сравнить, то единственное, что остается для любой строки:

#nothing at all

... или...

[numbers]

... или...

[numbers]-[more numbers]more-dashes-...

Поэтому, когда выходной сигнал направляется на сортировку , мы предписываем ему сравнивать только числовые последовательности, возникающие перед тире, если таковые имеются. Таким образом -тире или нет - единственные числа, которые имеют значение те, которые вы хотите считать.

Тогда мы grep -c голосовые строки, содержащие, по крайней мере, одну . символ. Следующая команда печатает 8 :

tr -dc '\-0-9\n' <<\IN | sort -u -t- -nk1,1 | grep -c .
psf7433-nlhrms
unit7433-nobody
unit7333-opera
bpx7333-operations
app7333-osm
unit7330-partners
psf7331-pdesmond
unit7333-pro-09-0jm
mnp7330-redir09o-0ect
unit7333-retailbanking
cpq7333-rkarmer
unit6333-sales
ring7323-support


unit7133-telco
post7323-uadb
sun7335-ukhrms
burp7133-wfnmreply
IN
-121--97747-

Можно сохранить список переменных в начале сценария и сравнить его со значением где-то во время сценария. Обратите внимание, что вывод команд, таких как set , не является однозначным: что-то вроде наборов | sed 's/=. *//' не работает с переменными, значения которых содержат новые строки. (В bash он фактически относится к строковым переменным, но не к массивам, а также отображает код функции.) Я думаю, что следующий фрагмент достоверно перечисляет определяемые в настоящее время переменные (в алфавитном порядке, для загрузки):

variables=$(tmp=$(declare -p +F); declare () { echo "${2%%=*}"; }; eval "$tmp")

Таким образом, установите initial _ variables =... в начале сценария, и сравните с более поздним значением.Для непосредственного включения в список можно использовать что-либо, отличное от эхо .

initial_variables=" $(tmp=$(declare -p +F); declare () { echo "${2%%=*}"; }; eval "$tmp") "
…
( tmp=$(declare -p +F)
  declare () {
    case "$initial_variables" in
      *" $2 "*) :;; # this variable was present initially
      *) eval "set -- \"\$$2\" \"\$2\""; echo "locally defined $2=$1";;
    esac
  }
)
1
27.01.2020, 21:23

Теги

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