Nach dem Upgrade auf eine neue Release-Version werden in meinen bash
Skripten Fehler angezeigt:
bash: /dev/stderr: Permission denied
In früheren Versionen hat Bash diese Dateinamen intern erkannt (daher ist diese Frage kein Duplikat von dieser ist ) und das Richtige getan (tm) , dies hat jedoch jetzt aufgehört zu funktionieren. Was kann ich tun, um meine Skripte wieder erfolgreich ausführen zu können?
Ich habe versucht, den Benutzer, der das Skript tty
ausführt , zur Gruppe hinzuzufügen , aber dies macht keinen Unterschied (auch nach dem Abmelden und erneuten Anmelden).
Ich kann dies problemlos auf der Kommandozeile reproduzieren:
$ echo test > /dev/stdout
bash: /dev/stdout: Permission denied
$ echo test > /dev/stderr
bash: /dev/stderr: Permission denied
$ ls -l /dev/stdout /dev/stderr
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 May 13 02:04 /dev/stdout -> /proc/self/fd/1
$ ls -lL /dev/stdout /dev/stderr
crw--w---- 1 username tty 136, 1 May 13 05:01 /dev/stderr
crw--w---- 1 username tty 136, 1 May 13 05:01 /dev/stdout
$ echo $BASH_VERSION
4.2.24(1)-release
Auf einem älteren System (Ubuntu 10.04):
$ echo $BASH_VERSION
4.1.5(1)-release
bash
permissions
stdout
0xC0000022L
quelle
quelle
ls -l /dev/stdout /dev/stderr
undls -lL /dev/stdout /dev/stderr
?sudo su username2 -
...echo $BASH_VERSION
Antworten:
Ich denke nicht, dass dies eine rein heftige Angelegenheit ist.
In einem Kommentar sagten Sie, dass Sie diesen Fehler danach gesehen haben
wenn Sie angemeldet sind als
username
. Es ist dassu
, was das Problem auslöst./dev/stdout
ist ein Symlink zu/proc/self/fd/1
, der zum Beispiel ein Symlink zu ist/dev/pts/1
./dev/pts/1
, das ein Pseudoterminal ist, im Besitz von und beschreibbar vonusername
; Dieses Eigentumsrecht wurde gewährt, als Sieusername
angemeldet waren. Wenn Siesudo su username2
das Eigentumsrecht von/dev/pts/1
nicht ändern, undusername2
keine Schreibberechtigung.Ich würde argumentieren, dass dies ein Fehler ist.
/dev/stdout
sollte eigentlich ein Alias für den Standardausgabestream sein, aber hier sehen wir eine Situation, in derecho hello
funktioniert, aberecho hello > /dev/stdout
fehlschlägt.Ein Workaround wäre,
username2
ein Mitglied der Gruppe zu machentty
, aber das würde dieusername2
Erlaubnis geben , an jede beliebige Zahl zu schreiben , was wahrscheinlich unerwünscht ist.Eine andere Problemumgehung besteht darin, sich beim
username2
Konto anzumelden, anstatt es zu verwendensu
, sodass/dev/stdout
auf ein neu zugewiesenes Pseudoterminal von verwiesen wirdusername2
. Dies ist möglicherweise nicht praktikabel.Eine andere Problemumgehung wäre, Ihre Skripte so zu ändern, dass sie nicht auf
/dev/stdout
und verweisen/dev/stderr
. Ersetzen Sie zum Beispiel Folgendes:dadurch:
Ich sehe dies auf meinem eigenen System, Ubuntu 12.04, mit Bash 4.2.24 - obwohl das Bash-Dokument (
info bash
) auf meinem System das besagt/dev/stdout
und/dev/stderr
speziell behandelt wird, wenn es in Umleitungen verwendet wird. Aber auch wenn bash diese Namen nicht speziell behandelt, sollten sie dennoch als Entsprechung für die Standard-E / A-Streams fungieren. (POSIX erwähnt dies nicht/dev/std{in,out,err}
, daher kann es schwierig sein zu argumentieren, dass dies ein Fehler ist.)Betrachtet man alte Versionen von Bash, so impliziert die Dokumentation, dass
/dev/stdout
ua speziell behandelt wird, ob die Dateien existieren oder nicht. Die Funktion wurde in Bash 2.04 eingeführt, und in derNEWS
Datei für diese Version heißt es:Wenn Sie jedoch den Quellcode untersuchen (
redir.c
), werden Sie feststellen , dass diese spezielle Behandlung nur aktiviert ist , wenn das SymbolHAVE_DEV_STDIN
definiert ist (dies wird bestimmt, wenn die Bash aus dem Quellcode erstellt wird).Soweit ich das beurteilen kann, hat keine veröffentlichte Version von bash die besondere Behandlung von gemacht
/dev/stdout
et al an Bedingungen geknüpft - es sei denn, eine Distribution hat sie gepatcht.Eine andere Problemumgehung (die ich nicht ausprobiert habe) wäre, die Bash-Quellen zu greifen und sie zu modifizieren, um sie
redir.c
zu etwas Besonderem zu machen/dev/*
Behandlung zu verhindern, und Ihre neu erstellte Version zu verwenden, anstatt diejenige, die mit Ihrem System geliefert wurde. Dies ist jedoch wahrscheinlich übertrieben.ZUSAMMENFASSUNG :
Ihr Betriebssystem behandelt wie meins die Eigentumsrechte und Berechtigungen von
/dev/stdout
und nicht/dev/stderr
richtig. Bash behandelt diese Namen angeblich speziell in Umleitungen, aber tatsächlich nur, wenn die Dateien nicht existieren. Das wäre egal, wenn/dev/stdout
und/dev/stderr
richtig funktioniert. Dieses Problem tritt nur auf, wenn Sie einsu
anderes Konto haben oder etwas Ähnliches tun. Wenn Sie sich einfach bei einem Konto anmelden, sind die Berechtigungen korrekt.quelle
pam_ck_connector.so
./proc/self/fd/1
die Berechtigungen aktualisiert, aber das ist sinnlos, da es sich um einen Symlink handelt. Passiert auch auf Fedora, was ConsoleKit anscheinend ausschließt.Eigentlich liegt das daran, dass udev die Berechtigungen auf tty-Geräten spezifisch auf 0620 setzt und su weder den Besitz noch die Berechtigungen ändert, noch sollte es dies tun. Meiner Ansicht nach befinden wir uns in einer Situation, in der / dev / std * nicht portierbar ist.
Die einfache Lösung besteht darin, "mesg y" in / etc / profile (oder in ein beliebiges oberstes Profil, das Sie verwenden möchten) einzufügen, da dies die Berechtigungen Ihres tty-Geräts in 0622 ändert. Das gefällt mir nicht wirklich, aber es ist wahrscheinlich besser als die udev Regeln zu ändern.
quelle
Als langjähriger Linux-Benutzer habe ich kürzlich ein neues Ubuntu 64-Bit 12.04 LTS-System eingerichtet und war verblüfft, warum meine Bash-Skripte nicht funktionierten - Berechtigung verweigert - und fand anschließend diesen Thread. Ich dachte, das Problem könnte an etwas im neuen Betriebssystem liegen.
Am Ende stellte sich heraus, dass ich dummerweise ein UI-Tool verwendet hatte, um Berechtigungen für mein
/home
Verzeichnis festzulegen , und das Problem war mit dem Laufwerk verbunden. Um sicherzugehen, habe ich eintemp
Verzeichnis erstellt/opt
und festgestellt, dass meine Skripte von dort aus problemlos ausgeführt werden können. Einmal habe ich das behoben/home
Laufwerksberechtigungen repariert hatte, war alles wieder normal.Ein kleines Rätsel gelöst. Seufzer
quelle
Dies ist eine alte Frage, aber ich denke immer noch sehr relevant, daher habe ich hier eine Lösung gefunden, die hier nicht erwähnt wird.
Ich bin auf diese Frage gestoßen, da ich in Bash auch Probleme mit einem Befehl zum Ausführen eines "su" -geschalteten Kontos gesehen habe:
Da ich nur versuche, stdout nach stderr umzuleiten, wird das Gleiche erreicht, und dies funktioniert auch bei einem "su" -geschalteten Konto:
quelle