Laden lokaler Shell-Aliase in ssh session dynamicaly

24

Wenn ich mich mit ssh auf einem Computer anmelde, wünsche ich mir, dass meine Aliase und Funktionen vorhanden sind. Mit anderen Worten, melden Sie sich bei einem Computer an, auf dem ich meine Befehlsverknüpfungen verwenden möchte.

Ich muss es dynamisch sein, jedes Mal, wenn ich mich anmelde, wünsche ich mir, ich hätte Aliase aktualisiert.

Anmerkungen: Sehr oft erfolgt die erstmalige Anmeldung, ohne dass Computer und Dateien bekannt sind. Manchmal ist es eine einmalige Anmeldung. Nur einmal für diesen Computer. Es muss danach gereinigt werden, die vorherige Konfiguration muss ebenfalls wiederhergestellt werden.

Tomek Wyderka
quelle

Antworten:

18

Sie können Ihre vorübergehend .bashrcunter einem anderen Namen auf Ihren Remotecomputer kopieren . Zum Beispiel mit .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Anschließend können Sie sich auf dem Remote-Computer anmelden:

user@local$ ssh user@remote

und sourcedie Datei .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Jetzt können Sie Ihre .bashrcund Ihre Funktionen nutzen. Wenn Sie mit Ihrer Arbeit fertig sind, können Sie die Datei ~ / .bashrc_temp auf dem Remote-Computer entfernen und sich abmelden.

Das Kopieren der Datei und das Anmelden auf dem Remote-Computer kann mit einer Bash-Funktion erfolgen:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Update :

Sie können auch zu kopieren die erwägen , .bashrcum /tmpauf Remote - Maschine und Quelle /tmp/.bashrc_temp.

Update 2 :

Sie können sich mit ssh -t bei der Remote-Maschine anmelden . Dies wird automatisch Ihr Temp .bashrc. Verwenden . Aktualisierte Funktion s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
jens-na
quelle
Das ist definitiv was ich suche. Vielen Dank! Aber ist es möglich, es funktionaler zu machen? In einem Schritt? Denn jetzt brauchen wir 3 Schritte: Einloggen, Quelle, Löschen vor dem Abmelden.
OK, ich sehe jetzt nach deinem Update. Groß. Noch ein Fix: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"
Ich habe dein Update zu meinem Update 2 hinzugefügt. Danke.
5
Fast alle Antworten (einschließlich dieser) verwenden einen vorhersehbaren Dateinamen in /tmp/. Dies kann trivialerweise von jedem anderen Benutzer ausgenutzt werden, um Code als Benutzer auszuführen, der sich anmeldet. Dies sollte verwenden mktemp, um sicherzustellen, dass die temporäre Datei einen eindeutigen Namen hat.
Tometzky
9

jens-na hat eine hervorragende antwort geliefert. Ich habe ein bisschen Zeit verbracht und es ein bisschen überarbeitet, um ein bisschen besser zu arbeiten. Auf diese Weise können Sie jeden Parameter an SSH übergeben, z. B. Portnummern. Der Unterschied besteht darin, dass der sshBefehl zum Hochladen der .bashrcDatei verwendet wird, anstatt scpdass andere Befehlsparameternamen verwendet werden.

Sie werden auch feststellen, dass eine andere Datei hochgeladen wird .bashrc_remote, sodass Sie anstelle von allem genau auswählen können, welche Quelle Sie auf Remote-Servern verwenden möchten

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Führen Sie es wie folgt aus:

sshs user@server

Der Name ' sshs' steht für "SSH Source". Verwenden sshSie diese Option, wenn Sie keine Quelle verwenden möchten, und verwenden sshsSie sie, wenn Sie dies tun.

https://gist.github.com/jonahbron/5549848

Jona
quelle
Das ist nützlich. Die gleichen Parameter müssen nicht in ~ / .ssh / config eingetragen werden, nur um eine andere Port-Nr. Anzugeben!
Tomek Wyderka
Da es der gleiche Befehl Name ist, ist es vielleicht möglich , sie in einem Durchlauf zu tun, und das Kennwort nur einmal ... Leider Ihre Befehle in einen Bericht Beitritt:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka
@TomekWyderka Ja, ich habe ungefähr 20 Minuten lang versucht, es auf einen Befehl zu bringen, aber keinen Weg gefunden. Vielleicht eine Person, die mehr Erfahrung mit Bash hat, als ich herausfinden konnte, aber es scheint nicht möglich zu sein.
Jonah
2
Ich habe diese Antwort genommen und einige Wochen lang wiederholt. Das Ergebnis ist ein ausgewachsenes Tool, das das Problem beseitigt: github.com/Russell91/sshrc
RussellStewart
1
@Jonah, kannst du mir erklären, warum du $ {*: 1} anstelle von $ @ verwendet hast?
RussellStewart
8

