Перенаправить вывод с помощью `sudo` [duplicate]

У меня небольшой вопрос относительно использования sudo с перенаправлением вывода > . Чтобы включить переадресацию IP, кто-то может использовать команду:

echo 1 > /proc/sys/net/ipv4/ip_forward

Выполнение этой команды приведет к отказу в разрешении, поскольку для этого требуются привилегии root. Однако выполнение той же команды с sudo также приводит к ошибке отказа в разрешении! Похоже, что перенаправление вывода > не наследует разрешения предыдущей команды echo . Это правильно?

В качестве обходного пути я делаю:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

Это лучший способ сделать это? Я что-то упустил?

Обратите внимание, что это пример, и он применяется ко всем командам, использующим перенаправление вывода.

31
задан 25 April 2014 в 15:08

3 ответа

Одним из решений является использование:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

, но это не наследует свойства env от родительской оболочки, поэтому вы не можете использовать его, например, с echo $PATH, чтобы получить тот же результат вы бы имели в своей родительской оболочке (конечно, только в случае, если вы измените свое свойство пути).

Использование sudo -E сохранит переменные среды.

Также, согласно https://wiki.ubuntu.com/DashAsBinSh , вам лучше использовать sh (что является символической ссылкой на dash), вместо того, чтобы вызывать это с bash.

Итак, вы можете переписать это как:

sudo -E sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
0
ответ дан 25 April 2014 в 15:08

Я обычно использую трюк sudo bash -c, или просто сначала делаю sudo -s, чтобы остаться root, а затем запускаю команду перенаправления.

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

0
ответ дан 25 April 2014 в 15:08

Ваш подход с sudo tee в порядке. Хорошим следствием использования sudo tee является то, что выполненная команда перед конвейером не будет работать от имени пользователя root. Это полезно, если вам просто нужен вывод программы, которая не требует привилегий root.

Если вас не волнует вывод программы, используемой перед конвейером (в данном случае echo 1), перенаправьте стандартный вывод на /dev/null:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward > /dev/null

Выше эквивалентно sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' с той разницей, что echo 1 запускается от имени root.

Если вам нужно добавить в привилегированный файл, вы можете использовать sh -c 'echo 127.0.0.1 local.host >> /etc/hosts' или:

echo 127.0.0.1 local.host | sudo tee -a /etc/hosts

Обратите внимание на -a, что является сокращением для --append.

0
ответ дан 25 April 2014 в 15:08

Другие вопросы по тегам:

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