Насколько я могу сказать, истечение учетной записи пользователя и блокировка являются функционально тем же самым; попытки входа в систему перестанут работать, попытки SSH перестанут работать и т.д. По крайней мере, в моих целях они - то же.
Так, в моем сценарии я теперь обнаруживаю, истекает ли пользователь, и если так, заблокируйте пользователя и установите истечение на 'никогда'.
Это выглядит примерно так:
# Takes 1 parameter, the username to check
# Returns 0 if the user is expired, or 1 if it is not expired.
function userExpired()
{
# These day values are just numbers, the number of days since the epoch.
local expireDay=`grep $1 /etc/shadow | cut -d: -f8`
# If diag has no expiration date, it will be empty.
if [[ "$expireDay" -eq "" ]] ; then
return 1
fi
local today=`perl -e 'print int(time/(60*60*24))'`
local daysUntilExpire=`echo $expireDay - $today | bc`
[[ $daysUntilExpire -lt 0 ]]
}
# Check if the diag user is expired and if so, lock and unexpire it.
userExpired diag && {
usermod --lock --expiredate -1 diag
}
Я записал функцию userExpired из кода, найденного в этом сообщении форума (измененный для установки моему стилю кода и лучшему именованию переменной).
Files в ] /etc/network/if-up.d
уже запускается автоматически всякий раз, когда появляется интерфейс (любой интерфейс). Когда вы указываете тот же сценарий для повторного запуска в явной команде post-up
, вы только заставляете сценарий запускаться снова. Итак, я предполагаю, что должно произойти следующее:
lo
(с переменной среды IFACE = lo
) из-за того, что он находится в / и т. Д. /network/if-up.d
. eth0
(с переменной среды IFACE = eth0
) по той же причине. eth0
(с неустановленной переменной среды IFACE
), потому что вы запросили это в директиве post-up
. Я не знаю, откуда взялся четвертый раз, но в любом случае это уже три.
Вам нужно либо найти сценарий в другом месте и запустить его один раз с помощью директивы post-up
, либо оставить его там, где он есть, но не упоминать его в post-up
и проверьте значение $ IFACE
, чтобы он ничего не делал, если не появился желаемый интерфейс ( eth0
).
Спасибо Омни. Даже следующим образом, я могу достичь этого. Конечно, Урс - это просто. Спасибо большое
grep -H "exit 0" /opt/ctmagent/ctm/sysout_archives/141027/d_dms_btch_alrt_ifm_scp_ksh* | awk -F":" '{system("ls -latr "$1"")}'
-121--133827- Из ваших других вопросов я понимаю, что вы используете OS X. Файловая система HFS + по умолчанию в OS X не учитывает регистр: вы не можете иметь два файла с именами «abc» и «ABC» в одном каталоге, и при попытке доступа к любому имени вы получите одно и то же имя То же самое может произойти при Cygwin или с файловыми системами без учета регистра (например, FAT32 или ciopfs ) в любом месте.
Поскольку grep
является реальным исполняемым файлом, он находится в файловой системе (в каталогах PATH
). При поиске в оболочке /usr/bin
для grep
или GREP
будет найден исполняемый файл grep
.
Сборки оболочки не просматриваются в файловой системе: поскольку они встроены, доступ к ним осуществляется посредством (с учетом регистра) строковых сравнений внутри самой оболочки.
То, с чем вы сталкиваетесь - интересный случай. В то время как cd
является builtin, доступ к нему осуществляется с учетом регистра, CD
находится в виде исполняемого файла /usr/bin/cd
. Исполняемый файл cd
довольно бесполезен: поскольку cd
влияет на текущую среду выполнения оболочки, он всегда предоставляется как обычная встроенная оболочка , но существует cd
исполняемая для POSIX sake , которая в любом случае изменяет каталог для себя, а затем немедленно прекращает работу, оставляя окружающую оболочку там, где она начиналась.
Вы можете попробовать их с помощью type
builtin :
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
type
указывает, что будет делать оболочка при выполнении этой команды. При запуске cd
вы получаете доступ к builtin, но CD
находит исполняемый файл. Для других построений builtin и исполняемый файл будут разумно совместимы (попробуйте echo
), но для cd
это невозможно.
Удалить пустую строку перед выкладкой
-командой. Команда post-up
должна быть связана только с eth0
.
Дополнительно переместите сценарий из папки if-up.d
. Сценарии в этой папке выполняются автоматически, независимо от того, определены ли они как post-up
. В вашем случае он будет выполняться дополнительно к вашей команде post-up
.
Как указано Селадой, / etc / network / if -up.d
скрипты запускаются для каждого интерфейса. Чтобы избежать дублирования правил, просто добавьте:
[ "$IFACE" = "eth0" ] || exit 0
вверху вашего скрипта. Это приведет к немедленному завершению работы сценария, если интерфейс не является желаемым.
Сценарии в /etc/network/if-*.d
выполняются для каждого интерфейса, но также для каждого семейства адресов(IPv4 и IPv6 ).
Вы можете проверить переменную $ADDRFAM
, если вы не хотите или не хотите, чтобы сценарий выполнялся как для семейств IPv4, так и для семейств IPv6.
Например, если вам нужно, чтобы ваш скрипт работал только для определенного интерфейса и только для его IPv4-адреса, вы можете начать с чего-то вроде этого:
[ "$IFACE" = "eth0" ] || exit 0 # we only want interface "eth0"
[ "$ADDRFAM" = "inet" ] || exit 0 # we only want IPv4 (not "inet6" for IPv6)