sudo at -f <(echo "rm $file") now + 2 hours yields at: /dev/fd/63: No such file or directory

Если я сделаю:

at -f <(echo "rm $file") сейчас + 2 часа

это работает нормально

Однако если я сделаю вот так:

sudo at -f <(echo "rm $file") сейчас + 2 часа

Я получаю:

at: /dev/fd/63: No such file or directory

Я предполагаю, что это из-за порядка обработки команд. Есть ли способ обойти это, используя команду sudo? Единственный способ, о котором я могу думать, это поместить команду в сценарий и использовать sudo в этом сценарии, что является вариантом, но теперь я хочу знать, почему это происходит.

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

0
04.11.2016, 16:07
2 ответа

Поскольку оболочка открывает канал для команды в <(...) и передает дескриптор файла запускаемому дочернему процессу, sudo в этом случае. Путь / dev / fd / 63 - это метод, предоставляемый ядром, чтобы разрешить доступ к уже открытому дескриптору файла через нормальный путь.

Однако sudo не передает дескриптор запускаемому процессу (по соображениям безопасности): по умолчанию он закрывает все дескрипторы файлов, кроме stdin, stdout и stderr, поэтому программа, которая в конечном итоге запускается не имеет дескриптора файла, соответствующего / dev / fd / 63 , и возникает ошибка.

Вы можете решить эту проблему, выполнив замену в оболочке внутри sudo:

sudo bash -c 'cat <(echo something)' 

Это, конечно, означает, что внутренняя подстановка также выполняется с повышенными привилегиями:

$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)

флаг -C для sudo предлагает другой способ, но для его разрешения может потребоваться дополнительная настройка:

-C num, --close-from = num
Закройте все файловые дескрипторы больше или равные num перед выполнением команда. Значения меньше трех не допускаются. По умолчанию sudo закрывает все дескрипторы открытых файлов, кроме стандартного ввода, стандартного вывода и стандартной ошибки при выполнении команды.Политика безопасности может ограничивать возможность пользователя использовать эту опцию. Политика sudoers разрешает использование параметра -C только в том случае, если администратор включил параметр closefrom_override.

1
28.01.2020, 02:34

Я предполагаю, что вы намерены cat все файлы от имени root вашей текущей ls ?

Было бы разумно использовать вместо этого канал xargs . Попробуйте так:

ls | xargs sudo cat

1
28.01.2020, 02:34

Теги

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