Crea un file dopo che l'accesso ssh è passato a prompt
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
Con bash
puoi fare:
ssh -t user@host '
PROMPT_COMMAND="source /tmp/my-rc
unset PROMPT_COMMAND
" exec bash --norc'
Il che farebbe sì /tmp/my-rc
che venga prelevato prima del prompt, e solo quel prompt poiché siamo disimpostati in PROMPT_COMMAND
seguito.
Ti consigliamo di rimuovere il unset PROMPT_COMMAND
se in /tmp/my-rc
realtà 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).
Dato che puoi scrivere sull'host remoto /tmp
, puoi creare una /tmp/myhome
directory su di esso, mettere lì il profilo della shell ei file di inizializzazione e quindi avviare Zsh con ZDOTIDR
impostato su /tmp/myhome
e Bash con HOME
impostato su /tmp/myhome
.
Per impostazione predefinita, Zsh cerca i suoi file di inizializzazione in $ZDOTDIR
, l' impostazione predefinita di $HOME
if ZDOTDIR
non è 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 HOME
un 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/myhome
esiste già, ad esempio se ci si riconnette all'host remoto e si sa già che la directory è presente).
Tenendo ProxyCommand
conto 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 source
comando viene eseguito solo dopo che la shell interattiva è uscita.
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.
In genere lo fai in $HOME/.profile
o nelle varianti.
ssh
imposta le variabili d'ambiente che iniziano con SSH_
, puoi usarle per determinare se hai effettuato l'accesso tramite ssh
o direttamente.