Ändern der Shell (mit chsh) über die Befehlszeile in einem Skript


11

In einem Startskript, das einen Computer einrichtet, möchte ich ausführen

chsh -s /bin/zsh

Hierbei wird jedoch nach dem Kennwort des Benutzers gefragt. Wie übergebe ich das Passwort als Parameter? Oder kann ich diesen Schritt irgendwie umgehen, wenn ich Sudo-Power habe? Oder gibt es eine andere Möglichkeit, die Standardstart-Shell zu ändern?

Antworten:


21

Im Folgenden wird verhindert, dass gesperrte Konten ihre Shells ändern, und Benutzer können chshsich selektiv OHNE sudo oder su verwenden:

Einfache Einrichtung, die immer noch sicher ist:

  1. Fügen Sie dies ganz oben hinzu /etc/pam.d/chsh:

    # This allows users of group chsh to change their shells without a password.
    #
    # Per: http://serverfault.com/questions/202468/changing-the-shell-using-chsh-via-the-command-line-in-a-script
    #
    auth       sufficient   pam_wheel.so trust group=chsh
    
  2. Erstellen Sie die chsh-Gruppe:

    groupadd chsh
    

Für jeden Benutzer, der seine Shell ändern darf:

    usermod -a -G chsh username

Geldschuss:

user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/bin/bash
user@host:~$ chsh -s `which zsh`
user@host:~$ getent passwd $USER
user:x:1000:1001::/home/user:/usr/bin/zsh
user@host:~$ 

Arbeitslösung, wundere dich, dass dies immer noch nicht akzeptiert wird.
Dimpiax

Vielen Dank. Dies scheint der sauberste Weg zu sein, einen Benutzer, der nur eine Authentifizierungs-Shell zum Ändern von Schlüsselpaaren verwendet, ohne sudo zuzulassen. Dieses pam.d Zeug ist sehr interessant!
François Drolet

4

chsh ändert tatsächlich die Zeile eines Benutzers in / etc / passwd, obwohl ein Benutzer nur seine eigene 'Zeile' in / etc / passwd ändern kann. Wenn Sie also die Shell für einen anderen Benutzer ändern möchten, benötigen Sie dessen Passwort.

Wenn Sie es wirklich tun möchten (angesichts der Bedenken in Lorenzos Beitrag und möglicher Sicherheitsbedenken), können Sie dies folgendermaßen tun:

#visudo

Dies erfordert Root-Rechte.

Angenommen, Sie arbeiten derzeit als "Alice" und möchten die "Bob's" -Shell ohne Passwort ändern.

Zur Datei hinzufügen:

Cmnd_Alias     SHELL = /usr/bin/chsh
Runas_Alias    SH    = Bob
alice          ALL   = (SH) NOPASSWD: SHELL

Dies stellt sicher, dass 'alice' auf allen Hosts als Benutzer in der Gruppe SH ohne Kennwort der Befehlsgruppe in SHELL ausgeführt werden kann.

Wahrscheinlich ein bisschen weit hergeholt, um es so zu machen, aber es ist möglich.

Lesen Sie unbedingt "man sudoers", bevor Sie die sudores-Datei mit "visudo" ändern, insbesondere die Sicherheitsnachrichten!


Das Problem dabei sudoist, dass es extrem einfach ist, ein System zu umgehen und zu rooten. Es ist besser, niemals zu ändern, es sudoerssei denn, es gibt einen bestimmten Bedarf, der auf keine andere Weise erfüllt werden kann (ausführbare Datei setuid / setgid, Gruppenberechtigungen usw.).

2

Sie müssen den Benutzernamen übergeben. Wenn Sie dies über sudo(oder über root) tun , können Sie das Passwort / die Shell eines Benutzers festlegen, ohne nach dem alten Passwort gefragt zu werden. Bitte überprüfen Sie man chshfür weitere Informationen.

Jetzt ist meine Frage: Warum willst du das tun? Wenn es sich um ein Setup-Skript handelt, sollten Sie nicht einfach die Benutzer-Shell beim Erstellen ändern (dh beim Starten adduser)? Wenn Sie ein System remote klonen, sollten Sie es nicht zuerst ändern /etc/passwd? Ich sehe keine Gründe, dies über ein Skript zu tun, es sei denn, Sie haben den gesamten Installationsprozess automatisiert und die Auswahl der zu installierenden Shells erfolgt nach der Erstellung des ersten Benutzers.


Es ist für eine ec2-Maschine (das Skript, das ich direkt nach dem Start der Maschine ausführe). Ich möchte die Standardstart-Shell ändern. "Sudo chsh -s / bin / zsh Benutzername" zu tun funktioniert auch nicht (fragt immer noch nach dem Passwort des Benutzers)

Versuchen Sie es mit einem Skript und verwenden Sie #!/usr/bin/sudo -s(shebang line). Sind Sie auch sicher, dass zsh in / bin und möglicherweise nicht in / usr / bin ist? (Ich überprüfe nur, ich bin nicht mit ec2 vertraut)
Lorenzog

Diese Antwort ist unvollständig, da sie die sudoErlaubnis voraussetzt . Siehe meinen für einen anderen Ansatz, der sudofür den durchschnittlichen Benutzer nicht erforderlich ist .

0

Ich glaube, Sie können die Shell des Benutzers in der /etc/passwordDatei ändern , möglicherweise mit dem passwdBefehl. Ich habe es noch nicht gelesen, aber dies kann nützlich sein: UNIX-Shell-Unterschiede und wie Sie Ihre Shell ändern .


Die Befehle sind chshoder usermod. Bearbeiten Sie die passwdDatei niemals direkt, sondern verwenden Sie immer den vipwBefehl dafür.

0

Versuchen Sie sudo chsh -s /bin/zshdann:

  1. Beenden Sie für Server
  2. Terminal neu starten
  3. logge dich in den Server ein und checke durch echo $SHELL- im erfolgreichen Fall hat sich das geändert :)

Dadurch wird zsh als Standardterminal für den Root-Benutzer festgelegt.
lcguida

@lcguida richtig.
Dimpiax
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.