Ich richte gerade eine ziemlich komplexe Bash-Konfiguration ein, die auf mehreren Computern verwendet werden soll. Ich versuche herauszufinden, ob es möglich ist, festzustellen, ob ich über SSH oder auf einem lokalen Computer angemeldet bin. Auf diese Weise könnte ich zum Beispiel einige Aliase festlegen, die von dieser Tatsache abhängen. Wie Aliasing halt
, restart
da das Stoppen eines Remote-Servers möglicherweise nicht das Beste ist.
Was ich bisher weiß ist, dass die Umgebungsvariable gesetzt SSH_CLIENT
wird, wenn ich mich über ssh anmelde. Leider wird diese Variable verworfen, wenn ich eine Superuser-Shell mit starte sudo -s
. Ich weiß auch, dass ich sudo einen Parameter übergeben kann, der sudo anweist, alle meine Umgebungsvariablen in die neue Shell-Umgebung zu kopieren.
ps afx
und das TTY für die nicht laufende Shellps
das andere Login.who am i
.who am i
tun zu haben, sodass Sie von dort aus feststellen können, ob Sie SSHing verwenden oder nicht. Dies funktioniert:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)
who
zwei zusätzliche Argumente verwenden.who am i
ist dasselbe wiewho is me
oderwho is awesome
oderwho potato potato
. Eine Tatsache, die ich ein wenig interessant fand.Hier ist eine großartige Antwort, die ich auf unix.stackexchange gefunden habe :
SSH_CLIENT
oderSSH_TTY
definiert ist, handelt es sich um eine SSH-Sitzung.ps -o comm= -p $PPID
. Wenn diessshd
der Fall ist , handelt es sich um eine SSH-Sitzung.quelle
Man könnte hinzufügen ,
SSH_*
umenv_keep
insudoers
so dass diese während an den anderen Benutzern eingeschaltet erkannt werden können.quelle
Wenn Sie wissen möchten, ob die Bash-Shell direkt ein untergeordneter Prozess von sshd ist (nicht n> 1 Ebenen tief), können Sie dies
Es sollte Ihnen
sshd
oder was auch immer der übergeordnete Prozessname Ihrer aktuellen Shell sein.quelle
ps -o cmd= $PPID
oderawk '/^Name:/ {print $2}' /proc/$PPID/status
Ich denke, Sie möchten die Art und Weise überdenken, in der Sie über das Problem denken. Die Frage lautet nicht "Bin ich über SSH angemeldet, weil ich bestimmte Befehle deaktivieren möchte?". Es ist "Bin ich an der Konsole angemeldet, dann werde ich bestimmte Befehle aktivieren."
quelle
Ja, wie andere angemerkt haben, ist die Info bei Vorhandensein Ihrer IP in Klammern in der Ausgabe von
who am i
.Sie können reguläre Bash-Ausdrücke verwenden, um dies zu erkennen:
quelle
Ich habe mir Folgendes ausgedacht, basierend auf Tipps von anderen hier.
Es verwendet eine Variable zum Zwischenspeichern - ich verwende sie in meinem Shell-Thema.
Quelle:
is_ssh
in https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .quelle
Suchen Sie nach der übergeordneten Cmdline Ihrer Shell und wiederholen Sie den Vorgang. Vielleicht so etwas wie das Folgende:
Bearbeitet, damit es tatsächlich funktioniert :)
quelle
Alle anderen Antworten funktionieren, wenn Sie sich auf der ersten Login-Ebene befinden. Wenn Sie jedoch nach dem Anmelden "su" oder "sudo" ausführen (in meinem Fall musste ich aus Sicherheitsgründen Folgendes ausführen, um zu einem Benutzerkonto ohne Shell zu wechseln: sudo su - <Benutzer-ID> -s / bin / bash - l) , scheitern ihre Lösung.
Das Folgende ist eine universelle Lösung; Mit pstree suchen Sie als übergeordnetes Element nach sshd.
Hier ist die Ausgabe des egrep, wenn --quiet entfernt wird. Es wird die gesamte Hierarchie angezeigt, die übereinstimmt, wenn eine Verbindung über Fernzugriff besteht.
quelle
Bitte beachten Sie, dass diese Antwort sehr, sehr Linux-spezifisch ist.
Dies ist eine wichtige Annahme: Der Anmeldevorgang hat kein steuerndes TTY. Sie möchten wahrscheinlich überprüfen, ob Sie über ein kontrollierendes TTY verfügen, bevor Sie diesen Code ausführen (was je nach Ihren Anforderungen wahrscheinlich ohnehin eine sichere Sache ist).
Der Code durchläuft den Prozessbaum nach oben, bis er den Prozess findet, der kein steuerndes TTY hat.
$initiator_name
Der Name dieses Prozesses (z. B. "sshd").quelle