ssh, démarrer un shell spécifique et exécuter une commande sur la machine distante?

11

Je suis dans une situation où plusieurs utilisateurs partagent le même compte d'utilisateur sur une machine distante. J'ai un répertoire "personnel" où j'ai écrit mon propre .zshrcfichier, et j'aimerais avoir un moyen de:

  1. Démarrer une session ssh dans la machine distante avec les directives de mon fichier de configuration ssh (par exemple ControlMaster auto)
  2. Cette session exécute un shell Z
  3. Il exécute un .zshrcdans mon répertoire "personnel" (pas sur le répertoire personnel de l'utilisateur partagé)

Ce serait bien d'avoir un alias ou un moyen simple de démarrer de telles sessions ssh (c'est pourquoi j'ai pensé à utiliser le fichier de configuration d'OpenSSH), mais je suis ouvert à toute autre idée!

Vous utilisez le fichier de configuration d'OpenSSH?

J'ai lu sur la page de manuel ssh_config d'OpenSSH que je peux utiliser la directive LocalCommandpour spécifier une commande à exécuter localement après une connexion réussie au serveur. Cela m'a fait penser qu'il peut y avoir un moyen de dire au configfichier quelle commande exécuter à distance après la connexion au serveur, mais il ne semble pas y en avoir.

Amelio Vazquez-Reina
la source
Je ne pense pas que vous puissiez. Mais je suis perplexe quant à la raison pour laquelle vous voulez cela. Il y a déjà une commande sur la ligne de commande ssh. Pourquoi tu ne peux pas courir ssh mycommand? Et si vous souhaitez exécuter une commande de configuration avant chaque commande qui vient sur ssh, pourquoi ne pas configurer le côté serveur?
Gilles 'SO- arrête d'être méchant'
Merci @Guilles. Je suis dans une situation où plusieurs utilisateurs partagent le même compte distant, je voudrais donc configurer rapidement quelques éléments lorsque je me connecte à distance. Plus précisément, je voudrais démarrer un shell Z et lui demander d'exécuter un .zshrcdans un répertoire spécifique (c'est-à-dire un répertoire personnel "personnel"). J'ai essayé ssh -t host_name 'zsh & source /path/to/my_zshrc'mais cela n'a pas fonctionné (je l'ai eu FPATH variable not defined, et je pense que c'est parce qu'il zshtermine avant qu'il ne fonctionne my_zshrc, encore moins que cela ne m'a pas donné de coque Z)
Amelio Vazquez-Reina
Je pense que cela mérite une mise à jour du PO, donc je viens de le mettre à jour.
Amelio Vazquez-Reina
Ayant cherché une réponse similaire, il me semble que cette question est assez proche de ce que vous essayez de faire.
Gilles 'SO- arrête d'être méchant'

Réponses:

15

La façon la plus évidente d'exécuter une commande à distance est de la spécifier sur la ligne de commande ssh. La commande ssh est toujours interprétée par le shell de l'utilisateur distant.

ssh [email protected] '. ~/.profile; command_that_needs_environment_variables'
ssh -t [email protected] '. ~/.profile; exec zsh'

Les comptes partagés sont généralement une mauvaise idée; si possible, obtenez des comptes séparés pour chaque utilisateur. Si vous êtes bloqué avec un compte partagé, vous pouvez créer un alias:

ssh -t [email protected] 'HOME=~/bob; . ~/.profile; exec zsh'

Si vous utilisez l'authentification par clé publique (à nouveau, recommandé), vous pouvez définir des commandes par clé dans ~/.ssh/authorized_keys. Voir cette réponse pour plus d'explications. Modifiez la ligne de votre clé ~/.ssh/authorized_keyssur le serveur (le tout sur une seule ligne):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== [email protected]
Gilles 'SO- arrête d'être méchant'
la source
Fantastique @Guilles. Vos contributions à ce site en font une ressource extrêmement utile pour nous tous. Merci beaucoup, vraiment. Au fait, je ne connaissais pas la execcommande. En quoi est-ce exec zshdifférent d'appeler zshdirectement? Pourquoi est-ce important dans ce cas particulier?
Amelio Vazquez-Reina
Hmm, quand je cours, ssh -t [email protected] 'HOME=~/bob; exec zsh'je reçois HOME=~/bob: command not found. Je pense que je suis sur tcsh. J'obtiens le même problème si j'essaye HOME=/home/bob. J'ai essayé bash et zsh. Des indices sur ce qui pourrait en être la cause? Enfin, la syntaxe ci-dessus me laisserait-elle la session ssh ouverte? (ce que je veux). Merci encore.
Amelio Vazquez-Reina
1
@intrpc execremplace le shell d'origine par zsh; sans zsh, le shell d'origine resterait en mémoire jusqu'à ce que zsh se termine puis se ferme. La principale différence est d'économiser un peu de mémoire, ce n'est pas très important. Si votre shell de connexion est (t) csh, utilisez setenv HOME ~/bob; exec zsh. Enfin, puisque zsh est démarré sans argument, vous obtenez une session shell, comme si vous veniez de lancer sshet que zsh était votre shell de connexion.
Gilles 'SO- arrête d'être méchant'
Merci encore pour votre aide. Une question de suivi ici. Est-il possible d'exécuter plus de commandes, après la exec zshcommande?
Amelio Vazquez-Reina
1
@ AmelioVazquez-Reina Pas commodément, sauf si vous avez un certain contrôle sur l'un des fichiers de points. Vous pouvez définir la variable d'environnement ZDOTDIRpour que zsh recherche les fichiers dot dans un répertoire différent. Si vous avez un certain contrôle sur les fichiers de points, vous pouvez faire quelque chose comme ajouter eval $LC_STARTUP_CODEà $ZDOTDIR/.zshrcet passer le code à exécuter dans la variable d'environnement LC_STARTUP_CODE.
Gilles 'SO- arrête d'être méchant'
-3

Pour exécuter une commande à distance après avoir connecté le serveur, ajoutez dans votre fichier .ssh / config l'extrait de code suivant

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
parth115
la source
2
Merci @ user626129, mais comme je l'ai mentionné dans la question d'origine, la LocalCommanddirective consiste à exécuter une commande sur le shell local , pas sur le shell distant .
Amelio Vazquez-Reina