Quelle eine Datei, nachdem die SSH-Anmeldung zur Eingabeaufforderung gelöscht wurde

Aug 16 2020

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

4 StéphaneChazelas Sep 01 2020 at 23:09

Mit bashkö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_COMMANDdanach deaktiviert haben .

Sie möchten das unset PROMPT_COMMANDif entfernen, um es /tmp/my-rctatsä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.

2 fra-san Sep 01 2020 at 22:30

Da Sie auf den Remote-Host schreiben können /tmp, können Sie ein /tmp/myhomeVerzeichnis darauf erstellen , das Profil und die Initialisierungsdateien Ihrer Shells dort ablegen und dann Zsh mit ZDOTIDRset to /tmp/myhomeund Bash mit HOMEset to starten /tmp/myhome.

Standardmäßig sucht Zsh nach seinen Initialisierungsdateien in $ZDOTDIR, wobei standardmäßig $HOMEif ZDOTDIRnicht 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 HOMEeinen 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/myhomebereits 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 ProxyCommandkö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 sourceBefehl erst ausgeführt wird, nachdem die interaktive Shell beendet wurde.

1 jakethefinn Sep 04 2020 at 19:40

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.

dirkt Aug 16 2020 at 13:40

Normalerweise tun Sie dies in $HOME/.profileoder in Varianten.

sshSSH_Wenn Umgebungsvariablen festgelegt werden , können Sie anhand dieser Variablen bestimmen, ob Sie sich über sshoder direkt angemeldet haben .