Unterschiedlicher Prompt in ksh für User und Root

nihonto

Well-Known Member
Bonjour!

Ich würde gerne für User und Root unterschiedliche Prompts für die ksh einrichten. Am besten so wie in der bash, wo der User durch ein "$" im Prompt gekennzeichnet ist und der Root durch ein "#".

Kenne das so von Debian, wo es automatisch so eingerichtet wird. Kann man das so auch unter NetBSD einrichten?
 
sieh mal nach, was dir "echo $PS1" sagt. ich hab das bei mir jeweils ein wenig angepasst und das in die ~/.profile geschrieben. wenn du bei root ein "#" reinschreibst und bei den anderen usern entsprechend das "$", dann sollte das gehen. bei mir sieht das für root so aus:
Code:
export PS1="\u@\h\n\w # "

hth,
marc

ps: das ist unter openbsd, aber die shell sollte da ähnlich funktionieren
 
Hey, vielen Dank für den Tipp! Aber trage ich das dann in die ".profile" von root ein? Oder macht man das anders?
 
ja. in den .profiles der user eben ein $ setzen, falls das nicht der fall ist. um das nicht bei jedem user neu zu machen, solltest du das in die entsprechende vorlage eintragen, die beim neuanlegen kopiert wird (bei netbsd weiss ich das leider nicht, welche dateien das sind).
 
Die ksh ist schlau und interpretiert Escape-Sequenzen in PS1. Die Sequenz "\$" erzeugt $ bei UID != 0 und # bei UID == 0. Damit kannst Du sogar einen global gültigen Prompt zusammenbasteln.
 
Hi Ogion,

vielen Dank für den Tipp, aber ich verstehe leider nur Bahnhof:D. Was ist eine "Escape-Sequenz"? Wer will/muss den da fliehen? Und was ist ein(e) UID?
 
Escape-Sequenzen sind Teile von Zeichenketten, die besonders interpretiert werden. Gängigerweise werden sie durch einen Backslash eingeleitet. Beispiele sind etwa "\n" für einen Zeilenumbruch oder eben die diversen Ersatzungen, die für PS1 zur Verfügung stehen ("\u" für den Usernamen, "\h" für den Hostnamen oder eben "\$" für ein User-abhängiges Prompt-Zeichen).

UID ist die numerische User-ID. Auf einem unixoiden System hat der Benutzer mit der UID 0 einen besonderen Status - der darf grundsätzlich alles. Meistens heißt er root, auf einigen Systemen hat er aber andere Namen (z. B. VMS) - mal abgesehen davon, dass er einfach umbenannt werden könnte. Um nicht von dem veränderbaren Label "root" abhängig zu sein, erfolgt die Prüfung auf Superuser-Rechte i.d.R. durch Prüfung der UID auf 0 oder eben >0.
 
Ah, ok! das mit den Escape-Sequenzen hab' ich jetzt verstanden:) - entspricht ja auch dem Prompt, den Kollege makenoob oben angegeben hat.

Die Bedeutung von UID ist jetzt auch klar. Allerdings hab' ich keinen blassen Schimmer, wie ich das nutzen könnte, um beim Wechsel vom User zu root auch den Prompt entsprechend zu ändern (also bei Eingabe von "su" und Rootpasswort).

Ich bemühe mal Google und steige nochmal verstärkt in die manpage zur ksh ein - vielleicht finde ich ja was.

Jedenfalls erstmal dicken Dank für die Erläuterungen!!!
 
Der von makenoob vorgeschlagene Prompt in der .profile von root:
Code:
export PS1="\u@\h\n\w # "
Der von mir vorgeschlagene Prompt (entweder in den .profile Dateien jedes Users oder in /etc/kshrc):
Code:
export PS1="\u@\h\n\w \$ "
Durch das Ersetzen von "#" durch "\$" musst Du nicht mehr zwischen root und "normalen" Usern unterscheiden; das erledigt die ksh für Dich.
 
damit die .profile beim wechsel zu root per su eingelesen wird, musst du nen login vollziehen (zumindest ist es bei obsd so) und das machst du mit "su -l". damit wird die .profile dann eingelesen und auch entsprechend das prompt geändert
 
Der von makenoob vorgeschlagene Prompt in der .profile von root:
Code:
export PS1="\u@\h\n\w # "
Der von mir vorgeschlagene Prompt (entweder in den .profile Dateien jedes Users oder in /etc/kshrc):
Code:
export PS1="\u@\h\n\w \$ "
Durch das Ersetzen von "#" durch "\$" musst Du nicht mehr zwischen root und "normalen" Usern unterscheiden; das erledigt die ksh für Dich.

Hmmm, sieht gut aus, funktioniert aber leider nicht;'( ! Wenn ich in meine .kshrc das hier eingebe:

export PS1="\u@\h\n\w \$ "

Dann gibt's auch nur diesen Prompt:


Hab' das xterm geschlossen und mich auch ab- und wieder angemeldet - ändert leider nichts. Irgendwie scheint NetBSD da wohl ein bisschen anders zu "ticken".
 
Beim Xterm funktioniert das ganze normalerweise auch nicht, da selbiges .profile (bzw. .kshrc) nicht sourct. Auf nem normalen TTY solltest Du aber einen brauchbaren Prompt sehen. Ich hab z. B. folgendes in meiner .profile drinstehen:
Code:
export PS1='\u@\h \w \$ '
 
