staging.inyokaproject.org

sed

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |
Dieses Thema ist die Diskussion des Artikels sed.

barcc

Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

Hallo Wikiteam,

ich würde Baustelle/Verlassen/sed überarbeiten. Bitte in die Baustelle verschieben.

Gruß, barcc

cornix Team-Icon

Avatar von cornix

Anmeldungsdatum:
9. März 2007

Beiträge: 4763

ich würde Baustelle/Verlassen/sed überarbeiten.

👍 Viel Spaß dabei.

Bitte in die Baustelle verschieben.

done

Gruß, cornix

barcc

(Themenstarter)
Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

Gibt es so etwas wie ein "geschütztes Leerzeichen", so dass in der Tabelle innerhalb von -f Skriptdatei nicht umgebrochen wird?

Ich habe den Artikel möglichst knapp gehalten und stattdessen ein paar Links angegeben. Hoffentlich trifft der Satz aus dem ursprünglichen Artikel

Allerdings geht dabei die didaktische Leuchtkraft verlustig

nicht auf meine Version zu.

Ansonsten halte ich den Artikel für fertig.

Gruß, barcc

noisefloor Team-Icon

Ehemaliger
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

habe ein paar Korrekturen / Ergänzungen gemacht.

Gruß, noisefloor

barcc

(Themenstarter)
Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

… und ist quasi in der Linux-Installation (auch Minimalinstallationen) enthalten.

Den Satz verstehe ich nicht.

cornix Team-Icon

Avatar von cornix

Anmeldungsdatum:
9. März 2007

Beiträge: 4763

barcc schrieb:

… und ist quasi in der Linux-Installation (auch Minimalinstallationen) enthalten.

Den Satz verstehe ich nicht.

quasi verstehe ich aber, was gemeint ist 😀

sed findet man als Urgestein unter den Kommandozeilen-Werkzeugen auf (fast?) allen Unix-artigen Betriebssystemen, in der Regel sogar vorinstalliert. Als Standard-Werkzeug der Spezifikation der Linux Standard Base 🇬🇧 steht es in jeder Ubuntu-Variante zur Verfügung.

Die "Kette der Abhängigkeiten" sieht dabei wie folgt aus:

  • ubuntu-minimal

    • util-linux

      • lsb-base

        • sed

Gruß, cornix

barcc

(Themenstarter)
Avatar von barcc

Anmeldungsdatum:
13. Juli 2007

Beiträge: 696

Ok, mit den zwei zusätzlichen Buchstaben von loh.tar versteh ichs auch ☺ .

Von mir aus kann man den Artikel verschieben.

Gruß, barcc

noisefloor Team-Icon

Ehemaliger
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

verschoben: sed

Gruß, noisefloor

wxpte

Avatar von wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1004

Die Option -i habe ich um einen Warnhinweis ergänzt. Leider funktioniert die Sequenz

1
2
chmod u-w y.dat
sed -i 's/Suchmuster/Ersetzungsmuster/' *.dat

nicht wie erwartet, die Datei y.dat wird trotzdem bearbeitet. Nur über den Umweg einer for-Schleife:

1
2
3
4
chmod u-w y.dat
for daten in *.dat; do
    [ -w $daten ] && sed -i 's/Suchmuster/Ersetzungsmuster/' $daten
done

werden schreibgeschützte Dateien ausgespart.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

wxpte schrieb:

Die Option -i habe ich um einen Warnhinweis ergänzt. Leider funktioniert die Sequenz

1
2
chmod u-w y.dat
sed -i 's/Suchmuster/Ersetzungsmuster/' *.dat

nicht wie erwartet, die Datei y.dat wird trotzdem bearbeitet.

Ich wollte es nicht glauben und habe es deshalb nachgestellt. Leider stimmt es und es stimmt sogar, wenn man alle Schreibrechte mit

chmod a-w y.dat 

entfernt. In schockierender Weise erfolgt nicht einmal eine Sicherheitsabfrage.

Der Warnhinweis ist also gerechtfertigt und sollte m.M. sogar als Warnbox formatiert werden.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

Es ist sogar noch schlimmer!

