Kann jemand erklären, warum sudo ls mit einem Platzhalter nicht funktioniert?


16
$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/access*
ls: cannot access /sites/servers/server_instance/logs/access*: No such file or directory

$ sudo -iu abc ls -ltr /sites/servers/server_instance/logs/
total 594812
-rwxrwxrwx 1 abc abc      45 Mar 21 12:42 old.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 12:45 console.log
-rwxrwxrwx 1 abc abc      304537970 Mar 24 13:20 access_nginx.log

Kann jemand erklären, warum dies passiert? Aus diesem Grund bin ich an ein Drehbuch gebunden.

Antworten:


29

Eine Möglichkeit besteht darin, dass Sie nicht berechtigt sind, auf eines oder mehrere der Verzeichnisse in diesem Pfad zuzugreifen ( /sites/servers/server_instance/logs). Die Platzhaltererweiterung wird von Ihrer Shell ausgeführt, und die erweiterten Pfade werden an den sudoBefehl übergeben.

Wenn Ihr Benutzer keine Berechtigungen hat, funktioniert die Erweiterung im ersten Befehl nicht. Es wird so ausgeführt, wie es ist ( ls -ltr /sites/servers/server_instance/logs/access*) und es gibt keine Datei mit dem wörtlichen Namen access*). Wenn Sie abcdie erforderlichen Berechtigungen für alle Verzeichnisse im Pfad haben, wird der zweite Befehl, der keine Platzhalter enthält, von Ihrer Shell nicht berührt und funktioniert einwandfrei.

$ sudo namei -lx foo/bar/baz
f: foo/bar/baz
drwxr-xr-x muru    muru    foo
drwx------ test    test    bar
drwxr-xr-x muru    muru    baz

$ sudo ls foo/bar/b*
ls: cannot access 'foo/bar/b*': No such file or directory

$ sudo -u test ls foo/bar/
baz

danke Muru, deine Meinung war richtig, ich habe die Erlaubnis auf 755 geändert und jetzt funktioniert es einwandfrei.
Faisal

3
@Faisal: Ich würde denken, dass das Ändern von Berechtigungen nicht das richtige Mittel ist, obwohl es zeigt, dass die Diagnose korrekt ist. Die richtige Abhilfe scheint darin zu bestehen, während der Vorbereitung des Befehls sudo kein Globbing durchzuführen, sondern es hier zu unterdrücken (indem das Argument path angegeben wird) und das Argument so wie es ist an den lsBefehl zu übergeben, der es dann kann (wenn sich die Identität geändert suhat) effekt) mach das globbing.
Marc van Leeuwen

2
@MarcvanLeeuwen lsmacht keine Globbing.
muru

3
Sie können das Globbing in der sudo-Umgebung aktivieren, indem Sie sh -ces zur Befehlszeile hinzufügen .
Stig Hemmer

@ Faisal, wenn das Ihre Frage beantwortet, erwägen Sie, es zu akzeptieren ...
Clem Steredenn

7

Möglicherweise ist das Globbing deaktiviert.

Suchen Sie nach etwas wie set -foder set -o noglobvor diesen Zeilen im Skript oder wenn in einer interaktiven Shell ausgeführt echo $-; Wenn fdie Ausgabe ein enthält, ist das Globbing deaktiviert:

$ echo $-
fhimBH

Um dies zu beheben, entfernen set -foder set -o noglobaus dem Skript, oder wenn in einer interaktiven Shell laufen set +foder set +o noglob:

$ set -f
$ echo $-
fhimBH
$ ls access*
ls: cannot access access*: No such file or directory
$ set +f
$ echo $-
himBH
$ ls access*
access

Ja, ich als mein einzelner Benutzer habe keinen Zugriff auf diesen Pfad. Im Skript gehe ich als mein Benutzer (über ssh) und starte diesen Befehl über den Produktionsbenutzer. Gibt es dafür eine Abhilfe? (Ein Punkt zu beachten ist, ich muss kein Passwort für den Benutzerwechsel geben)
Faisal

@Faisal Wie wäre es mit dem Ausführen des Skripts als Zielbenutzer ( sudo -u abc /path/to/script)? In diesem Fall sollte das Globbing nicht scheitern. Auf jeden Fall schlug muru das Pfadproblem in seiner Antwort vor, nicht ich. Sie sollten erwägen, seine Antwort zu akzeptieren ( askubuntu.com/help/accepted-answer ).
Kos

Tatsächlich starte ich das auf der entfernten Maschine über ein Skript, so dass -i benötigt würde. Vielen Dank auch für die Beantwortung.
Faisal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.