Nee Du, sorry, das funktioniert bei mir auch auf'm TTY nicht.

Ich hab' jetzt mal das hier in meine .kshrc geschrieben:

export PS1="\$USER@sushi \$PWD \$ "

Das gibt 'nen hübschen Prompt:D!

Um aber doch noch einen anderen Prompt für root zu bekommen, habe ich auch das hier in die .profile geschrieben:


funktioniert aber leider nicht. Muss ich den Eintrag anders machen?
 
Da muß ich mich jetzt einmischen, da hier anscheinend einige OpenBSD-ksh Nutzer einem NetBSD-ksh Nutzer Tips geben. Aber die OpenBSD-ksh ist nicht die selbe wie die NetBSD-ksh. Es gibt einen feinen Unterschied zwischen beiden, nämlich genau bei der Interpretation von Excapesequenzen in der Variablen PS1, also genau bei dem wovon ihr hier sprecht!

Sowohl NetBSD, als auch OpenBSD benutzen beide die Public Domain Variante der ksh (pdksh), jedoch hat OpenBSD diese Shell in den letzten Jahren für die eigenen Variante etwas modifiziert. Seitdem interpretiert die OpenBSD-ksh Escape-Sequenzen wie die bash also z. B. \u als momentaner Username etc. Das geht in der ursprünglichen pdksh (so wie sie auch noch in NetBSD verwendet wird) nicht! In der ksh-Implementation von NetBSD kommt man nicht drumrum für root und dem User getrennte Definitionen von PS1 zu verwenden.

Ich hatte selber mal mit dem Problem zu tun und explizit die Manpages zur ksh von OpenBSD und NetBSD verglichen.

Gruß
Reks30
 
Hiho,

mit Googles Hilfe habe ich folgende Anleitung für einen schicken ksh-Prompt gefunden:

http://blog.onetbsd.de/?p=134

Dabei werden die Globaldateien "/etc/profile" und "/etc/kshrc" bearbeitet. Leider funktioniert's nicht zu 100%. Ich stolper' da nämlich über einen Syntaxfehler:

ksh: /etc/kshrc[28]: syntax error: `then' unexpected

Dabei geht's um diesen Absatz in der /etc/kshrc:

Code:
# Read ~/.aliases if the file exists
 [ -f $HOME/.aliases ] ; then
. $HOME/.aliases

Kann mir evtl. jemand 'nen Tipp geben, was da nicht stimmt?
 
Code:
# Read ~/.aliases if the file exists
 [ -f $HOME/.aliases ] ; then
. $HOME/.aliases

Kann mir evtl. jemand 'nen Tipp geben, was da nicht stimmt?

Ja, kann ich, die obigen 2 Zeilen kann man auf zweierlei Art richtig formulieren. Entweder:
Code:
[ -f $HOME/.aliases ] && . $HOME/.aliases
als Einzeiler oder:
Code:
# Read ~/.aliases if the file exists
if [ -f $HOME/.aliases ] ; then
. $HOME/.aliases
fi

Ein "then" kann man nur benutzen wenn man auch ein if benutzt, das man durch ein fi abschließen muß.

Edit: Mir fällt gerade auf das es auf der von dir angegebenen Seite selbst richtig ist, aber anscheinend ist dein Copy and Paste falsch, du hast was weggelassen, eben das if und das abschließende fi.

Gruß
Reks30
 
Ah, super - muchas gracias:)!

Hatte mir schon gedacht, dass wo ein "then" auftaucht, ein "if" nicht weit sein sollte. Hatte es auch schon ausprobiert, wusste aber nicht, dass ein "fi" ans Ende gehört

Muss aber auch zugeben, dass sich meine Programmierkenntnisse auf ein bisschen Basic in der Computer AG an der Schule beschränken - 1980 oder 81:D.

Jetzt hab' ich aber noch ein anderes Problemchen. Wenn ich jetzt ein xterm starte, kommt diese Meldung:

ksh: /etc/kshrc[33]: ^XH=beginning-of-line: not found
ksh: /etc/kshrc[34]: ^XF=end-of-line: not found
ksh: /etc/kshrc[35]: ^[[3=prefix-2: not found
ksh: /etc/kshrc[36]: ^[[3~=delete-char-forward: not found

Und das bezieht sich natürlich auf diesen Teil des oben genannten Scripts:

Code:
# Bind POS1, END and DEL keys
# For DEL see http://monkey.org/openbsd/archive/misc/0310/msg00504.html
 '^XH'=beginning-of-line      # POS1/HOME
 '^XF'=end-of-line            # END
 "^[[3"=prefix-2              # DEL
 "^[[3~"=delete-char-forward  # DEL

Was ich verstehe: Den Tasten "Pos1", "End" und "Del" wird etwas zugewiesen. Aber was?

EDIT: Hab's selbst rausgefunden! Ein "bind" fehlt jeweils vor den Einträgen. So sieht's richtig aus:

Code:
# Bind POS1, END and DEL keys
# For DEL see http://monkey.org/openbsd/archive/misc/0310/msg00504.html
bind '^XH'=beginning-of-line      # POS1/HOME
bind '^XF'=end-of-line            # END
bind "^[[3"=prefix-2              # DEL
bind "^[[3~"=delete-char-forward  # DEL
 
Zuletzt bearbeitet:
Zurück
Oben