Ich denke, Sie suchen nach sshrc: https://github.com/Russell91/sshrc

sshrc funktioniert genau wie ssh, aber es gibt auch ~ / .sshrc aus, nachdem Sie sich remote angemeldet haben.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Hiermit können Sie Umgebungsvariablen festlegen, Funktionen definieren und Befehle nach der Anmeldung ausführen. So einfach ist das und wirkt sich nicht auf andere Benutzer auf dem Server aus - auch wenn sie sshrc ebenfalls verwenden. Lesen Sie für eine erweiterte Konfiguration weiter.

RussellStewart
quelle
Nett. Ich mag den xxd Hack!
Tomek Wyderka
@Tomek - ja, der xxd-Hack ist absolut großartig. Ich habe wirklich versucht, den Job mit scp zu erledigen. Dann mit Piping in SSH. Ohne 2 Anrufe an den Server geht es einfach nicht - 2 Passworteingaben - 2 Roundtrips. Das war inakzeptabel. Also habe ich das Undenkbare getan.
RussellStewart
Ich habe einen Bug. sshrc bleibt ohne antwort hängen. Können Sie etwas Debug-Code (kann in den Kommentaren sein) in sshrc, damit ich es verfolgen kann.
Tomek Wyderka
Interessant. Es ist nur ein Bash-Skript, sodass normalerweise alle Fehler oder Warnungen, die ausgegeben werden, automatisch auf dem Bildschirm angezeigt werden. Wie viele Bytes enthält Ihre .sshrc.d? Geben Sie einfach ein vim $(which sshrc)und Sie können die Bash-Datei sehen. Sie können nach jeder Zeile Echobefehle einfügen, um zu sehen, wo sie hängen.
RussellStewart
5

Ich bin mir der Einschränkungen nicht sicher, aber ich habe es geschafft, dies mit etwas wie Folgendem zum Laufen zu bringen:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
Brad
quelle
Dies ist die beste Antwort für mich, da es sich um einen einzelnen SSH-Befehl handelt, kein SCP-Zeug. Die einzige verbleibende Verbesserung für mich wäre, einen Weg zu finden, um die RC_DATAVariable zu vermeiden .
Sridhar Sarnobat
2

Das habe ich mir ausgedacht. Sie können damit eine normale rc-Datei verwalten, aber auch alles in einer ssh-Verbindung erledigen (dh Sie müssen sich nur einmal anmelden, anstatt zuerst einen scp auszuführen).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Ich bin mir nicht sicher, wie groß diese RC-Datei sein kann, da sie irgendwann maximal werden könnte.

mlathe
quelle
Ich musste einen Teil des Befehls in einfache Anführungszeichen setzen, damit dies richtig funktionierte. echo '`base64 .... sh`' - danach hat es wunderbar funktioniert. Vielen Dank!!
K Robinson
Wenn die Größe ein Problem darstellt, können Sie den Inhalt der Datei vor der Base64-Codierung mit einem Komprimierungsprogramm wie gzip weiterleiten.
K Robinson
2

Ich denke, dass https://github.com/fsquillace/pearl-ssh das tut, was Sie brauchen.

Ich habe es vor langer Zeit geschrieben, bevor sshrc geboren wurde, und es hat mehr Vorteile im Vergleich zu sshrc:

  • Es sind keine Abhängigkeiten von xxd für beide Hosts erforderlich (die auf einem Remote-Host möglicherweise nicht verfügbar sind).
  • Pearl-ssh verwendet einen effizienteren Kodierungsalgorithmus
  • Es sind nur ~ 20 Codezeilen (wirklich leicht zu verstehen!)

Zum Beispiel:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
user967489
quelle
1

Eine Möglichkeit, es mit einer einzelnen SSH-Sitzung zum Laufen zu bringen, besteht darin, eine Variable zum Speichern Ihrer Bash-Datei zu verwenden, anstatt sie zu kopieren.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Scheint für mich zu arbeiten.

gibsop1
quelle
1

Ich wollte ein Problem wie das Ihre lösen und stellte fest, dass ich wirklich nach sshfs suchte. Vielleicht kannst du es auch benutzen?

Mein Problem war, dass ich beim ssh'ing meine Farben, Aliase, Funktionen und Skripte fernhalten wollte.

http://fuse.sourceforge.net/sshfs.html

Vergöttert
quelle
Lol, das ist mir auch nie in den Sinn gekommen. Es ist eine ziemlich kreative Lösung.
Sridhar Sarnobat