Die Ausgabe von Cat-Befehlen variiert ungewöhnlich in Bezug auf das Zeichen *

620
Richard Martinez

Ich führe den folgenden Befehl auf einer ziemlich standardmäßigen Ubuntu 11.04-Installation aus, die unter vSphere ausgeführt wird:

sudo cat /home/*/.ssh/authorized_keys 

Grundsätzlich verwende ich Marionette für die ssh-Schlüsselverwaltung und wollte sicherstellen, dass die Schlüssel vorhanden waren. Unüblich bei diesem einfachen Befehl ist, dass die Tasten nur für zwei Benutzer angezeigt werden (der erste und der dritte Benutzer, die für den Benutzer erstellt wurden, wenn dies relevant ist), wenn das * etwas von 7 oder 8 Benutzern fängt.

Der faszinierende Teil ist das, wenn ich renne

sudo cat /home/user.name/.ssh/authorized_keys 

wobei user.name der Name eines zufälligen Benutzers ist (nicht einer der beiden, die bereits angezeigt werden), bekomme ich nicht nur die korrekte Ausgabe von cat, sondern auch beim nächsten Ausführen

sudo cat /home/*/.ssh/authorized_keys 

Die Ausgabe zeigt 3 Schlüsseldateien! Zwei Dateien für die beiden zuvor angezeigten Benutzer und eine dritte Datei, bei der es sich um den Benutzer handelt, dessen Schlüsseldatei ich gerade manuell betrachtet habe.

Ich kann dieses "Spiel" weiter spielen, und jedes Mal, wenn ich einen Benutzer manuell spezifiziere und dann den Befehl * ausführt, wird der zuvor angezeigte Benutzer in der Globbed-Ausgabe angezeigt. Für mich ist dies ein ungewöhnliches Verhalten, insbesondere für ein Ubuntu-Image mit Moorstandard. Fehlt mir etwas? Besondere Eigenschaften von * Expansion oder Katze?

Edit: Ich habe vergessen zu erwähnen, dass dieses Verhalten "zurückgesetzt" wird, wenn ich die SSH-Sitzung dem Server überlasse. Damit meine ich, dass ich mich über SSH abmelden und wieder einloggen kann, und ich bin wieder bei den Startbedingungen (nur zwei Benutzerkonten werden mit * angezeigt).

2

2 Antworten auf die Frage

3
lornix

Denken Sie daran, dass die Befehlszeile analysiert und Platzhalter ersetzt werden, BEVOR sie ausgeführt wird.

Wenn Sie den Benutzernamen angeben, kann der Befehl sudo ... die Datei sehen, da sie als root darauf zugreift.

Wenn Sie '*' eingeben, erweitert Ihre USER-Shell die Pfade auf die Pfade, die sie sehen kann, naja ... die Pfade, die es Ihrem aktuellen Benutzer ermöglichen, die Unterverzeichnisse zu durchsuchen.

Sie können versuchen, die Pfadzeichenfolge in SINGLE-Anführungszeichen einzuschließen, um eine Erweiterung zu verhindern. Ich bin nicht sicher, ob dies funktionieren wird, da die meisten Unix-Programme erwarten, dass die Shell Platzhalter erweitert und die Globbing-Aktion nicht selbst ausführt.

BEARBEITEN: Ein Gedanke, wie Sie Ihr Ziel erreichen, die Dateien mit den autorisierten Schlüsseln für alle Benutzer zu lesen:

sudo find /home -name "authorized_keys" -exec cat "{}" \; > all_the_data 

Vielleicht grob, aber es wird funktionieren, da Sie die Dateisuche als root ausführen, nicht als Benutzer.

Ich vermute einen anderen Weg:

sudo 'find /home -name "authorized_keys" -print0 | xargs -0 cat' > all_the_data 

Das ist schöner bei dem Prozess, da es alle Dateinamen ansammelt und dann 'Katzen' ... aber ich mag den ersten, kein spezielles Anführungszeichen erforderlich.

Die Anführungszeichen (einzeln oder auf andere Weise) um den gesamten Befehl sind aufgrund des Pipe-Befehls erforderlich. Sowohl der Befehl find als auch der Befehl xargs MÜSSEN als root ausgeführt werden. Ja, komplizierter als der erste.

