sudo echo "something" > / etc / privilegedFile не работает... есть ли альтернатива?
Это довольно простой вопрос, по крайней мере, кажется, что это должно быть, о разрешений sudo в Linux.
есть много раз, когда я просто хочу добавить что-то /etc/hosts
или аналогичный файл, но в конечном итоге не в состоянии, потому что оба >
и >>
не допускаются, даже с корнем.
есть ли способ сделать эту работу без необходимости su
или sudo su
в корень?
12 ответов:
использовать
tee --append
илиtee -a
.echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list
убедитесь, что вы избегаете кавычек внутри кавычек.
чтобы избежать печати данных обратно на консоль, перенаправьте вывод в /dev / null.
echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list > /dev/null
проблема в том, что оболочка выводит перенаправление, а не sudo или echo, поэтому это делается как ваш обычный пользователь.
попробуйте следующий фрагмент кода:
sudo sh -c "echo 'something' >> /etc/privilegedfile"
проблема в том, что это ваша оболочка, которая обрабатывает перенаправление; он пытается открыть файл с код разрешения не те из процесса, который вы используете под sudo.
использовать что-то вроде этого, наверное:
sudo sh -c "echo 'something' >> /etc/privilegedFile"
делаешь
sudo sh -c "echo >> somefile"
должны работать. Проблема в том, что > и >> обрабатываются вашей оболочкой, а не командой "sudoed", поэтому разрешения-это ваши, а не те, которые вы "судите".
Я бы отметил, для любопытных, что вы также можете процитировать heredoc (для больших блоков):
sudo bash -c "cat <<EOIPFW >> /etc/ipfw.conf <?xml version=\"1.0\" encoding=\"UTF-8\"?> <plist version=\"1.0\"> <dict> <key>Label</key> <string>com.company.ipfw</string> <key>Program</key> <string>/sbin/ipfw</string> <key>ProgramArguments</key> <array> <string>/sbin/ipfw</string> <string>-q</string> <string>/etc/ipfw.conf</string> </array> <key>RunAtLoad</key> <true></true> </dict> </plist> EOIPFW"
в bash, вы можете использовать
tee
в сочетании с> /dev/null
для того чтобы держать чистым и stdout.echo "# comment" | sudo tee -a /etc/hosts > /dev/null
используя ю, это
~/.bashrc
:sudoe() { [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1 echo "" | sudo tee --append "" > /dev/null }
теперь вы можете запустить
sudoe 'deb blah # blah' /etc/apt/sources.list
Edit:
более полная версия, которая позволяет передавать ввод или перенаправление из файла и включает в себя
-a
включить отключить добавление (по умолчанию):sudoe() { if ([[ "" == "-a" ]] || [[ "" == "--no-append" ]]); then shift &>/dev/null || local failed=1 else local append="--append" fi while [[ $failed -ne 1 ]]; do if [[ -t 0 ]]; then text=""; shift &>/dev/null || break else text="$(cat <&0)" fi [[ -z "" ]] && break echo "$text" | sudo tee $append "" >/dev/null; return $? done echo "Usage: [-a|--no-append] [text] <file>"; return 1 }
вы также можете использовать
sponge
Сmoreutils
пакет и не нужно перенаправлять вывод (т. е. нетtee
шум, чтобы скрыть):echo 'Add this line' | sudo sponge -a privfile
это сработало для меня: исходная команда
echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment
рабочая команда
echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment
С помощью sed-i С $ a, вы можете добавить текст, содержащий как переменные, так и специальные символы, после последней строки.
например, добавление $NEW_HOST с $NEW_IP в /etc/hosts:
sudo sed -i "$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts
параметры sed объяснил:
- -Я на месте
- $ за последние линия
- a добавлять