Если я сделаю:
at -f <(echo "rm $file") сейчас + 2 часа
это работает нормально
Однако если я сделаю вот так:
sudo at -f <(echo "rm $file") сейчас + 2 часа
Я получаю:
at: /dev/fd/63: No such file or directory
Я предполагаю, что это из-за порядка обработки команд. Есть ли способ обойти это, используя команду sudo? Единственный способ, о котором я могу думать, это поместить команду в сценарий и использовать sudo в этом сценарии, что является вариантом, но теперь я хочу знать, почему это происходит.
Прошу прощения, если где-то уже был ответ на этот вопрос, просто я не могу его найти, так как не знаю, что искать.
Поскольку оболочка открывает канал для команды в <(...)
и передает дескриптор файла запускаемому дочернему процессу, 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.
Я предполагаю, что вы намерены cat
все файлы от имени root вашей текущей ls
?
Было бы разумно использовать вместо этого канал xargs
. Попробуйте так:
ls | xargs sudo cat