ubuntuusers.de

Variablen für Benutzernamen: The good, the bad and the ugly

Status: Ungelöst | Ubuntu-Version: Ubuntu 20.04 (Focal Fossa)
Antworten |

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9717

Wohnort: Münster

Ich finde in der Programmumgebung mehrere Variablen für den Benutzernamen:

$ printenv | grep $USER
USERNAME=tester
USER=tester
PWD=/home/tester
HOME=/home/tester
LOGNAME=tester

Ich vermute mal, dass die Variablen USERNAME, USER und LOGNAME nicht immer so wie hier gleich lauten.

Wann verwende ich also welche Variable?

Hintergrund: Ich benötige für ein Skript den Benutzernamen zur Anmeldung an einer Netzwerk-Ressource und bin mir unsicher, welche der drei in Frage kommenden Variablen ich dafür am sinnvollsten verwende.

dingsbums

Anmeldungsdatum:
13. November 2010

Beiträge: 3790

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

kB schrieb:

Ich finde in der Programmumgebung mehrere Variablen für den Benutzernamen:

$ printenv | grep $USER
USERNAME=tester
USER=tester
PWD=/home/tester
HOME=/home/tester
LOGNAME=tester

PWD ändert sich sobald Du das Verzeichnis wechselst - ist also nur zufällig das gleiche wie HOME. HOME bezeichnen nicht den Nutzernamen, sondern den Pfad seines Homeverzeichnisses. Der letzte Teil ist normalerweise gleich dem Nutzernamen, aber das ist nicht garantiert! Diese beiden Variablen fallen also auf jeden Fall aus.

Ich vermute mal, dass die Variablen USERNAME, USER und LOGNAME nicht immer so wie hier gleich lauten.

Genau. LOGNAME wird zwar von login auf den selben Wert wie USER gesetzt, aber sudo auch anders (siehe Manpage). Weitere Infos z.B. hier.

Wann verwende ich also welche Variable?

Hintergrund: Ich benötige für ein Skript den Benutzernamen zur Anmeldung an einer Netzwerk-Ressource und bin mir unsicher, welche der drei in Frage kommenden Variablen ich dafür am sinnvollsten verwende.

Im Allgemeinen sollte man USER verwenden. Das wird zwar nicht bei POSIX definiert aber immerhin unter 8.1 Environment Variable Definition als eine der Variablen benannt, die man nicht setzen sollte, weil sie von häufigen Kommandointerpretern genutzt werden.

Wenn Du ein bisschen paranoid bist, kannst Du dies tun, um ganz sicher zu sein:

1
export USER=$(id -un)

(Oder Du speicherst den Wert in einer anderen Variable.) Damit ist garantiert, dass USER den korrekten Wert beinhaltet, denn man kann USER willkürlich überschreiben im Gegensatz zu PWD z.B., das die Shell immer auf das aktuelle Verzeichnis setzt:

1
2
3
4
5
6
7
$ USER=xyz bash -c 'echo $USER'
xyz
$ USER=xyz sh -c 'echo $USER'
xyz
$ pwd; PWD=xyz sh -c 'echo $PWD'
/tmp
/tmp

kB Team-Icon

Supporter, Wikiteam
(Themenstarter)
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9717

Wohnort: Münster

Vielen Dank für die Antworten. Ich glaube aber, mein Anliegen ist nicht richtig verstanden worden. (Vgl. meine Ausführungen zum Hintergrund.)

Es geht mir nicht um eine Abfrage des Benutzers, der das Skript ausführt, sondern um den Benutzernamen, welches das Skript zur Anmeldung am entfernten Rechner verwenden soll.

Ich kann natürlich einen eigenen Variablennamen erfinden, z.B. use_remote_username=rapunzel. Aber meine Hoffnung war, dass USER, USERNAME oder LOGNAME oder eine andere "well-known-variable" bereits die von mir benötigte Semantik/Pragmatik besitzen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

kB schrieb:

Vielen Dank für die Antworten. Ich glaube aber, mein Anliegen ist nicht richtig verstanden worden. (Vgl. meine Ausführungen zum Hintergrund.)

Du hast gefragt, wann Du welche Variable nutzen sollst und Du hast Erläuterungen erhalten, welche Variable etwas über den aktuellen Benutzer aussagt, weil das das einzig Sinnvolle ist, das man aus einer Umgebungsvariablen aus dem lokalen System bekommen kann.

Es geht mir nicht um eine Abfrage des Benutzers, der das Skript ausführt, sondern um den Benutzernamen, welches das Skript zur Anmeldung am entfernten Rechner verwenden soll.

Ich kann natürlich einen eigenen Variablennamen erfinden, z.B. use_remote_username=rapunzel. Aber meine Hoffnung war, dass USER, USERNAME oder LOGNAME oder eine andere "well-known-variable" bereits die von mir benötigte Semantik/Pragmatik besitzen.

Überlege mal einen Moment: woher soll Dein lokales System wissen, an welchem System und mit welchen Zugangsdaten Du Dich anmelden willst, wenn Du es selbst nicht explizit angegeben hast? Alle Variablen, die Du genannt hast, werden doch von der Shell oder einem Elternprozess automatisch gesetzt. Und diese sind zum Lesen gedacht und man überschreibt sie tunlichst nicht mit etwas, das andere Semantik hat, weil sonst Informationen verloren gehen oder Verwirrung gestiftet wird. Du könntest z.B. nicht mehr Loggen, welcher lokale Benutzer sich mit welchem Remote-Nutzer an einem anderen System angemeldet hat (abgesehen von dem "Trick" mit id). Also setzt man dafür eine andere Variable.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Falls du zur Anmeldung SSH nutzt, könntest du die ~/.ssh/config nutzen.

Host freierName
HostName mein.ziel-server.tld
Port 12345  # falls abweichend von 22
User zielname  # Benutzername auf dem entfernten System
IdentityFile $HOME/.ssh/ssh_keyfile  # ssh-schlüssel, wenn vorhanden

Dann kannst du per shh zielname@freierName eine Verbindung aufbauen, unabhängig vom lokalen Nutzernamen.

Das ganze gilt natürlich auch für sshfs&Co.

Antworten |