Cette question a déjà une réponse ici:
Comment puis-je passer une valeur dans une commande ssh, de telle sorte que l'environnement démarré sur la machine hôte démarre avec une certaine variable d'environnement définie à mon choix?
EDIT: le but est de transmettre le bureau kde actuel (de dcop kwin KWinInterface currentDesktop) au nouveau shell créé afin que je puisse renvoyer un emplacement nfs à mon instance JEdit sur le serveur d'origine, qui est unique pour chaque bureau KDE. (Utilisation d'un mécanisme comme emacsserver / emacsclient )
La raison pour laquelle de multiples instances ssh peuvent être en vol en même temps est que, lorsque je configure mon environnement, j'ouvre un tas d'instances ssh différentes à différentes machines.
la source
L'
SendEnv
option est ton gars.~ / .ssh / config: (localement)
/ etc / ssh / sshd_config: (du côté distant)
Désormais, quelle que soit la valeur de
$MYVAR
localement, elle devient également disponible dans la session distante.Si vous vous connectez plusieurs fois, chaque session aura sa propre copie
$MYVAR
, avec éventuellement des valeurs différentes.~/.ssh/environment
est destiné à d'autres fins. Cela agit en quelque sorte comme un$ENV
fichier lors de l’exécution à distance de commandes autres que le shell .la source
ssh myserver -o SendEnv="MYVAR"
, afin que vous puissiez le rendre dynamique dans les scripts.Vous pouvez transmettre des valeurs avec une commande similaire à celle-ci:
Vous pouvez tester avec:
Sur tcsh ce qui suit semble fonctionner:
la source
&&
). L'utilisation de bashexport VAR=value;
au lieu de setenv dans la troisième forme fonctionne dans ce cas.ssh user@host "$(<env_to_source.sh) command ..."
. Dans env à la source, j'aiexport var=value ;
sur des lignes séparées (rappelez-vous le point-virgule).Il y a aussi un horrible, horrible hack.
Si votre script utilise la variable du côté distant (vous pouvez le nommer comme vous le souhaitez), vous pouvez abuser des variables de paramètres régionaux. Toute variable de la forme LC_ * sera transmise telle quelle, sans aucune configuration.
Par exemple, l'un de mes clients dispose d'une série de serveurs bastion. Je déteste avoir à me connecter, juste pour me connecter à un autre serveur ... et à un autre serveur ... à chaque fois. J'ai un script qui se comporte exactement comme SSH, sauf qu'il est intelligent.
Fondamentalement, si LC_BOUNCE_HOSTS est défini, il est divisé en espaces et arrache le premier hôte. Ensuite, il rebondit et exécute le même script. Sur le nœud de destination, cette liste est éventuellement vide et la commande est donc exécutée. J'ai également un mode de débogage (ce qui est excellent lors de problèmes réseau), défini par LC_BOUNCE_DEBUG. Puisque ssh passe tout cela magiquement pour moi, je n'ai rien d'autre à faire que de reconnaître la fin de la liste d'hôtes (ce que je fais avec une option -).
Je me sens sale à chaque fois que j'utilise ceci, mais cela fonctionne partout où je l'ai essayé.
la source
ProxyCommand
option intégrée d'OpenSSH ? Modifiez votre~/.ssh/config
et ajoutez un bloc commeHost *.example.com: ProxyCommand -ssh -W %h:%p bastionhost
et laissez-le canaliser vos connexions pour vous.A Bash j'ai testé avec:
la source