Crea un file dopo che l'accesso ssh è passato a prompt

Aug 16 2020

Domanda di una riga: come faccio a generare automaticamente un file remoto su un host remoto dopo aver effettuato l'accesso tramite SSH tramite un host bastion?

Ho bisogno di creare un file contenente un elenco di alias + funzioni definite dall'utente di shell su un host remoto dopo aver inserito ssh in esso.

Il file esiste nella lavorazione remota nella cartella / tmp, ad esempio / tmp / my-rc

Cercando altri post e internet ho trovato

ssh -t [email protected] 'source /tmp/my-rc; bash -l'

Il problema è che ottengo un terminale, ma nessuno degli alias è impostato poiché è una nuova shell bash '

Pensando, che il sorgente dovrebbe essere fatto dopo che la shell è stata collegata, ho provato quanto segue ma anche questo non funziona. Non ci sono errori, ottengo il terminale ma non credo che il file sia stato originato (verificato facendo eco a un messaggio fittizio da / tmp / my-rc file)

ssh -t [email protected] 'bash -l; source /tmp/my-rc'

Anche provato con "." invece di fonte, senza fortuna.

Qualsiasi aiuto.

Nota 1: Bash o ZSH andrebbe bene qualsiasi soluzione di shell.

Nota 2: L'attuall ssh avviene tramite un comando proxy, ovvero un salto su bastion host (solo menzionando se è rilevante)

Nota 3: non ho il privilegio di un profilo rc o bashrc o anche di una home directory sull'host remoto.

Nota4: il comando esatto che ho usato per accedere all'host sicuro è tramite bastion host come di seguito

ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122  

Risposte

4 StéphaneChazelas Sep 01 2020 at 23:09

Con bashpuoi fare:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

Il che farebbe sì /tmp/my-rcche venga prelevato prima del prompt, e solo quel prompt poiché siamo disimpostati in PROMPT_COMMANDseguito.

Ti consigliamo di rimuovere il unset PROMPT_COMMANDse in /tmp/my-rcrealtà finisce per definirlo.

Quanto sopra presume che la shell di login dell'utente remoto sia simile a Bourne, ma dovresti essere in grado di adattarla alla maggior parte degli altri tipi di shell (csh / rc / fish).

2 fra-san Sep 01 2020 at 22:30

Dato che puoi scrivere sull'host remoto /tmp, puoi creare una /tmp/myhomedirectory su di esso, mettere lì il profilo della shell ei file di inizializzazione e quindi avviare Zsh con ZDOTIDRimpostato su /tmp/myhomee Bash con HOMEimpostato su /tmp/myhome.

Per impostazione predefinita, Zsh cerca i suoi file di inizializzazione in $ZDOTDIR, l' impostazione predefinita di $HOMEif ZDOTDIRnon è impostata.

Quindi, puoi avviare Zsh sull'host remoto come:

ssh -t user@host ZDOTDIR=/tmp/myhome zsh

E Bash come:

ssh -t user@host HOME=/tmp/myhome bash

Ovviamente puoi essere creativo con il tuo profilo / file di inizializzazione, ad esempio usali per impostare HOMEun percorso più adatto, fonte di altri file (se ti è capitato di avere già file punto da qualche parte sull'host remoto), ecc.

Un'applicazione minima di questo approccio, condensata in un comando, potrebbe essere:

ssh -t user@host 'mkdir /tmp/myhome
  echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
  HOME=/tmp/myhome bash'

(Utilizzare mkdir -p ...per evitare che venga visualizzato un errore quando /tmp/myhomeesiste già, ad esempio se ci si riconnette all'host remoto e si sa già che la directory è presente).

Tenendo ProxyCommandconto di ciò, potrebbe essere:

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'

Infine, riguardo ai tuoi tentativi: ssh -t [email protected] 'bash -l; source /tmp/my-rc'non funziona perché il sourcecomando viene eseguito solo dopo che la shell interattiva è uscita.

1 jakethefinn Sep 04 2020 at 19:40

Se UsePAM è impostato su yes nel file sshd_config degli host remoti, il file di configurazione /etc/pam.d/sshd consente di automatizzare l'esecuzione del comando in caso di login riuscito, tra gli altri eventi nel processo di autenticazione. Aggiungi questa riga di codice

session    required     pam_exec.so /etc/myscripts/./sourcing-script

direttamente sopra queste linee

# 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

dove / etc / myscripts / sourcing-script è semplicemente un file sull'host remoto con il comando da eseguire dopo il login riuscito.

#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log

Uso questo metodo per arrestare un servizio e segnalarlo a un file di registro, prima che la mia sessione ssh venga aperta. Prima di disconnettermi, ho impostato un crontab per avviare il servizio, quindi non viene mai eseguito in parallelo con la mia sessione ssh.

dirkt Aug 16 2020 at 13:40

In genere lo fai in $HOME/.profileo nelle varianti.

sshimposta le variabili d'ambiente che iniziano con SSH_, puoi usarle per determinare se hai effettuato l'accesso tramite ssho direttamente.