Esegui un comando in una shell interattiva con ssh dopo aver acquisito .bashrc


11

Voglio ssh in un computer Ubuntu remoto, fonte mio .bashrced eseguire un comando che dipende da parametri impostati da quello .bashrc. Tutto ciò in una shell interattiva che non si chiude al termine del comando.

Quello che ho provato fino ad ora è

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

o solo

ssh user@remote_computer -t "my_alias;bash"

Funziona con comandi generali (come lsad esempio) ma quando provo a eseguire un alias definito in .bashrcottengo un errore:

bash: my_alias: command not found

Ma poi quando lo scrivo di nuovo manualmente ed eseguo, funziona!

Quindi, come posso assicurarmi che il .bashrcsia originato prima che il comando venga chiamato?


Il post è confuso. Consiglio di non abusare di eseguire comandi simili; tuttavia, se viene invocato un comando bash o bash, direi che .bashrc dovrebbe essere eseguito. Esistono evidentemente alcune differenze o peculiarità nell'esecuzione di un comando del genere e, per applicazioni più serie, consiglierei Ansible o burattino.
Rui F Ribeiro,

Ho modificato la mia domanda. Il secondo comando è più semplice e fa lo stesso, ma ancora senza l'approvvigionamento di .bashrc prima.
Mehdi,

@RuiFRibeiro Abuse ?? come si può chiamare un abuso così semplice ?? eseguendo automaticamente un comando dopo aver effettuato l'accesso a una macchina remota con ssh, è semplice. Qualsiasi strumento esterno che verrebbe implementato per un compito così ridicolmente piccolo sarebbe eccessivo
Mehdi

1
Solo una figura di parlare, non era inteso per essere usato in un termine più ampio. Usali quando ne hai bisogno, tuttavia usarli non è così pacifico come sembra. Tuttavia, per riferimenti futuri, dai un'occhiata ad Ansible, rimarrai sorpreso dalla sua leggerezza. Spesso eseguo anche comandi tramite ssh.
Rui F Ribeiro,

Risposte:


9

Il problema è che si sta tentando di eseguire un alias in una shell non interattiva. Quando corri ssh user@computer command, commandviene eseguito in modo non interattivo.

Le shell non interattive non leggono gli alias (da man bash):

Gli alias non vengono espansi quando la shell non è interattiva, a meno che l'opzione di shell expand_aliases sia impostata utilizzando shopt (vedere la descrizione di shopt sotto COMANDI INCORPORATI SHELL di seguito).

Funziona se lo esegui di nuovo manualmente perché il bashcomando finale avvia una shell interattiva in modo che i tuoi alias siano ora disponibili.

In alternativa, è possibile avviare una shell interattiva ( bash -i) anziché una semplice shell di accesso ( bash -l) sul computer remoto per eseguire l'alias:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

Questo sembra un approccio molto complicato però. Non hai spiegato perché esattamente devi farlo ma considera queste alternative:

  1. Basta avviare una normale shell interattiva di accesso sul computer remoto ed eseguire il comando manualmente:

    user@local $ ssh user@remote
    user@remote $ my_alias
  2. Se vuoi sempre che questo alias venga eseguito quando ti colleghi a questo computer, modifica il ~/.profile(o ~/.bash_profile, se presente) del computer remoto e aggiungi questa riga alla fine:

    my_alias

    Perché ~/.profileviene letto ogni volta che viene avviata una shell di accesso (quindi, ogni volta che ci si connette tramite ssh, ad esempio), ciò verrà my_aliaseseguito ogni volta che ci si connette.

    Si noti che, per impostazione predefinita, le shell di accesso leggono ~/.profileo ~/.bash_profileignorano ~/.bashrc. Alcune distribuzioni (Debian e suoi derivati ​​e Arch, per esempio), come Ubuntu hanno il loro default ~/.profileo la ~/.bash_profilefonte dei file, il ~/.bashrcche significa che i tuoi alias definiti ~/.bashrcsaranno disponibili anche in una shell di login. Questo non è vero per tutte le distribuzioni, quindi potresti dover modificare ~/.profilemanualmente il tuo sorgente per averlo ~/.bashrc. Si noti inoltre che, se ~/.bash_profileesiste, ~/.profileverrà ignorato da bash.


Quindi suggeriresti di avere gli alias definiti in un alias_profile e di chiamarli da .profile o .bash_profile?
Mehdi,

@Mehdi che dipenderà da cosa vuoi fare. Sul tuo sistema Ubuntu, ~/.basyrcviene letto automaticamente ~./profile, quindi tutti gli alias definiti ~/.bashrcsaranno disponibili anche per qualsiasi lettura di shell ~/.profile. Tutto quello che dovevi veramente fare per farlo funzionare era avviare esplicitamente una shell interattiva ( -i).
terdon

5

Ho dovuto commentare una parte del mio .bashrc che ha impedito l'utilizzo degli alias e l'aggiunta di un comando expand_aliases. Questo è stato commentato

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

E questo è stato aggiunto

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

Quindi il mio comando ha funzionato:

ssh user@remote_computer -t "my_alias;bash"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.