Ich möchte ssh in einen Remote-Ubuntu-Computer, meine Quelle .bashrc
und 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 ls
zum 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 .bashrc
bezogen wird, bevor der Befehl aufgerufen wird?
Antworten:
Das Problem ist, dass Sie versuchen, einen Alias in einer nicht interaktiven Shell auszuführen. Wenn Sie ausgeführt werden
ssh user@computer command
,command
wird nicht interaktiv ausgeführt.Nicht interaktive Shells lesen keine Aliase (von Man Bash):
Es funktioniert, wenn Sie es erneut manuell ausführen, da der letzte
bash
Befehl 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: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:
Starten Sie einfach eine normale interaktive Login-Shell auf dem Remote-Computer und führen Sie den Befehl manuell aus:
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:Da dies
~/.profile
jedes Mal gelesen wird, wenn eine Anmeldeshell gestartet wird (ssh
z. B. bei jeder Verbindung über ), wirdmy_alias
dies bei jeder Verbindung ausgeführt.Beachten Sie, dass Login-Shells standardmäßig gelesen
~/.profile
oder~/.bash_profile
ignoriert werden~/.bashrc
. Einige Distributionen (z. B. Debian und seine Derivate sowie Arch) wie Ubuntu haben ihre Standard-~/.profile
oder~/.bash_profile
Dateiquelle,~/.bashrc
was bedeutet, dass Ihre in definierten Aliase~/.bashrc
auch in einer Login-Shell verfügbar sind. Dies gilt nicht für alle Distributionen, daher müssen Sie Ihre möglicherweise~/.profile
manuell bearbeiten, um die Quelle zu erhalten~/.bashrc
. Beachten Sie auch, dass, falls~/.bash_profile
vorhanden,~/.profile
Bash ignoriert wird.quelle
~/.basyrc
automatisch von gelesen~./profile
, sodass alle in definierten Aliase~/.bashrc
auch 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 .Ich musste einen Teil meiner .bashrc kommentieren, der die Verwendung von Aliasen verhinderte, und einen Befehl expand_aliases hinzufügen. Dies wurde kommentiert
Und das wurde hinzugefügt
Dann funktionierte mein Befehl:
quelle