Это выглядит выполнимым - вы просто должны как бы сдвигать-включать-выключать:
echo can ccccc ccccccccclayii sed clay ignore \
every cclayii thing but the matching word\
- cclayiicclayii |
sed -e'y/ /\n/' \
-eh -e's/\(cclayii\)\1*/ & /g;x;s// /g;s/^/ /' \
-ex -e's//./;s/\([^ ]* *\)\{2\}/\1 /g;s/^/ /' \
-e'y/clayk/kieio/;G;t$' -e:$ \
-e'/^ \n /{s///;y/ \n/\n /;}' \
-et -e's/^ *\([^ ]*\) \(.* \n [^ ]*\) /\2\1/;t$'
can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii
... это нелегко, однако.
Как и в большинстве сложных задач, это намного проще, если использовать два sed
s:
echo can ccccc ccccccccclayii sed clay ignore \
every cclayii thing but the matching word\
- cclayiicclayii |
sed -e's/\(cclayii\)\1*/\n&\n /g;G;s/^/ /'|
sed -e'/^ /!y/clayk/kieio/;/./{H;d;}' \
-e'x;s/\n \{0,1\}//g'
can ccccc ccccccckkieiii sed clay ignore every kkieiii thing but the matching word - kkieiiikkieiii
Он не может запрашивать пароль, если он не связан с терминалом:
setsid brew < /dev/null &> /dev/null
Или, если вы хотите захватить его вывод:
setsid brew < /dev/null |& cat
То есть, предположим, у вас есть setsid
, который, видимо, может быть недоступен в MacOS . Если вы хотите это, но у вас его нет, есть доступные реализации .
Если у вас нет sedsid
, но естьat
:
[ -e ~/brew_$$.log ] && rm ~/brew_$$.log
at now << eof
brew > ~/brew_$$.lo_ 2>& 1 || true
mv ~/brew_$$.lo_ ~/brew_$$.log
eof
while ! [ -e ~/brew_$$.log ]; do sleep 1; done
cat ~/brew_$$.log && rm ~/brew_$$.log
запустит brew
теперь -отключится от терминала, перехватит вывод и скопирует его в поток вывода скрипта.
Выйдите из /etc/sudoers
. Это сделает все попытки sudo неудачными.
Вам может понадобиться закомментировать эту строку:
%sudo ALL=(ALL:ALL) ALL
Убедитесь, что у вас есть альтернативный способ получения root-доступа (, например.пароль root ), чтобы вы могли отменить это.
Измените эту строку в/etc/sudoers
:
Defaults env_reset
в
Defaults env_reset,timestamp_timeout=-1
Благодаря этому sudo никогда не запрашивает пароль.(Источник.)
Все неудачные попытки sudo регистрируются в /var/log/auth.log
. Запустите utility
и найдите такую строку вauth.log
:
Jul 4 12:23:07 host sudo: test_perm : user NOT in sudoers ; TTY=pts/1 ; PWD=/home/nick ; USER=root ; COMMAND=/bin/echo
(Это может быть зарегистрировано где-то еще в macOS; Я не уверен.)
В Linux вы можете отключить действие бита setuid для процесса и всех других процессов, запускаемых из него, включив флаг no_new_privs
(см.prctl(2)
). В сценариях оболочки это можно сделать с помощью утилиты setpriv
из пакета util-linux
:
$ setpriv --no-new-privs sudo -v
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
Таким образом, изменение вашего скрипта для запуска setpriv --no-new-privs utility
вместо utility
должно работать, если вы можете жить с шумным сообщением об ошибке выше.
(К сожалению, вы упоминаете brew
, и это, вероятно, не работает на macOS… но, возможно, это все же помогает кому-то еще.)