Bash: Как убить eval, если процесс, который получает его выходные данные, завершается

Да, root имеет все права делать что угодно

Здесь вы можете видеть, что я создал тест имени каталога, коснулся файла lonston.txt и перечислил файлы

root@system99:/tmp# mkdir test && touch lonston.txt && ls -l
total 4
-rw-r--r-- 1 root root    0 Feb 27 16:35 lonston.txt
drwxr-xr-x 2 root root 4096 Feb 27 16:35 test

Затем я изменил права доступа к файлу и каталогу обнулить разрешение с помощью 000 и перечислить, чтобы увидеть разрешение

root@system99:/tmp# chmod 000 lonston.txt && chmod 000 test && ls -l
total 4
---------- 1 root root    0 Feb 27 16:35 lonston.txt
d--------- 2 root root 4096 Feb 27 16:35 test

Тогда даже я могу записать в файл и прочитать файл с помощью cat

root@system99:/tmp# echo "Yes root have all Privileges than other user's, let we see the permission of user's too" > lonston.txt 

root@system99:/tmp# cat lonston.txt 
Yes root have all Privilages than other user's, let we see the permission of user's too

Даже я могу попасть в каталог, который имеет d -------- - (null) 000 разрешение, даже root не имеет разрешения на чтение или запись.

root@system99:/tmp# cd test/
root@system99:/tmp/test# pwd
/tmp/test

Даже я могу создавать файлы и папки после изменения прав доступа с любого из них.

root@system99:/tmp/test# touch /tmp/test/lonston/testdir/babin.txt

root@system99:/tmp/test# ls -l /tmp/test/lonston/testdir/
total 0
-rw-r--r-- 1 root root 0 Feb 27 16:39 babin.txt

Теперь здесь мы можем увидеть Разрешение с 400

root@system99:/tmp/test# chmod 400 babin.txt

Список, чтобы увидеть права доступа к файлам

root@system99:/tmp/test# ls -l
total 8
-r-------- 1 root root   34 Feb 27 16:42 babin.txt
drwxr-xr-x 3 root root 4096 Feb 27 16:38 lonston

Используя vim im, я добавил 1 строку в файл babin.txt

root@system99:/tmp/test# vim babin.txt

Но в режиме vim он заметит нас. W10: Предупреждение: изменение файла, доступного только для чтения , но он все еще доступен для записи

Теперь мы можем скопировать файл для вывода

root@system99:/tmp/test# cat babin.txt 
hi this is the write persmission 
this is added while the file have 400 permission

Затем Я вышел из системы от пользователя root к обычному пользователю и перечислил файл с нулевым разрешением, что и в корневом каталоге

root@system99:/tmp# exit
exit

Перейдите в каталог / tmp

sysadmin@system99:~$ cd /tmp/
sysadmin@system99:/tmp$ ls -l
total 8
---------- 1 root root   88 Feb 27 16:36 lonston.txt
d--------- 2 root root 4096 Feb 27 16:35 test

Но при чтении файла от обычного пользователя мы не можем

sysadmin@system99:/tmp$ cat lonston.txt 
cat: lonston.txt: Permission denied

sysadmin@system99:/tmp$ cd test/
cat: test/: Permission denied

Вот и все, Надеюсь у вас есть полномочия пользователя root

. Если вы в качестве обычного пользователя, если вам нужны привилегии root, нам нужно использовать sudo, он запросит пароль sudo

пример:

sysadmin@system99:/tmp$ sudo cat lonston.txt 
[sudo] password for sysadmin: 
Yes root have all Privilages than other user's, let we see the permission of user's too

Пользователь Sudo взаимодействует с группой пользователей root, поэтому какие у sudo есть привилегии root.

Чтобы узнать больше о sudo

# man sudoers

Здесь мы видим, что они определили, что обычный пользователь может иметь права Sudo Здесь я упомянул только меньшее количество строк.

sysadmin@system99:/tmp$ sudo cat /etc/sudoers

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

Полностью мы можем читать, редактировать или удалять файлы, даже root. Не имеет разрешения на чтение.

2
02.02.2019, 19:57
2 ответа

Здесь есть две возможности :либо fzfне закрывается, когда вы выбираете файл, либо findне закрывается, когда закрывается fzf. Если это последнее, вы можете написать скрипт для закрытия findвручную при выходе из fzf.

То, как каналы работают в Linux, findне знает, что канал, в который он записывает, ничего не читает из этого канала, пока он не попытается записать в этот канал и не потерпит неудачу. Как следствие, если вы выберете файл после того, какfindуже нашел все, что собирался найти, findбольше не записывает в конвейер и, таким образом, будет перебирать всю файловую систему перед выходом.

В качестве иллюстрации этого, если вы создадите случайный файл в /, а затем запустите find / -name $random_file_name | head -n 1, вы очень быстро получите весь вывод, который собираетесь получить, но программа будет продолжать работать в течение длительного времени. время.

Один из способов обойти это — самостоятельно завершить процесс, когда он завершится. Вероятно, самый простой способ сделать это в вашем конкретном случае — это именованный канал:

tmp_fifo=`mktemp -u`
mkfifo "$tmp_fifo"
eval "$search_command" > "$tmp_fifo" &
choice="$(fzf -q "$file_query" -1 --preview "preview $search_folder {}" < "$tmp_fifo")" ; kill $!
rm "$tmp_fifo"

Это создает временный именованный канал, findзаписывает в него и fzfчитает из него. Но когда fzfзавершается, запускается kill $!, где $!обозначает последний запущенный фоновый процесс, в данном случае find.

4
27.01.2020, 21:58

Другой ответ выглядит нормально, но недостатком является то, что вам нужно управлять fifo. С Bash'омcoprocвы можете решить проблему без именованного fifo.

(Обратите внимание, :чтобы этот ответ касался общей проблемы, а не вашей конкретной, я удалил ваши переменные, evalи подобные вещи ).

coproc find...         # this silently runs in background, no `&' nor explicit redirection needed
<&${COPROC[0]} fzf...  # piping from `find' to `fzf'
kill $!                 # killing the last background process, i.e. `find'
0
27.01.2020, 21:58

Теги

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