Quelle eine Datei, nachdem die SSH-Anmeldung zur Eingabeaufforderung gelöscht wurde
Einzeiler-Frage: Wie kann ich eine Remote-Datei automatisch auf einem Remote-Host beziehen, nachdem ich mich über SSH über einen Bastion-Host angemeldet habe?
Ich muss eine Datei mit einer Liste von Aliasen + benutzerdefinierten Shell-Funktionen auf einem Remote-Host erstellen, nachdem ich sie eingegeben habe.
Die Datei befindet sich beim Remote-Maching im Ordner / tmp, z. B. / tmp / my-rc
Suche nach anderen Posts und Internet habe ich gefunden
ssh -t [email protected] 'source /tmp/my-rc; bash -l'
Das Problem ist, dass ich zwar ein Terminal bekomme, aber keiner der Aliase festgelegt ist, da es sich um eine neue Bash-Shell handelt. '
Der Gedanke, dass die Quelle nach dem Anhängen der Shell erstellt werden sollte, hat das Folgende versucht, aber dies funktioniert auch nicht. Es gibt keinen Fehler, ich erhalte das Terminal, glaube aber nicht, dass die Datei bezogen wurde (überprüft durch Echo einer Dummy-Nachricht aus der Datei / tmp / my-rc).
ssh -t [email protected] 'bash -l; source /tmp/my-rc'
Sogar mit '.' Versucht. statt Quelle kein Glück.
Irgendeine Hilfe.
Hinweis 1: Bash oder ZSH würde jede Shell-Lösung tun.
Hinweis 2: Das tatsächliche ssh erfolgt über einen Proxy-Befehl, dh einen Hop-over-Bastion-Host (nur erwähnen, ob es überhaupt relevant ist).
Hinweis 3: Ich habe keine Berechtigung für ein Profil rc oder bashrc oder sogar ein Home-Verzeichnis auf dem Remote-Host.
Hinweis 4: Der genaue Befehl, mit dem ich mich beim sicheren Host angemeldet habe, erfolgt über den Bastion-Host wie unten
ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122
Antworten
Mit bash
können Sie tun:
ssh -t user@host '
PROMPT_COMMAND="source /tmp/my-rc
unset PROMPT_COMMAND
" exec bash --norc'
Dies würde dazu führen /tmp/my-rc
, dass vor der Eingabeaufforderung eine Beschaffung erfolgt, und nur diese Eingabeaufforderung, da wir sie PROMPT_COMMAND
danach deaktiviert haben .
Sie möchten das unset PROMPT_COMMAND
if entfernen, um es /tmp/my-rc
tatsächlich zu definieren.
Oben wird davon ausgegangen, dass die Login-Shell des Remote-Benutzers Bourne-ähnlich ist. Sie sollten sie jedoch an die meisten anderen Arten von Shells (csh / rc / fish) anpassen können.
Da Sie auf den Remote-Host schreiben können /tmp
, können Sie ein /tmp/myhome
Verzeichnis darauf erstellen , das Profil und die Initialisierungsdateien Ihrer Shells dort ablegen und dann Zsh mit ZDOTIDR
set to /tmp/myhome
und Bash mit HOME
set to starten /tmp/myhome
.
Standardmäßig sucht Zsh nach seinen Initialisierungsdateien in $ZDOTDIR
, wobei standardmäßig $HOME
if ZDOTDIR
nicht festgelegt ist.
Daher können Sie Zsh auf dem Remote-Host wie folgt starten:
ssh -t user@host ZDOTDIR=/tmp/myhome zsh
Und Bash als:
ssh -t user@host HOME=/tmp/myhome bash
Natürlich können Sie mit Ihren Profil- / Initialisierungsdateien kreativ sein - z. B. verwenden Sie sie, um HOME
einen geeigneteren Pfad festzulegen , andere Dateien als Quelle zu verwenden (falls Sie zufällig bereits Punktdateien irgendwo auf dem Remote-Host haben) usw.
Eine minimale Anwendung dieses Ansatzes, zusammengefasst in einem Befehl, könnte sein:
ssh -t user@host 'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
(Verwenden Sie mkdir -p ...
diese Option , um zu verhindern, dass ein Fehler angezeigt wird, wenn er /tmp/myhome
bereits vorhanden ist, z. B. wenn Sie erneut eine Verbindung zum Remote-Host herstellen und bereits wissen, dass das Verzeichnis vorhanden ist.)
Unter Berücksichtigung Ihrer ProxyCommand
könnte es sein:
ssh -t -o ProxyCommand='ssh -W \
%h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
10.0.31.122 \
'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
Schließlich zu Ihren Versuchen: ssh -t [email protected] 'bash -l; source /tmp/my-rc'
funktioniert nicht, da der source
Befehl erst ausgeführt wird, nachdem die interaktive Shell beendet wurde.
Wenn UsePAM eingestellt ist ja in dem Remote - Hosts Datei sshd_config, dann Datei config /etc/pam.d/sshd können Ihnen Befehlsausführung nach erfolgreicher Anmeldung automatisieren, unter anderen Veranstaltungen in dem Authentifizierungsprozess. Fügen Sie diese Codezeile hinzu
session required pam_exec.so /etc/myscripts/./sourcing-script
direkt über diesen Linien
# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context. Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
Dabei ist / etc / myscripts / Sourcing-Script einfach eine Datei auf dem Remote-Host mit dem Befehl, der nach erfolgreicher Anmeldung ausgeführt werden soll.
#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log
Ich verwende diese Methode, um einen Dienst zu stoppen und in einer Protokolldatei zu melden, bevor meine SSH-Sitzung geöffnet wird. Bevor ich mich abmelde, habe ich eine Crontab eingerichtet, um den Dienst zu starten, sodass er niemals parallel zu meiner SSH-Sitzung ausgeführt wird.
Normalerweise tun Sie dies in $HOME/.profile
oder in Varianten.
ssh
SSH_
Wenn Umgebungsvariablen festgelegt werden , können Sie anhand dieser Variablen bestimmen, ob Sie sich über ssh
oder direkt angemeldet haben .