Как использовать sudo для перенаправления вывода в местоположение, в которое у меня нет разрешения на запись? - PullRequest
792 голосов
/ 17 сентября 2008

Мне был предоставлен доступ sudo к одному из наших Linux-пакетов RedHat для разработки, и мне кажется, что мне часто приходится перенаправлять вывод в местоположение, к которому у меня обычно нет прав записи.

Проблема в том, что этот надуманный пример не работает:

sudo ls -hal /root/ > /root/test.out

Я только что получил ответ:

-bash: /root/test.out: Permission denied

Как мне заставить это работать?

Ответы [ 15 ]

3 голосов
/ 28 июля 2016

Не значит победить мертвую лошадь, но здесь слишком много ответов, в которых используется tee, что означает, что вам нужно перенаправить stdout на /dev/null, если вы не хотите увидеть копию на экране. Более простое решение - просто использовать cat следующим образом:

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

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

3 голосов
/ 17 сентября 2008

Всякий раз, когда мне нужно сделать что-то подобное, я просто становлюсь пользователем root:

# sudo -s
# ls -hal /root/ > /root/test.out
# exit

Возможно, это не самый лучший способ, но он работает.

2 голосов
/ 27 ноября 2013

Это основано на ответе, включающем tee. Чтобы упростить задачу, я написал небольшой скрипт (я называю его suwrite) и поместил его в /usr/local/bin/ с разрешением +x:

#! /bin/sh
if [ $# = 0 ] ; then
    echo "USAGE: <command writing to stdout> | suwrite [-a] <output file 1> ..." >&2
    exit 1
fi
for arg in "$@" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "$@" > /dev/null

Как показано в ИСПОЛЬЗОВАНИИ в коде, все, что вам нужно сделать, - это передать выходные данные в этот скрипт, за которым следует желаемое доступное для суперпользователя имя файла, и оно при необходимости автоматически запросит ваш пароль (поскольку оно включает sudo).

echo test | suwrite /root/test.txt

Обратите внимание, что, поскольку это простая оболочка для tee, она также примет опцию -a тройника для добавления, а также поддерживает запись в несколько файлов одновременно.

echo test2 | suwrite -a /root/test.txt
echo test-multi | suwrite /root/test-a.txt /root/test-b.txt

Он также имеет некоторую упрощенную защиту от записи на устройства /dev/, о которой упоминалось в одном из комментариев на этой странице.

1 голос
/ 17 сентября 2008

Может быть, вам был предоставлен доступ sudo только к некоторым программам / путям? Тогда нет способа делать то, что вы хотите. (если только не взломаете)

Если это не так, то, возможно, вы можете написать скрипт bash:

cat > myscript.sh
#!/bin/sh
ls -hal /root/ > /root/test.out 

Нажмите ctrl + d :

chmod a+x myscript.sh
sudo myscript.sh

Надеюсь, это поможет.

0 голосов
/ 21 сентября 2017
sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  
...