Lösung 1:
Ja, verwenden Sie einfach /bin/false
als Shell und weisen Sie den Benutzer an, den tunnelnden SSH-Prozess zu starten, ohne einen Remote-Befehl auszuführen (d. h. den -N
Flag für OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
Lösung 2:
Fügen Sie in der Datei .ssh/authorized_keys des Benutzers etwa Folgendes ein:
permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...
Im Grunde befinden sich die Steuerelemente also vor dem öffentlichen ssh-Schlüssel des Benutzers, getrennt durch ein Leerzeichen. In diesem Beispiel dürfen Verbindungen, die den spezifischen öffentlichen Schlüssel verwenden, SSH-Portweiterleitungen nur zum MySQL-Server von 192.168.1.10 und zum Webserver von 10.0.0.16 durchführen und erhalten keine Shell (no-pty). Sie fragen speziell nach der Option "no-pty", aber die anderen können auch nützlich sein, wenn der Benutzer nur zu bestimmten Servern tunneln soll.
Weitere Optionen für die Datei "authorized_keys" finden Sie in der Manpage für sshd.
Beachten Sie, dass die Erfahrung des Benutzers etwas seltsam aussehen kann:Wenn er sich per SSH einloggt, sieht es so aus, als würde die Sitzung hängen bleiben (da er kein pty erhält). Das ist okay. Wenn der Benutzer die Portweiterleitung beispielsweise mit "-L3306:192.168.1.10:3306" angegeben hat, bleibt die Portweiterleitung bestehen.
Probieren Sie es auf jeden Fall aus.
Lösung 3:
Geben Sie dem Benutzer eine Shell, mit der er sich nur abmelden kann, z. B. /bin/press_to_exit.sh
#!/bin/bash read -n 1 -p "Press any key to exit" key
Auf diese Weise kann er bei aktiven Tunneln so lange angemeldet bleiben, wie er möchte, aber keine Befehle ausführen. Ctrl-c
schließt die Verbindung.
Lösung 4:
Weisen Sie eine Shell zu, die es dem Benutzer nicht erlaubt, sich anzumelden.
zB
#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0
würde verhindern, dass sie einen Shell-Prompt erhalten, und ihnen ein Timeout von 60 Sekunden geben - wenn 60 Sekunden lang keine Verbindung aktiv ist, wird sie beendet und dadurch vollständig getrennt (erhöhen Sie die Anzahl entsprechend den Anforderungen).
Sie können auch keinen entfernten Befehl ausführen, weil diese Shell sie nicht zulässt.