web-dev-qa-db-fra.com

sudo echo "quelque chose" >> / etc / privilegedFile ne fonctionne pas

C’est une question assez simple, du moins on dirait que cela devrait être le cas, à propos des autorisations Sudo sous Linux.

Il arrive souvent que je veuille simplement ajouter quelque chose à /etc/hosts ou à un fichier similaire, sans pouvoir le faire car > et >> ne sont pas autorisés, même avec root. .

Y a-t-il un moyen de faire ce travail sans avoir à su ou Sudo su en racine?

542
David

Utilisez tee --append ou tee -a.

echo 'deb blah ... blah' | Sudo tee -a /etc/apt/sources.list

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

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

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

N'oubliez pas le drapeau (-a/--append)! Juste tee fonctionne comme > et écrasera votre fichier. tee -a fonctionne comme >> et écrit à la fin du fichier.

784
Yoo

Le problème est que le shell génère la redirection en sortie, pas Sudo ou echo, donc cela se fait en tant qu’utilisateur régulier.

Essayez l'extrait de code suivant:

Sudo sh -c "echo 'something' >> /etc/privilegedfile"
298
Matt P

Le problème est que c'est votre shell qui gère la redirection; il essaie d'ouvrir le fichier avec les autorisations votre et non celles du processus que vous exécutez sous Sudo.

Utilisez quelque chose comme ceci, peut-être:

Sudo sh -c "echo 'something' >> /etc/privilegedFile"
31
Incident
Sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"
17
Vinko Vrsalovic

Faire

Sudo sh -c "echo >> somefile"

devrait marcher. Le problème est que> et >> sont gérés par votre Shell, et non par la commande "sudoed", de sorte que les autorisations vous appartiennent et non celles de l'utilisateur que vous "subissez".

13
agnul

Je ferais remarquer, pour les curieux, que vous pouvez aussi citer un hérédoc (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"
9
msanford

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

 echo "# comment" |  Sudo tee -a /etc/hosts > /dev/null
8
Vytenis Bivainis

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 lancer sudoe 'deb blah # blah' /etc/apt/sources.list


Modifier:

Une version plus complète qui vous permet de diriger l'entrée ou la redirection à partir d'un fichier et inclut un commutateur -a 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
hololeap

Vous pouvez également utiliser sponge à partir du package moreutils sans avoir besoin de rediriger la sortie (c'est-à-dire, pas de bruit tee à masquer):

echo 'Add this line' | Sudo sponge -a privfile
2
Michael Goldshteyn

Que diriez-vous:
echo text | Sudo dd status = aucun de = fichier privilégié
Je souhaite modifier/proc/sys/net/ipv4/tcp_rmem.
J'ai fait:
Sudo dd status = aucun de =/proc/sys/net/ipv4/tcp_rmem <<< "4096 131072 1024000"
élimine l'écho avec un document d'une seule ligne

0
Marcelo Pacheco

echo 'Hello World' | (Sudo tee -a /etc/apt/sources.list)

0
Sudev Shetty

En utilisant sed -i avec $ a, vous pouvez ajouter du texte contenant les deux variables et caractères spéciaux, après la dernière ligne.

Par exemple, ajouter $ NEW_Host avec $ NEW_IP à/etc/hosts:

Sudo sed -i "\$ a $NEW_IP\t\t$NEW_Host.domain.local\t$NEW_Host" /etc/hosts

options sed expliquées:

  • - i pour sur place
  • $ pour la dernière ligne
  • a pour ajouter
0
Noam Manos