Question sudo echo "quelque chose" >> / etc / privilegedFile ne fonctionne pas ... existe-t-il une alternative?


C'est une question assez simple, du moins semble-t-il, sur les permissions sudo sous Linux.

Il y a beaucoup de fois où je veux juste ajouter quelque chose à /etc/hosts ou un fichier similaire mais finissent par ne pas pouvoir parce que les deux > et >> ne sont pas autorisés, même avec root.

Y a-t-il une façon de faire ce travail sans avoir à su ou sudo su en racine?


438
2017-09-17 16:09


origine


Réponses:


Utilisation tee --append ou tee -a.

echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list

Assurez-vous d'éviter les citations à l'intérieur des guillemets.

Pour éviter d'imprimer des données sur la console, redirigez la sortie vers / dev / null.

echo 'deb blah ... blah' | sudo tee --append /etc/apt/sources.list > /dev/null

640
2018-02-15 12:34



Le problème est que le shell effectue la redirection de la sortie, pas sudo ou echo, donc cela se fait en tant que votre utilisateur habituel.

Essayez l'extrait de code suivant:

sudo sh -c "echo 'something' >> /etc/privilegedfile"

251
2017-09-17 16:11



Le problème est que c'est votre shell qui gère la redirection; il essaie d'ouvrir le fichier avec votre les autorisations, pas celles du processus que vous utilisez sous sudo.

Utilisez quelque chose comme ça, peut-être:

sudo sh -c "echo 'something' >> /etc/privilegedFile"

23
2017-09-17 16:13



sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"

15
2017-09-17 16:11



Faire

sudo sh -c "echo >> somefile"

devrait marcher. Le problème est que les commandes> et >> sont gérées par votre shell, et non par la commande "sudoed", donc les permissions sont les vôtres, pas celles de l'utilisateur dans lequel vous êtes "sudoed".


11
2017-09-17 16:14



Je noterais, pour les curieux, que vous pouvez aussi citer un heredoc (pour les gros blocs):

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"

8
2018-02-13 20:10



En bash vous pouvez utiliser tee en combinaison avec > /dev/null pour garder stdout propre.

 echo "# comment" |  sudo tee -a /etc/hosts > /dev/null

7
2018-03-19 20:53



En utilisant La réponse de Yoo, mettez ceci dans votre ~/.bashrc:

sudoe() {
    [[ "$#" -ne 2 ]] && echo "Usage: sudoe <text> <file>" && return 1
    echo "$1" | sudo tee --append "$2" > /dev/null
}

Maintenant vous pouvez courir sudoe 'deb blah # blah' /etc/apt/sources.list


Modifier:

Une version plus complète qui vous permet de canaliser l'entrée ou de rediriger à partir d'un fichier et comprend un -a basculer pour désactiver l'ajout (qui est activé par défaut):

sudoe() {
  if ([[ "$1" == "-a" ]] || [[ "$1" == "--no-append" ]]); then
    shift &>/dev/null || local failed=1
  else
    local append="--append"
  fi

  while [[ $failed -ne 1 ]]; do
    if [[ -t 0 ]]; then
      text="$1"; shift &>/dev/null || break
    else
      text="$(cat <&0)"
    fi

    [[ -z "$1" ]] && break
    echo "$text" | sudo tee $append "$1" >/dev/null; return $?
  done

  echo "Usage: $0 [-a|--no-append] [text] <file>"; return 1
}

4
2017-09-24 17:50



Vous pouvez aussi utiliser sponge du moreutils paquet et pas besoin de rediriger la sortie (c.-à-d. tee bruit à cacher):

echo 'Add this line' | sudo sponge -a privfile

1
2018-06-27 00:41