Es funktioniert sogar, wenn einem die schreibgeschützte Datei nicht einmal gehört! Und nach der Änderung gehört einem die vorher fremde Datei.

Das ist jetzt aber kein exotisches Feature mehr, sondern doch wohl ein Bug oder ein Sicherheitsproblem?

noisefloor Team-Icon

Ehemaliger
Avatar von noisefloor

Anmeldungsdatum:
6. Juni 2006

Beiträge: 28316

Hallo,

Es funktioniert sogar, wenn einem die schreibgeschützte Datei nicht einmal gehört! Und nach der Änderung gehört einem die vorher fremde Datei.

Kann ich bestätigen. Es funktioniert allerdings _nicht_, wenn man a) nicht der Eigentümer der Datei ist unb b) man keine Leserechte hat (also z.B. wenn die Datei die Berechtigung 400 hat.

Scheinbar "reicht" es sed -i, wenn man als ausführender Nutzer Leserechte hat.

Gruß, noisefloor

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 10978

Wenn ich das aus dem strace richtig herauslese, spielen die Dateirechte keine Rolle, weil die alte Datei mit einer neu angelegten temporären Datei per rename überschrieben wird - dafür zählen nur die Verzeichnisrechte, nicht die Dateirechte.

$ echo "foo bar" | sudo tee test.txt
$ echo "spam" > .tmpfile
foo bar
$ ls -la
insgesamt 8
drwxr-xr-x  2 demo      demo       80 17. Jun 14:52 .
drwxrwxrwt 12 root      root      240 17. Jun 14:45 ..
-rw-r--r--  1 root      root        8 17. Jun 14:52 test.txt
-rw-r--r--  1 alexander alexander   5 17. Jun 14:52 .tmpfile
$ strace sed -i 's/foo/spam/' test.txt 
execve("/usr/bin/sed", ["sed", "-i", "s/foo/spam/", "test.txt"], 0xbe930c0c /* 22 vars */) = 0
brk(NULL)                               = 0xce8000
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f60000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=87031, ...}) = 0
mmap2(NULL, 87031, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f12000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libacl.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\230\23\0\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=26008, ...}) = 0
mmap2(NULL, 155672, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6eeb000
mmap2(0xb6ef0000, 90136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xb6ef0000
munmap(0xb6eeb000, 20480)               = 0
munmap(0xb6f07000, 40984)               = 0
mprotect(0xb6ef6000, 61440, PROT_NONE)  = 0
mmap2(0xb6f05000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0xb6f05000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0,\334\1\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=1566196, ...}) = 0
mmap2(NULL, 1724520, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6d4a000
mmap2(0xb6d50000, 1658984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xb6d50000
munmap(0xb6d4a000, 24576)               = 0
munmap(0xb6ee6000, 36968)               = 0
mprotect(0xb6ec9000, 65536, PROT_NONE)  = 0
mmap2(0xb6ed9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x179000) = 0xb6ed9000
mmap2(0xb6edc000, 36968, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6edc000
close(3)                                = 0
set_tls(0xb6f61520)                     = 0
set_tid_address(0xb6f61008)             = 1346
set_robust_list(0xb6f61010, 12)         = 0
rseq(0xb6f61500, 0x20, 0, 0xe7f5def3)   = 0
mprotect(0xb6ed9000, 8192, PROT_READ)   = 0
mprotect(0xb6f05000, 4096, PROT_READ)   = 0
mprotect(0x505000, 4096, PROT_READ)     = 0
mprotect(0xb6f62000, 8192, PROT_READ)   = 0
ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
munmap(0xb6f12000, 87031)               = 0
getrandom("\x4c\x78\x15\x2f", 4, GRND_NONBLOCK) = 4
brk(NULL)                               = 0xce8000
brk(0xd09000)                           = 0xd09000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=3735920, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6b50000
mmap2(NULL, 2596864, PROT_READ, MAP_PRIVATE, 3, 0x6f000) = 0xb68d6000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules", O_RDONLY|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=3808, ...}) = 0
read(3, "# GNU libc iconv configuration.\n"..., 4096) = 3808
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.d", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
getdents64(3, 0xceac98 /* 3 entries */, 32768) = 96
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.d/gconv-modules-extra.conf", O_RDONLY|O_CLOEXEC) = 4
statx(4, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=53974, ...}) = 0
read(4, "# GNU libc iconv configuration.\n"..., 4096) = 4096
read(4, "B1002//\tJUS_I.B1.002//\nmodule\tJU"..., 4096) = 4096
read(4, "59-5//\nalias\tISO_8859-5//\t\tISO-8"..., 4096) = 4096
read(4, "59-16//\t\tINTERNAL\t\tISO8859-16\t1\n"..., 4096) = 4096
read(4, "-SE-A\t1\nmodule\tINTERNAL\t\tEBCDIC-"..., 4096) = 4096
read(4, "97\t\t1\n\n#\tfrom\t\t\tto\t\t\tmodule\t\tcos"..., 4096) = 4096
read(4, "1\n\n#\tfrom\t\t\tto\t\t\tmodule\t\tcost\nal"..., 4096) = 4096
read(4, "6//\t\tIBM1046//\nalias\tCP1046//\t\tI"..., 4096) = 4096
read(4, "\tto\t\t\tmodule\t\tcost\nalias\tRUSCII/"..., 4096) = 4096
read(4, "03//\nmodule\tCSN_369103//\t\tINTERN"..., 4096) = 4096
read(4, "\tmodule\t\tcost\nalias\tISO-IR-8-1//"..., 4096) = 4096
read(4, "IBM1156\t\t1\n\n#\tfrom\t\t\tto\t\t\tmodule"..., 4096) = 4096
read(4, "\t\tIBM1166//\nalias\tCP1166//\t\tIBM1"..., 4096) = 4096
read(4, "alias\tROMAN9//\t\tHP-ROMAN9//\nalia"..., 4096) = 726
read(4, "", 4096)                       = 0
close(4)                                = 0
getdents64(3, 0xceac98 /* 0 entries */, 32768) = 0
close(3)                                = 0
futex(0xb6edbd18, FUTEX_WAKE_PRIVATE, 2147483647) = 0
openat(AT_FDCWD, "test.txt", O_RDONLY|O_LARGEFILE) = 3
ioctl(3, TCGETS, 0xbe94d8c8)            = -1 ENOTTY (Unpassender IOCTL (I/O-Control) für das Gerät)
fstat64(3, {st_mode=S_IFREG|0644, st_size=8, ...}) = 0
umask(077)                              = 022
getrandom("\x29\xdf\xa8\x7f\x10\xd2\x42\xcc", 8, GRND_NONBLOCK) = 8
openat(AT_FDCWD, "./sedjig5mR", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0600) = 4
umask(022)                              = 077
fcntl64(4, F_GETFL)                     = 0x20002 (flags O_RDWR|O_LARGEFILE)
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=8, ...}) = 0
read(3, "foo bar\n", 4096)              = 8
statx(4, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0600, stx_size=0, ...}) = 0
read(3, "", 4096)                       = 0
fchown32(4, 0, 0)                       = -1 EPERM (Die Operation ist nicht erlaubt)
fchown32(4, -1, 0)                      = -1 EPERM (Die Operation ist nicht erlaubt)
fgetxattr(3, "system.posix_acl_access", 0xbe94d7d0, 132) = -1 ENODATA (Keine Daten verfügbar)
fstat64(3, {st_mode=S_IFREG|0644, st_size=8, ...}) = 0
fsetxattr(4, "system.posix_acl_access", "\2\0\0\0\1\0\6\0\377\377\377\377\4\0\4\0\377\377\377\377 \0\4\0\377\377\377\377", 28, 0) = 0
close(3)                                = 0
write(4, "spam bar\n", 9)               = 9
close(4)                                = 0
rename("./sedjig5mR", "test.txt")       = 0
close(1)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++ 

