Во время выполнения команды большинство систем позволяют отображать ее среду с помощью команды ps
. Это невозможно сделать переносимо, и не все системы позволяют надежный синтаксический анализ, но если все, что вам нужно, - это извлечь «интересные» части исходной среды таким образом, чтобы это работало в конкретном варианте Unix, это просто. Например, в Linux и * BSD:
ps eww $$
В качестве альтернативы в Solaris и Linux:
cat /proc/$$/environ
Или в Solaris и AIX:
pargs -e $$
Если вам нужно скрыть прежнее содержимое среды, убедитесь, что вся оболочка процессы (включая фоновые подоболочки) завершились. Чтобы передавать данные таким образом, чтобы не происходила утечка, используйте канал вместо переменной среды.
exec sh -c 'unset pw; pw=$PASSWORD; unset PASSWORD; printf %s "$pw" | exec theprogram'
Обратите внимание, что в большинстве (всех современных?) Вариантах Unix среда процесса видна только одному и тому же пользователю. Только аргументы обычно видны любому пользователю, выполняющему ps
.Так что передавать конфиденциальные данные в среду - это нормально; избавиться от него - это лишь вопрос укрепления, а не элементарной безопасности.
Итак, я попытался найти строку, которая начинается с 5 цифр и заканчивается любой буквой , например:
^[0-9][0-9][0-9][0-9][0-9][A-Z]$
Этот шаблон соответствует строкам которые содержат только 5 цифр и (заглавную) букву. Если вы ожидаете, что между ними будет больше, вам нужно будет включить это в шаблон. Если вам все равно, что происходит между ними, используйте . *
для поиска любого символа неограниченное количество раз. Вероятно, вам также следует использовать строчные буквы или использовать grep -i
, чтобы игнорировать регистр.
^[0-9]\{5\}.*[A-Za-z]$
Следующей моей попыткой будет поиск имени и имени с помощью поиска строки, содержащей только два слова. Но я не знаю, как это сделать, и не могу найти обсуждения, в котором это объяснялось бы.
Вы можете сопоставить строки, содержащие два простых слова, по шаблону, который выполняется: начало, слово, пробел, слово, конец:
^[[:alpha:]]\+[[:space:]]\+[[:alpha:]]\+$
Однако попытка сопоставить имя с регулярным выражением имеет много подводных камней. См. https://stackoverflow.com/questions/2385701/regular-expression-for-first-and-last-name .
Вы можете использовать grep -B2 -E '^ [0-9] {5} + [a-zA-Z] + $'
, чтобы попытаться найти только блоки адресов.
Некоторые примечания:
man grep
, чтобы получить представление о параметрах -B
- это «строки перед совпадением» и может быть лучше для вас, чем -C
-E
для расширенного синтаксиса регулярных выражений {5}
повторяет предыдущее пять раз), затем хотя бы один пробел ( +
принимает предыдущее одно или еще раз), а затем только буквы до конца строки. `
очень отличается от '
или "
. Вы можете попытаться найти строки, содержащие только два слова, если попытаетесь найти строки, содержащие только один пробел:
grep -E '^[^ ]+ [^ ]+'
Если вы хотите сопоставить что-то в нескольких строках, я не уверен, что grep
может это сделать. Вы можете попробовать сделать это с помощью sed
который может загружать следующие строки в пространство шаблонов с помощью N
, а затем сопоставлять их с этой конкатенацией (посмотрите man sed
, если это вам подходит). (Или perl
, я думаю, он может соответствовать многострочным шаблонам, но я не знаю как.)