2013-11-22 5 views
8

Ich habe Bash-Skript, die Datei wie dieseWie setze ich das temporäre Dateiverzeichnis für den sed-Befehl in Linux?

sed -i "/hello world/d" /etc/postfix/virtual 

und ich lief dieses Skript von Web-Anwendung modifiziert. sed-Befehl erstellt eine temporäre Datei in diesem Verzeichnis, aber der Benutzer, unter dem die Webanwendung arbeitet, hat keine Berechtigungen zum Erstellen von Dateien in diesem Verzeichnis. Ich möchte dem Benutzer keine weiteren Berechtigungen für diesen Ordner erteilen. Ist es möglich, den Speicherort der temporären Datei für den Befehl sed anzugeben?

Ich bin neu in Linux so leid, wenn meine Frage zu einfach ist, aber ich habe keine Lösung gefunden.

Danke!

+0

Was ist mit der Umleitung der Datei? 'sed" ... "/etc/.../virtual> new_file' Es sei denn, Sie müssen wirklich an Ort und Stelle ändern. – fedorqui

+0

Ich habe das gleiche Problem: Ich habe mich selbst in die Root-Gruppe und chmoded + x der/etc/hosts-Datei, um in der Lage zu sein, eine Änderung (mit sed -i) darin zu skripten. Haben Sie eine Lösung gefunden? –

Antwort

1

Sie können immer vermeiden Inline-Bearbeitung:

sed "/hello world/d" /etc/postfix/virtual > /tmp/_foo 

# mv /tmp/_foo /etc/postfix/virtual 

Aber lassen Sie mich /etc/postfix/virtual Webnutzer Bearbeitung Vorsicht ist ziemlich riskant.

+3

Aber ich glaube, dass keine Berechtigungen für '/ etc/posstfix' vorhanden sind, dann ist' mv' nicht möglich? – fedorqui

+1

Ah, du hast Recht, dann denke ich, was OP versucht, wird nicht einmal funktionieren. – anubhava

2

Die Datei muss über temporäre Datei geändert werden, das ist tatsächlich, was Sed tat, aber es fehlten die Berechtigungen.

Wenn Sie mit einer solchen Situation zu tun haben, tun wir nur diesen Prozess manuell.

## TEMP File 
TFILE=`mktemp --tmpdir tfile.XXXXX` 
trap "rm -f $TFILE" 0 1 2 3 15 

## 
sed 's_XXX_YYY_' /etc/example > "$TFILE" 
cat "$TFILE" > /etc/example 

## trap Deletes TFILE on Exit 
+2

Das obige funktioniert, weil Sie die Konfigurationsdatei so einstellen können, dass die Bearbeitung möglich ist, während das enthaltene Verzeichnis weiterhin geschützt ist. In meinem Fall habe ich die Gruppen- und Gruppenberechtigungen festgelegt, damit mein persönliches Konto die Datei bearbeiten kann, aber alle anderen Berechtigungen unverändert lassen. Die temporäre Datei befindet sich nicht im Verzeichnis, ist also nicht betroffen und die Konfigurationsdatei ermöglicht es der Katze, zu arbeiten. – EdwinW

1

AFAIK, Sie können sed dafür nicht konfigurieren. Sie müssen also Ihren Befehl mit den erforderlichen Berechtigungen ausführen.

  • erstellen Sie ein Skript namens zum Beispiel update-postfix (es kann Argumente haben), und setzen Sie in/usr/local/bin

    #!/bin/bash 
    sed -i "/$1/d" /etc/postfix/virtual 
    
  • Erstellen Sie eine Datei in/etc/sudoers .d /, ersetzt _USER_ mit den einem Aufruf Skript (was auch immer sein Name, kann es update-postfix oder etwas allgemeinere sein):

    _user_ ALL = (root) NOPASSWD: /usr/local/bin/update-postfix 
    

    es erlaubt _USER_ update-postfix (und ony diesem Befehl) als root

  • in Ihrem Skript aufrufen sudo update-postfix helloworld anstelle des sed Befehl auszuführen. Das Update-Postfix-Skript wird als Root-Benutzer aufgerufen.

NB: Genannt als solches Skript (update-Postfix) hat das Recht, alles zu tun, also seien Sie vorsichtig, was Sie setzen, und sanieren die Argumente (was ich nicht hier der Kürze halber tat) .

0

Einfache benutzerdefinierte temporäre Datei Lösung, ähnlich die Lösung von @techzilla für diejenigen, nicht in die Falle verwenden -

sed "/hello world/d" /etc/postfix/virtual > /tmp/temp_postfix_update && cat /tmp/temp_postfix_update > /etc/postfix/virtual && rm -f /tmp/temp_postfix_update 

Per etwas @EdwinW sagte, den Eingang kochende Katze mit nicht entfernen die Datei, so dass die Schreibberechtigungen für die Datei bestehen bleiben.

Verwandte Themen