ssh, avvia una shell specifica ed esegui un comando sul computer remoto?


11

Sono in una situazione in cui diversi utenti condividono lo stesso account utente su una macchina remota. Ho una directory "personale" in cui ho scritto il mio .zshrcfile e vorrei avere un modo per:

  1. Avvio di una sessione ssh nel computer remoto con direttive dal mio file di configurazione ssh (ad es. ControlMaster auto)
  2. Questa sessione esegue una shell Z.
  3. Esegue una .zshrcnella mia directory "personale" (non nella home directory dell'utente condiviso)

Sarebbe bello avere un alias o un modo semplice di avviare tali sessioni ssh (ecco perché ho pensato di usare il file di configurazione di OpenSSH), ma sono aperto a qualsiasi altra idea!

Usando il file di configurazione di OpenSSH?

Ho letto sulla pagina man ssh_config di OpenSSH che posso usare la direttiva LocalCommandper specificare un comando da eseguire localmente dopo essermi connesso con successo al server. Questo mi ha fatto pensare che potrebbe esserci un modo per dire al configfile quale comando eseguire in remoto dopo la connessione al server, ma non sembra esserci.


Non penso che tu possa. Ma sono perplesso sul perché lo desideri. C'è già un comando sulla riga di comando ssh. Perché non puoi correre ssh mycommand? E se vuoi eseguire qualche comando di installazione prima di ogni comando che arriva su ssh, perché non configurare il lato server?
Gilles 'SO- smetti di essere malvagio' il

Grazie @Guilles. Sono in una situazione in cui più utenti condividono lo stesso account remoto, quindi vorrei configurare rapidamente alcune cose mentre eseguo l'accesso in remoto. Più specificamente, vorrei avviare una shell Z e chiedergli di eseguire una .zshrcin una directory specifica (cioè una home directory "personale"). Ho provato ssh -t host_name 'zsh & source /path/to/my_zshrc'ma non ha funzionato (ho FPATH variable not definedcapito, e penso che sia perché zshfinisce prima che funzioni my_zshrc, figuriamoci questo non mi ha dato una shell Z)
Amelio Vazquez-Reina

Penso che questo meriti un aggiornamento del PO, quindi l'ho appena aggiornato.
Amelio Vazquez-Reina,

Avendo cercato una mia risposta simile, mi viene in mente che questa domanda è abbastanza vicina a ciò che stai cercando di fare.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


15

Il modo più ovvio per eseguire un comando in remoto è specificarlo sulla riga di comando ssh. Il comando ssh è sempre interpretato dalla shell dell'utente remoto.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

Gli account condivisi sono generalmente una cattiva idea; se possibile, ottenere account separati per ogni utente. Se sei bloccato con un account condiviso, puoi creare un alias:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

Se si utilizza l'autenticazione con chiave pubblica (di nuovo, consigliata), è possibile definire i comandi per chiave in ~/.ssh/authorized_keys. Vedi questa risposta per ulteriori spiegazioni. Modifica la riga per la tua chiave ~/.ssh/authorized_keyssul server (tutto su una riga):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Fantastico @Guilles. I tuoi contributi a questo sito lo stanno rendendo una risorsa tremendamente utile per tutti noi. Grazie mille, davvero. A proposito, non sapevo del execcomando. In cosa exec zshdifferisce dalla chiamata zshdiretta? Perché è importante in questo caso particolare?
Amelio Vazquez-Reina,

Hmm, quando corro ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'ottengo HOME=~/bob: command not found. Penso di essere su tcsh. Ottengo lo stesso problema se provo HOME=/home/bob. Ho provato su bash e zsh. Qualche indizio su cosa potrebbe causare questo? Infine, la sintassi sopra mi lascerebbe aperta la sessione ssh? (quello che voglio). Grazie ancora.
Amelio Vazquez-Reina,

1
@intrpc execsostituisce la shell originale con zsh; senza zsh, la shell originale rimarrebbe in memoria fino a quando zsh esce e poi esce. La differenza principale sta nel risparmiare un po 'di memoria, non è molto importante. Se la shell di accesso è (t) csh, utilizzare setenv HOME ~/bob; exec zsh. Infine, poiché zsh viene avviato senza alcun argomento, si ottiene una sessione di shell, come si farebbe se si fosse appena eseguito sshe si avesse zsh come shell di accesso.
Gilles 'SO- smetti di essere malvagio' il

Grazie ancora per il vostro aiuto. Una domanda di follow-up qui. Un modo per eseguire più comandi, dopo il exec zshcomando?
Amelio Vazquez-Reina,

1
@ AmelioVazquez-Reina Non convenientemente a meno che tu non abbia un certo controllo su uno dei file dot. È possibile impostare la variabile di ambiente ZDOTDIRin modo che zsh cerchi i file dot in una directory diversa. Se si dispone di un certo controllo sui file di punti allora si può fare qualcosa di simile add eval $LC_STARTUP_CODEper $ZDOTDIR/.zshrce passare il codice da eseguire nella variabile d'ambiente LC_STARTUP_CODE.
Gilles 'SO- smetti di essere malvagio' il

-3

Per eseguire un comando in remoto dopo aver collegato il server, aggiungi nel tuo file .ssh / config il seguente frammento

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
Grazie @ user626129, ma come ho detto nella domanda originale, la LocalCommanddirettiva è di eseguire un comando sulla shell locale , non sulla shell remota .
Amelio Vazquez-Reina
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.