Wie führe ich automatisch Befehle bei der SSH-Anmeldung aus?

17

Immer wenn ich mich bei meinem Linux-Server anmelde, möchte ich, dass mehrere Befehle automatisch ausgeführt werden (einige Variablen festlegen, Speicherort ändern usw.)

Dies muss bei der Benutzeranmeldung erfolgen, nicht beim Systemstart.

Wie kann ich dies einstellen?

Alasdair
quelle
Sie müssen den Abschnitt INVOCATION in bash (1) ( man bash) lesen .
Andrew Schulman

Antworten:

31

Geben Sie die Befehle ein ~/.bashrc. Alles, was sich dort befindet, wird jedes Mal ausgeführt, wenn Sie sich anmelden.

Wenn Sie Befehle benötigen, die nur ausgeführt werden, wenn Sie sich über ssh anmelden (aber nicht, wenn Sie sich physisch anmelden), können Sie wahrscheinlich das Vorhandensein der SSH_CONNECTIONUmgebungsvariablen testen und die Befehle nur ausführen, wenn Sie feststellen, dass sie vorhanden sind.

David Z.
quelle
Ich melde mich nicht als root an, es ist ein AWS-Server, daher muss ich mich als "ec2-user" anmelden und dann mit "sudo su -" zu root wechseln. Soll ich die Befehle in "/home/ec2-user/.bashrc" einfügen?
5
Dies setzt voraus, dass ~ / .bashrc aus Ihrem ~ / .bash_profile stammt. ~ / .bash_profile ist das Skript, das für eine Login-Shell wie ssh aufgerufen wird. Ich glaube, ~ / .bashrc wird aufgerufen, wenn Sie beispielsweise ein Gnome-Terminal öffnen, nachdem Sie sich bereits angemeldet haben.
dgrant
Sie haben mich verwirrt, lassen Sie mich mehr erklären: Dies ist eine Amazon Web Services-Instanz, bei der es sich um einen virtuellen Server handelt, sodass sich niemand physisch anmelden wird (ich bin mir nicht einmal sicher, ob sie physisch als ein Computer vorhanden ist). Ich melde mich mit PUTTY mit dem Benutzernamen ec2-user an. Dies bringt mich in das Verzeichnis / home / ec2-user. Ich wechsle dann zum Root-Benutzer, indem ich "sudo su -" eingebe, wodurch ich in "/ root" abgelegt werde. Dann muss ich eine Reihe von Befehlen eingeben, einschließlich der Rückkehr zu "/ home / ec2-user" und dem Festlegen einiger Befehle Variablen, Aliase usw. Also ... wie würde ich es dazu bringen, dies zu tun?
Da ich den Benutzer wechsle, erwarte ich außerdem, dass ich im ec2-Benutzer-Bash-Profil nur "sudo su -" und dann den Rest der Befehle in die Root-Bash-Datei einfügen sollte.
HINWEIS: Tatsächlich wird .profile aufgerufen, wenn es vorhanden ist. Wenn .bash_profile nicht vorhanden ist, wird es stattdessen aufgerufen.
dgrant
14

Fügen Sie dies einfach in ~ / .bashrc oder /etc/bash.bashrc ein, wenn Sie dies für alle Benutzer wünschen:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi
Llamageddon
quelle
und wie verliere ich die Sitzung nach Abschluss der Ausführung?
E-Info128
1
@WHK Was meinst du mit dem Verlust der Sitzung?
Llamageddon
@ Lamageddon: Ich denke, er wundert sich das gleiche, was ich bin. Wenn ich meine gesamte SSH-Sitzung durchführen wollte screen, könnte ich Ihre Antwort verwenden und screendort anstelle des Echos einfügen. Das Problem dabei ist, dass das Beenden der Bildschirmsitzung zur SSH-Eingabeaufforderung zurückkehrt, anstatt sich abzumelden. Das Schreiben dieses Kommentars gab mir jedoch die Antwort: Fügen Sie den logoutBefehl nach dem screenBefehl hinzu.
Zondo
Dies funktioniert jedoch nicht für SSH-Sitzungen, die kein Bash verwenden, z. B. wenn ich eine SFTP-Sitzung öffne.
Fabio
@zondo @ e-info128 exec commandersetzt die aktuelle Shell durch alles, was Sie ausführen.
Llamageddon
5

Alternativ können Sie einen Befehl angeben, der während des Aufrufs von ssh: ausgeführt werden soll.

$ ssh -t server 'cmd; exec bash -l'

Der letzte Befehl in der Liste sollte eine interaktive Sitzung in Ihrer bevorzugten Shell starten. Wenn Sie viele Befehle ausführen müssen, sollten Sie eine Skriptdatei auf Ihrem SSH-Server erstellen.

Dmitry Grigoryev
quelle
1
Dies ist sehr nützlich. Ich bin mir nicht sicher, ob es genau die Antwort ist, die der Fragesteller gestellt hat, aber die Leute sollten es wissen, da es möglicherweise nicht offensichtlich ist. Zum Beispiel "ssh user @ host" export x = 5; bash "Dann zeigt im Terminal, das Echo $ x anzeigt, 5.
Clearlight
3

Eigentlich ~/.ssh/rcist ein richtiger Ort für Sie Befehl auszuführen hinzuzufügen , wenn Sie sich anmelden, anstatt jeder Benutzer des Systems.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.
Bach Hong
quelle
Nicht unbedingt. Es ist ein Ort , an dem Befehl platziert werden kann.
Daniel B
Das könnte WIRKLICH jemanden in Schwierigkeiten bringen, wenn er nicht wüsste, was er tut. Es ist möglicherweise in Eckfällen nützlich, aber das könnte jemanden WIRKLICH durcheinander bringen, wenn er vergisst, dass er dort Befehle oder den Namen und den Pfad dieser Datei abgibt. Im Allgemeinen wäre es sehr vorzuziehen, die Startanmeldebefehle an der erwarteten Stelle, .bashrc, auf der Remote-Seite zu platzieren und auf $ SSH_CONNECTION zu testen, wie andere Antworten hier vorgeschlagen haben.
klares Licht
1

Anmelden am Remote-Host nach Ausführung der an den Remote-Host übergebenen Befehle:

  1. Wird .bashrcauf dem Remote-Host ausgeführt
  2. Führt Befehle aus, die über die Befehlszeile übergeben werden (mit env von remote .bashrc).
  3. Lässt Sie bei der Bash-Eingabeaufforderung auf dem Remote-Host zurück (wenn keine Fehler vorliegen)

    $ ssh user@host "bash -lc cmd; cmd; ..."

    Die Option -l macht es zu einer Login-Shell (z. B. .bashrc ausführen)

    Die Option -c gibt an, dass der explizite Befehl bash ausgeführt wird

klares Licht
quelle