Wenn die Datei für den Nutzer nicht lesbar ist, schlägt das Lesen der Datei fehl und damit kommt sed erst gar nicht soweit, dass es eine Temporäre Datei anlegt, die später umbenannt werden kann:

$ rm test.txt
$ echo "foo bar" > test.txt
$ sudo chown root:root test.txt 
$ sudo chmod 0600 test.txt
$ strace sed -i 's/foo/spam/' test.txt 
execve("/usr/bin/sed", ["sed", "-i", "s/foo/spam/", "test.txt"], 0xbefc5c0c /* 22 vars */) = 0
brk(NULL)                               = 0x2406000
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6fd9000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=87031, ...}) = 0
mmap2(NULL, 87031, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6f8b000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libacl.so.1", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\230\23\0\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=26008, ...}) = 0
mmap2(NULL, 155672, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f64000
mmap2(0xb6f70000, 90136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xb6f70000
munmap(0xb6f64000, 49152)               = 0
munmap(0xb6f87000, 12312)               = 0
mprotect(0xb6f76000, 61440, PROT_NONE)  = 0
mmap2(0xb6f85000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0xb6f85000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0,\334\1\0004\0\0\0"..., 512) = 512
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0755, stx_size=1566196, ...}) = 0
mmap2(NULL, 1724520, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6dca000
mmap2(0xb6dd0000, 1658984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xb6dd0000
munmap(0xb6dca000, 24576)               = 0
munmap(0xb6f66000, 36968)               = 0
mprotect(0xb6f49000, 65536, PROT_NONE)  = 0
mmap2(0xb6f59000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x179000) = 0xb6f59000
mmap2(0xb6f5c000, 36968, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6f5c000
close(3)                                = 0
set_tls(0xb6fda520)                     = 0
set_tid_address(0xb6fda008)             = 1390
set_robust_list(0xb6fda010, 12)         = 0
rseq(0xb6fda500, 0x20, 0, 0xe7f5def3)   = 0
mprotect(0xb6f59000, 8192, PROT_READ)   = 0
mprotect(0xb6f85000, 4096, PROT_READ)   = 0
mprotect(0x4d5000, 4096, PROT_READ)     = 0
mprotect(0xb6fdb000, 8192, PROT_READ)   = 0
ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
munmap(0xb6f8b000, 87031)               = 0
getrandom("\x93\xaa\x07\x46", 4, GRND_NONBLOCK) = 4
brk(NULL)                               = 0x2406000
brk(0x2427000)                          = 0x2427000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=3735920, ...}) = 0
mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6bd0000
mmap2(NULL, 2596864, PROT_READ, MAP_PRIVATE, 3, 0x6f000) = 0xb6956000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules", O_RDONLY|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=3808, ...}) = 0
read(3, "# GNU libc iconv configuration.\n"..., 4096) = 3808
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.d", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_CLOEXEC|O_DIRECTORY) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFDIR|0755, stx_size=4096, ...}) = 0
getdents64(3, 0x2408c98 /* 3 entries */, 32768) = 96
openat(AT_FDCWD, "/usr/lib/gconv/gconv-modules.d/gconv-modules-extra.conf", O_RDONLY|O_CLOEXEC) = 4
statx(4, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=53974, ...}) = 0
read(4, "# GNU libc iconv configuration.\n"..., 4096) = 4096
read(4, "B1002//\tJUS_I.B1.002//\nmodule\tJU"..., 4096) = 4096
read(4, "59-5//\nalias\tISO_8859-5//\t\tISO-8"..., 4096) = 4096
read(4, "59-16//\t\tINTERNAL\t\tISO8859-16\t1\n"..., 4096) = 4096
read(4, "-SE-A\t1\nmodule\tINTERNAL\t\tEBCDIC-"..., 4096) = 4096
read(4, "97\t\t1\n\n#\tfrom\t\t\tto\t\t\tmodule\t\tcos"..., 4096) = 4096
read(4, "1\n\n#\tfrom\t\t\tto\t\t\tmodule\t\tcost\nal"..., 4096) = 4096
read(4, "6//\t\tIBM1046//\nalias\tCP1046//\t\tI"..., 4096) = 4096
read(4, "\tto\t\t\tmodule\t\tcost\nalias\tRUSCII/"..., 4096) = 4096
read(4, "03//\nmodule\tCSN_369103//\t\tINTERN"..., 4096) = 4096
read(4, "\tmodule\t\tcost\nalias\tISO-IR-8-1//"..., 4096) = 4096
read(4, "IBM1156\t\t1\n\n#\tfrom\t\t\tto\t\t\tmodule"..., 4096) = 4096
read(4, "\t\tIBM1166//\nalias\tCP1166//\t\tIBM1"..., 4096) = 4096
read(4, "alias\tROMAN9//\t\tHP-ROMAN9//\nalia"..., 4096) = 726
read(4, "", 4096)                       = 0
close(4)                                = 0
getdents64(3, 0x2408c98 /* 0 entries */, 32768) = 0
close(3)                                = 0
futex(0xb6f5bd18, FUTEX_WAKE_PRIVATE, 2147483647) = 0
openat(AT_FDCWD, "test.txt", O_RDONLY|O_LARGEFILE) = -1 EACCES (Keine Berechtigung)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=2998, ...}) = 0
read(3, "# Locale name alias data base.\n#"..., 4096) = 2998
read(3, "", 4096)                       = 0
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/de_DE.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de_DE/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de/LC_MESSAGES/libc.mo", O_RDONLY) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=150826, ...}) = 0
mmap2(NULL, 150826, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6931000
close(3)                                = 0
openat(AT_FDCWD, "/usr/share/locale/de_DE.utf8/LC_MESSAGES/sed.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de_DE/LC_MESSAGES/sed.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de.utf8/LC_MESSAGES/sed.mo", O_RDONLY) = -1 ENOENT (Datei oder Verzeichnis nicht gefunden)
openat(AT_FDCWD, "/usr/share/locale/de/LC_MESSAGES/sed.mo", O_RDONLY) = 3
statx(3, "", AT_STATX_SYNC_AS_STAT|AT_NO_AUTOMOUNT|AT_EMPTY_PATH, STATX_BASIC_STATS, {stx_mask=STATX_BASIC_STATS|STATX_MNT_ID, stx_attributes=0, stx_mode=S_IFREG|0644, stx_size=16373, ...}) = 0
mmap2(NULL, 16373, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6fd5000
close(3)                                = 0
write(2, "sed: test.txt kann nicht gelesen"..., 60sed: test.txt kann nicht gelesen werden: Keine Berechtigung
) = 60
close(1)                                = 0
exit_group(2)                           = ?
+++ exited with 2 +++ 

Aus dem selben Grund kann man Dateien, für die man keine Rechte hat auch mit mv oder rm (die warnen lediglich, wenn man nicht den Schalter -f nutzt) manipulieren, solange man Schreib- und Ausführungsberechtigungen für das Verzeichnis hat:

$ rm test.txt
$ echo "foo bar" | sudo tee test.txt
$ echo "spam" > .tmpfile
foo bar
$ ls -la
insgesamt 8
drwxr-xr-x  2 demo      demo       80 17. Jun 14:52 .
drwxrwxrwt 12 root      root      240 17. Jun 14:45 ..
-rw-r--r--  1 root      root        8 17. Jun 14:52 test.txt
-rw-r--r--  1 demo      demo   5 17. Jun 14:52 .tmpfile
$ mv .tmpfile test.txt 
mv: Überschreiben von 'test.txt', über Modus 0644 (rw-r--r--) hinwegsetzen? y
$ ls -la
insgesamt 4
drwxr-xr-x  2 demo      demo       60 17. Jun 14:52 .
drwxrwxrwt 12 root      root      240 17. Jun 14:45 ..
-rw-r--r--  1 demo      demo        5 17. Jun 14:52 test.txt 

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 7816

seahawk1986 schrieb:

[…] die alte Datei mit einer neu angelegten temporären Datei per rename überschrieben wird - dafür zählen nur die Verzeichnisrechte, nicht die Dateirechte.

Das erklärt wenigstens, wieso es so funktioniert. Und nebenbei auch, dass die Option -i bzw. --in-place von sed eine Mogelpackung mit (aus meiner Sicht sehr unerwünschten) Nebeneffekten ist.

wxpte

Avatar von wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1004

kB schrieb:

... und sollte m.M. sogar als Warnbox formatiert werden.

Diese Anregung habe ich jetzt aufgegriffen.

Antworten |