Führen Sie tcsh mit einem beliebigen Startskript aus

921
nispio

Ich möchte eine neue Instanz tcshund ein beliebiges Skript in einem Schritt erstellen . Das Problem ist, dass bei Verwendung der -cOption die Shell-Instanz geschlossen wird, sobald das Skript abgeschlossen ist. Im folgenden einfachen Beispiel wird der pushdBefehl erfolgreich ausgeführt, aber dann wird die Shell beendet:

tcsh -c "pushd ~/some/directory/of/interest" 

Wie kann ich ein Skript beschaffen, das die Umgebung modifiziert, und dann interaktiv in dieser Umgebung arbeiten? Dies ist am nützlichsten, wenn es in Verbindung mit Programmen wie sshoder screenwie folgt verwendet wird:

ssh -t user@host 'tcsh -c "source ~/test_environment.csh"' 
2

2 Antworten auf die Frage

4
ssnobody

Unsere Lösung umfasst zwei Schritte.

  1. Übergeben Sie die Umgebungsvariable, die den Pfad zu dem Skript enthält, das Sie an die neue tcshInstanz senden möchten .
  2. Haben Sie tcshdas Skript als Quelle für diese Umgebungsvariable

Für Schritt 1 sshwird der Befehl ausgeführt, den Sie in Ihrer Standard-Shell (dem des Zielservers /etc/passwd) angegeben haben. Ich gebe Ihnen hierfür verschiedene Lösungen.

  • Wenn die Ziel-Shell sh/ ist bash: Verbinden Sie sich mit dem SSH-Server mit dem folgenden Befehl:ssh -t user@host 'export SOURCESCRIPT=/tmp/tmp.sh; exec /usr/bin/tcsh'
  • Wenn die Ziel-Shell csh/ ist tcsh: Verbinden Sie sich mit dem SSH-Server mit dem folgenden Befehl:ssh -t user@host 'setenv SOURCESCRIPT /tmp/tmp.sh; exec /usr/bin/tcsh'
  • Wenn Sie die SSH-Serverkonfiguration des Ziels ändern können, fügen Sie die AcceptEnvOption Hinzufügen / Ändern hinzu, um die Übergabe der Umgebungsvariablen /etc/ssh/sshd_configzu ermöglichen SOURCESCRIPT(z. B. AcceptEnv SOURCESCRIPT), setzen Sie sie SOURCESCRIPTin der lokalen Umgebung und stellen Sie eine Verbindung mit dem folgenden Befehl her:ssh -t -o SendEnv=SOURCESCRIPT user@host 'exec /usr/bin/tcsh'

Für Schritt 2 müssen wir ~/.tcshrcFolgendes hinzufügen:

if $?SOURCESCRIPT then source $SOURCESCRIPT endif 
Dies ist eine sehr schöne, unkomplizierte Lösung! Es muss zuvor das `~ / .tcshrc` des Benutzers geändert werden, aber das ist in meinem Szenario kein Problem. nispio vor 8 Jahren 0
Freut mich zu hören, dass es erfolgreich war! Vielen Dank für den Fehler, das Gleichheitszeichen wurde behoben. ssnobody vor 8 Jahren 0
-1
Mr. Minty Fresh

Korrigieren Sie mich, wenn ich falsch liege, aber können Sie nicht die Option '-m' für tcsh verwenden, um ein Startskript zu laden? Ich habe gerade die Manpage gelesen und dachte, Sie könnten die '~ / .tcshrc'-Datei zu einem Symlink zu einem anderen Skript machen. Falls mit den Befehlen etwas passiert, könnten Sie die Optionen '-e' oder '-m' ausprobieren.

Hoffe das hilft!

BEARBEITEN: Oder vielleicht können Sie die Option '-i' interaktiv in Verbindung mit der Option '-c' verwenden. :)

`~ / .tcshrc` ist mein Startskript, daher kann ich es nicht einfach durch einen Symlink ersetzen. Ich suche nach einer Möglichkeit, optional ein ** alternatives ** Startskript auszuführen. nispio vor 8 Jahren 0