Ihre Erklärung für den Grund für das seltsame Globbing-Verhalten ist brillant, +1, aber ich bin nicht ganz überzeugt. Warum hat der Befehl sudo cat / home / user.name / .ssh / authorised_keys den dauerhaften Nebeneffekt, die Ausgabe nachfolgender Befehle zu beeinflussen, die den glob enthalten, wenn der Befehl glob den Befehl nicht erkennen kann Inhalt vor dieser direkten Katze? Liegt es daran, dass die Shell die darin gespeicherten Dateien zwischenspeichert? Horn OK Please vor 11 Jahren 0
Okay, die 1. Lösung liegt in meinem Wissen von find. Und ich wollte Sie gerade fragen, warum der eine Benutzer _would_ auftauchen würde (mit *), während andere dies nicht tun würden, aber ich habe gerade festgestellt, dass der ssh-Ordner für diesen Benutzer 755 ist, im Gegensatz zu den anderen, die 700 sind. Richard Martinez vor 11 Jahren 1
Add .: Es scheint mir merkwürdig, dass `check 'einige Dateien, die nur root sehen kann;` gefolgt von `files', die mein Benutzer sehen kann, dazu führt, dass der letztgenannte Befehl die Verzeichnisstruktur aufgrund des Befehls" kennt " früherer Befehl, der dieses Verzeichnis erfolgreich angibt. ** Insbesondere **, da bei der "direkten" (nicht Globbed-Methode) keine Shell-Erweiterung in irgendeiner Weise involviert ist, so dass die ** Shell ** dieses Verzeichnis nicht findet. der `cat`-Befehl ist! In einer Sudo-Instanz dazu !!! Horn OK Please vor 11 Jahren 0
Ich kann den dauerhaften Nebeneffekt nicht erklären, obwohl er sich beim Abmelden "zurücksetzt", was mit dem Sudo-Fenster zusammenhängt. In diesem Zeitraum können Sie mit sudo Dinge erledigen, bevor die Berechtigungen erneut ausgehen. Normalerweise 5 Minuten oder 15 Minuten nach dem LETZTEN gültigen Sudo, das Sie ausgeführt haben. lornix vor 11 Jahren 0
Basierend auf Richards Erklärung der Berechtigungen verstehe ich jetzt, warum der Heisenbug nur von einigen Benutzern angezeigt wird. Dies löst das Rätsel, sodass wir uns nicht fragen müssen, ob bash die Systemaufrufe `fstat () 'seiner untergeordneten Prozesse untersucht, um mehr über Verzeichnisse zu erfahren, die ihm bekannt sind. o_O Horn OK Please vor 11 Jahren 0
Genau. Meine Antwort beinhaltete Genehmigungen, ich habe den langen Weg nur um den heißen Brei geschlagen ... Danke für die Hilfe @allquixotic lornix vor 11 Jahren 1
Hilfe?!?! Ich habe etwas gelernt! Das ist das Beste daran, an dieser Diskussion teilzunehmen! :) Danke dir! Horn OK Please vor 11 Jahren 0
Okay, die Berechtigungsfrage erklärte, warum ich immer einen zusätzlichen Benutzer bekomme. Ich habe gerade den Befehl * mit einem sudo -K getestet (um den Zeitstempel zurückzusetzen) und das ist in der Tat die Lösung für den zweiten Teil. Der "dauerhafte" Nebeneffekt ist auf das Sudo-Zeitfenster zurückzuführen. Interessante Infos, danke für die Hilfe! Richard Martinez vor 11 Jahren 0
0
Horn OK Please

Ich habe keine direkte Erklärung dafür, warum das Globbing das tut, was es tut, aber ich weiß, wie Sie Ihr Skript umschreiben können, um das zu erreichen, was Sie wollen:

für i in / home / *; tun wenn [-d "/ home / $ "]]; dann sudo cat "/home/$/.ssh/authorized_keys"; fi; erledigt

Ich kenne keine Funktion von bash, die dazu führen könnte, dass sie je nach den zuvor ausgeführten Befehlen unterschiedlich gliedert. Es kann sich also entweder um einen Fehler oder um eine wirklich tief verborgene (undokumentierte) Funktion handeln. Ich verwende NIEMALS Globs für Verzeichnisse. Ich verwende immer entweder den find-Befehl für eine for-Schleife. Ich vertraue nicht darauf, dass Globs mit jedem Muster das Richtige tun /*/.