Domanda

Questa è una domanda piuttosto semplice, almeno sembra che dovrebbe esserlo, sui permessi sudo in Linux.

Ci sono molte volte in cui voglio semplicemente aggiungere qualcosa a /etc/hosts o un file simile ma finisci per non essere in grado di farlo perché entrambi > E >> non sono consentiti, nemmeno con root.

Esiste un modo per farlo funzionare senza doverlo fare su O sudo su nella radice?

È stato utile?

Soluzione

Utilizzo tee --append O tee -a.

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

Assicurati di evitare virgolette all'interno di virgolette.

Per evitare di stampare nuovamente i dati sulla console, reindirizzare l'output su /dev/null.

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

Altri suggerimenti

Il problema è che la shell esegue il reindirizzamento dell'output, non sudo o echo, quindi questo viene fatto come utente normale.

Prova il seguente frammento di codice:

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

Il problema è che è la tua shell a gestire il reindirizzamento;sta cercando di aprire il file con tuo autorizzazioni non quelle del processo in esecuzione con sudo.

Usa qualcosa del genere, forse:

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

Facendo

sudo sh -c "echo >> somefile"

dovrebbe funzionare.Il problema è che > e >> sono gestiti dalla tua shell, non dal comando "sudoed", quindi i permessi sono tuoi, non quelli dell'utente a cui stai "sudoed".

Vorrei notare, per i curiosi, che puoi anche citare un heredoc (per blocchi di grandi dimensioni):

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"

In bash puoi usare tee in combinazione con > /dev/null per mantenere pulito lo stdout.

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

Utilizzando La risposta di Yoo, metti questo nel tuo ~/.bashrc:

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

Ora puoi correre sudoe 'deb blah # blah' /etc/apt/sources.list


Modificare:

Una versione più completa che consente di convogliare input o reindirizzare da un file e include a -a cambia per disattivare l'aggiunta (che è attiva per impostazione predefinita):

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
}

Puoi anche usare sponge dal moreutils pacchetto e non è necessario reindirizzare l'output (ad esempio, no tee rumore da nascondere):

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

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

Questo ha funzionato per me:comando originale

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

Comando di lavoro

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

Usando sed -i con $ un , puoi aggiungere testo, contenente sia variabili che caratteri speciali, dopo l'ultima riga.

Ad esempio, aggiungendo $NEW_HOST con $NEW_IP a /etc/hosts:

sudo sed -i "\$ a $NEW_IP\t\t$NEW_HOST.domain.local\t$NEW_HOST" /etc/hosts

opzioni sed spiegate:

  • -io per sul posto
  • $ per l'ultima riga
  • UN per aggiungere

Puoi modificare la proprietà del file e poi modificarlo nuovamente dopo l'uso cat >> aggiungere?

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

Qualcosa del genere funziona per te?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top