Wie würde ich eine Shell ohne Anmeldung erkennen? (In Zsh)

7

Ich möchte ein Skript erstellen, das ausgeführt wird, wenn eine Zsh-Instanz gestartet wird, aber nur, wenn die Instanz:

  • Nicht anmelden.
  • Interaktiv

Ich glaube, ich kann zu Recht sagen, dass .zshrcLäufe für alle interaktiven Shell-Instanzen .zprofileund .zloginfür alle Login-Shells ausgeführt werden und .zshenvin allen Fällen ausgeführt werden.

Der Grund, warum ich dies tun möchte, besteht darin, zu überprüfen, ob ein vorhandener ssh-Agent ausgeführt wird, und ihn in der neu geöffneten Shell zu verwenden, falls vorhanden.

Ich kann mir vorstellen, dass alle durchgeführten Tests am besten platziert werden .zshrc(da dies eine interaktive Shell garantiert) und das von dort aufgerufene Skript "Nicht-Anmeldeereignis" aufgerufen wird.

Ich möchte wahrscheinlich zuerst überprüfen, ob die neue Shell bereits als Teil einer vorhandenen Remote-SSH-Sitzung ausgeführt wird, bevor ich auf den ssh-Agenten teste, aber ich habe dieses SE-Rezept für diesen Zweck gefunden.

Ich wähle Zsh, da es die Schale ist, die ich bevorzuge, aber ich stelle mir vor, dass jede richtige Technik, um dies zu tun, ähnlich auf andere Schalen angewendet wird.

Geeb
quelle

Antworten:

14
if [[ -o login ]]; then
  echo "I'm a login shell"
fi

if [[ -o interactive ]]; then
  echo "I'm interactive"
fi

[[ -o the-option ]] Gibt true zurück, wenn die Option gesetzt ist.

Sie können die Werte von Optionen auch mit dem $optionsspeziellen assoziativen Array oder durch Ausführen abrufen set -o.

So überprüfen Sie, ob es einen SSH-Agenten gibt:

if [[ -w $SSH_AUTH_SOCK ]]; then
  echo "there's one"
fi

In ksh(und zsh):

case $- in (*i*) echo interactive; esac
case $- in (*l*) echo login; esac

In bash, es ist ein Chaos, brauchen Sie:

case $- in *i*) echo interactive; esac # that should work in any Bourne/POSIX shell
case :$BASHOPTS: in (*:login_shell:*) echo login; esac

Und $SHELLOPTSenthält einige weitere Optionen. Einige Optionen können Sie festlegen set -<x>, andere mit set -o option, andere mit shopt -s option.

Stéphane Chazelas
quelle
Richtig ... Ich hatte diese -oOptionen bemerkt , aber ich dachte, sie wären Optionen, die so eingestellt werden konnten, dass sie die Standardeinstellungen überschreiben, dh das Verhalten erzwingen , anstatt die tatsächliche Situation abzufragen. Liege ich falsch?
Geeb
@Geeb, [[ -o opt ]]prüft ob optgesetzt ist. Ich kann nicht verstehen, warum es nur dann funktioniert, wenn die Option auf die eine und nicht auf die andere Weise eingestellt ist.
Stéphane Chazelas
Sie sagen also, dass das Abfragen der Optionswerte immer die Wahrheit der Sache meldet? Beispiel: Sie konnten eine Shell-Instanz, die in einem nicht interaktiven Modus gestartet wurde, nicht zum Lesen verleiten, .zshrcindem Sie die interactiveOption festlegen.
Geeb
Das .zshrcwird beim Start gelesen, wenn die Shell interaktiv ist. Es kann von jemandem gelesen werden, der es tut source ~/.zshrc.
Stéphane Chazelas
OK, eine andere Art der Täuschung: Wenn Sie die loginOption .zshrcaktivieren, verhalten sich alle nach dieser Änderung gestarteten interaktiven Shells so, als wären sie das Ergebnis einer Anmeldung, oder? dh das Verhalten wird erzwungen - in Wahrheit handelt es sich nicht wirklich um Login-Shells und sie verhalten sich nur so, weil sie von der Autorität der Optionseinstellung dazu aufgefordert wurden?
Geeb