Führen Sie einen Befehl in einer interaktiven Shell mit ssh aus, nachdem Sie .bashrc bezogen haben

11

Ich möchte ssh in einen Remote-Ubuntu-Computer, meine Quelle .bashrcund einen Befehl ausführen, der von den von ihm festgelegten Parametern abhängt .bashrc. All das in einer interaktiven Shell, die nach Ausführung des Befehls nicht geschlossen wird.

Was ich bis jetzt versucht habe ist

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

oder nur

ssh user@remote_computer -t "my_alias;bash"

Dies funktioniert für allgemeine Befehle (wie lszum Beispiel), aber wenn ich versuche, einen in definierten Alias ​​auszuführen .bashrc, wird folgende Fehlermeldung angezeigt:

bash: my_alias: command not found

Aber wenn ich es dann wieder manuell schreibe und ausführe, funktioniert es!

Wie kann ich also sicherstellen, dass das .bashrcbezogen wird, bevor der Befehl aufgerufen wird?

Mehdi
quelle
Der Beitrag ist verwirrend. Ich empfehle, solche laufenden Befehle nicht zu missbrauchen. Wenn jedoch bash oder ein bash-Befehl aufgerufen wird, würde ich sagen, dass .bashrc ausgeführt werden soll. Es gibt offensichtlich einige Unterschiede oder Besonderheiten bei der Ausführung eines solchen Befehls, und für ernstere Anwendungen würde ich Ansible oder Puppet empfehlen.
Rui F Ribeiro
Ich habe meine Frage bearbeitet. Der zweite Befehl ist einfacher und macht dasselbe, jedoch ohne vorherige Beschaffung von .bashrc.
Mehdi
@ RuiFRibeiro Missbrauch? Wie kann man so eine einfache Sache Missbrauch nennen? So einfach ist es, einen Befehl automatisch auszuführen, nachdem Sie sich mit ssh bei einem Remote-Computer angemeldet haben. Jedes externe Tool, das für eine so lächerlich kleine Aufgabe eingesetzt wird, wäre ein Overkill
Mehdi,
1
Nur eine Redewendung sollte nicht allgemeiner verwendet werden. Verwenden Sie sie, wenn Sie sie brauchen, aber sie zu verwenden ist nicht so friedlich, wie es scheint. Wenn Sie sich für zukünftige Referenzen Ansible ansehen, werden Sie erstaunt sein, wie leicht es tatsächlich ist. Ich führe oft auch Befehle über ssh aus.
Rui F Ribeiro

Antworten:

9

Das Problem ist, dass Sie versuchen, einen Alias ​​in einer nicht interaktiven Shell auszuführen. Wenn Sie ausgeführt werden ssh user@computer command, commandwird nicht interaktiv ausgeführt.

Nicht interaktive Shells lesen keine Aliase (von Man Bash):

Aliase werden nicht erweitert, wenn die Shell nicht interaktiv ist, es sei denn, die Shell-Option expand_aliases wird mit shopt festgelegt (siehe Beschreibung von shopt unter SHELL BUILTIN-BEFEHLE unten).

Es funktioniert, wenn Sie es erneut manuell ausführen, da der letzte bashBefehl eine interaktive Shell startet, sodass Ihre Aliase jetzt verfügbar sind.

Alternativ können Sie eine interaktive Shell ( bash -i) anstelle einer einfachen Anmeldeshell ( bash -l) auf dem Remotecomputer starten, um Ihren Alias ​​auszuführen:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

Dies scheint jedoch ein sehr komplizierter Ansatz zu sein. Sie haben nicht erklärt, warum genau Sie dies tun müssen, sondern erwägen diese Alternativen:

  1. Starten Sie einfach eine normale interaktive Login-Shell auf dem Remote-Computer und führen Sie den Befehl manuell aus:

    user@local $ ssh user@remote
    user@remote $ my_alias
  2. Wenn Sie immer möchten, dass dieser Alias ​​ausgeführt wird, wenn Sie eine Verbindung zu diesem Computer herstellen, bearbeiten Sie den ~/.profile(oder ~/.bash_profile, falls vorhanden) des Remotecomputers und fügen Sie diese Zeile am Ende hinzu:

    my_alias

    Da dies ~/.profilejedes Mal gelesen wird, wenn eine Anmeldeshell gestartet wird ( sshz. B. bei jeder Verbindung über ), wird my_aliasdies bei jeder Verbindung ausgeführt.

    Beachten Sie, dass Login-Shells standardmäßig gelesen ~/.profileoder ~/.bash_profileignoriert werden ~/.bashrc. Einige Distributionen (z. B. Debian und seine Derivate sowie Arch) wie Ubuntu haben ihre Standard- ~/.profileoder ~/.bash_profileDateiquelle, ~/.bashrcwas bedeutet, dass Ihre in definierten Aliase ~/.bashrcauch in einer Login-Shell verfügbar sind. Dies gilt nicht für alle Distributionen, daher müssen Sie Ihre möglicherweise ~/.profilemanuell bearbeiten, um die Quelle zu erhalten ~/.bashrc. Beachten Sie auch, dass, falls ~/.bash_profilevorhanden, ~/.profileBash ignoriert wird.

terdon
quelle
Würden Sie also vorschlagen, die Aliase in einem alias_profile zu definieren und sie von .profile oder .bash_profile aufzurufen?
Mehdi
@Mehdi, das hängt davon ab, was Sie tun möchten. Wird auf Ihrem Ubuntu-System ~/.basyrcautomatisch von gelesen ~./profile, sodass alle in definierten Aliase ~/.bashrcauch für das Lesen von Shells verfügbar sind ~/.profile. Alles, was Sie wirklich tun mussten, um dies zum Laufen zu bringen, war, explizit eine interaktive Shell ( -i) zu starten .
Terdon
5

Ich musste einen Teil meiner .bashrc kommentieren, der die Verwendung von Aliasen verhinderte, und einen Befehl expand_aliases hinzufügen. Dies wurde kommentiert

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

Und das wurde hinzugefügt

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

Dann funktionierte mein Befehl:

ssh user@remote_computer -t "my_alias;bash"
Mehdi
quelle