Question

C’est une question assez simple, du moins on dirait que ce devrait être le cas, sur les autorisations sudo sous Linux.

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

Y at-il un moyen de faire en sorte que cela fonctionne sans avoir à su ou sudo su à la racine?

Était-ce utile?

La solution

Utilisez tee --append ou tee -a .

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

Veillez à éviter les guillemets entre 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

Autres conseils

Le problème est que le shell génère la redirection en sortie, pas sudo ou echo, donc cela se fait comme votre utilisateur habituel.

Essayez l'extrait de code suivant:

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

Le problème est que c'est votre shell qui gère la redirection; il essaie d'ouvrir le fichier avec vos autorisations 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"
sudo sh -c "echo 127.0.0.1 localhost >> /etc/hosts"

Faire

sudo sh -c "echo >> somefile"

devrait fonctionner. Le problème est que > et > > sont manipulés par votre shell, pas par le "sudoed" commande, les autorisations sont donc les vôtres, pas celles de l'utilisateur que vous "Sudoing" dans.

Je ferais remarquer, pour les curieux, que vous pouvez également 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"

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

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

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
}

Vous pouvez maintenant exécuter sudoe 'deb blah # blah' /etc/apt/sources.list

Modifier:

Une version plus complète qui vous permet de diriger l'entrée dans un fichier ou de le rediriger à 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: <*> [-a|--no-append] [text] <file>"; return 1
}

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

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

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

Cela a fonctionné pour moi: commande d'origine

echo "export CATALINA_HOME="/opt/tomcat9"" >> /etc/environment

Commande de travail

echo "export CATALINA_HOME="/opt/tomcat9"" |sudo tee /etc/environment

En utilisant sed -i avec $ a , vous pouvez ajouter texte contenant à la fois des variables et des 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

Les options de Sed expliquées:

  • -i pour un remplacement sur place
  • $ pour la dernière ligne
  • un à ajouter

Pouvez-vous modifier la propriété du fichier, puis de nouveau après avoir utilisé cat > > à ajouter?

sudo chown youruser /etc/hosts  
sudo cat /downloaded/hostsadditions >> /etc/hosts  
sudo chown root /etc/hosts  

Quelque chose comme ça marche pour vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top