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 .zshrc
fichier, et j'aimerais avoir un moyen de:
- Démarrer une session ssh dans la machine distante avec les directives de mon fichier de configuration ssh (par exemple
ControlMaster auto
) - Cette session exécute un shell Z
- Il exécute un
.zshrc
dans 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 LocalCommand
pour 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 config
fichier quelle commande exécuter à distance après la connexion au serveur, mais il ne semble pas y en avoir.
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?.zshrc
dans 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 euFPATH variable not defined
, et je pense que c'est parce qu'ilzsh
termine avant qu'il ne fonctionnemy_zshrc
, encore moins que cela ne m'a pas donné de coque Z)Réponses:
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.
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:
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_keys
sur le serveur (le tout sur une seule ligne):la source
exec
commande. En quoi est-ceexec zsh
différent d'appelerzsh
directement? Pourquoi est-ce important dans ce cas particulier?ssh -t [email protected] 'HOME=~/bob; exec zsh'
je reçoisHOME=~/bob: command not found
. Je pense que je suis surtcsh
. J'obtiens le même problème si j'essayeHOME=/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.exec
remplace le shell d'origine par zsh; sanszsh
, 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, utilisezsetenv HOME ~/bob; exec zsh
. Enfin, puisque zsh est démarré sans argument, vous obtenez une session shell, comme si vous veniez de lancerssh
et que zsh était votre shell de connexion.exec zsh
commande?ZDOTDIR
pour 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 ajoutereval $LC_STARTUP_CODE
à$ZDOTDIR/.zshrc
et passer le code à exécuter dans la variable d'environnementLC_STARTUP_CODE
.Pour exécuter une commande à distance après avoir connecté le serveur, ajoutez dans votre fichier .ssh / config l'extrait de code suivant
la source
LocalCommand
directive consiste à exécuter une commande sur le shell local , pas sur le shell distant .