comment désactiver les variables SendEnv définies dans ssh_config à partir de ~ / .ssh / config

30

Je n'ai pu trouver cela nulle part, donc je me demande si je suis le seul à avoir un tel problème.

Par défaut, ssh sur Red Hat et Debian a au moins un ssh_config avec l'option SendEnv passant les variables LC * et LANG dans la session distante. Si l'on n'est pas root pour changer / etc / ssh / ssh_config, comment peut-il désactiver ce comportement? L'option SendEnv semble s'accumuler et je ne vois aucun moyen de la réinitialiser.

Et pour éviter qu'on me le demande, je dois éviter de transmettre mes paramètres régionaux aux machines de test pour éviter les effets secondaires sur les scripts et les programmes qui dépendent des paramètres régionaux comme paramètres par défaut pour la machine.

akostadinov
la source
Ce n'est pas une réponse à votre question, mais pouvez-vous résoudre votre problème en appelant les scripts et les programmes sur vos machines de test via envou avec un script wrapper?
Scott
2
oui, des solutions de contournement sont possibles mais incommodes
akostadinov

Réponses:

18

Tu n'es pas le seul . Comme documenté dans, ssh_config(5)vous ne pouvez pas annuler SendEnv, car

Plusieurs variables d'environnement peuvent être réparties sur [...] plusieurs directives SendEnv.

Si vous avez root sur les machines de test, vous pouvez changer AcceptEnvpour ne pas accepter les variables envoyées par le client.

Ansgar Wiechers
la source
4
merde, je vois que -F sur la ligne de commande peut aider mais c'est trop gênant pour vraiment l'utiliser. Voir bugzilla.mindrot.org/show_bug.cgi?id=1285
akostadinov
5

Cela ne peut pas être fait ~/.ssh/configcar SendEnvne peut pas être remplacé.

L'utilisation d'alias ne fonctionnera pas pour les scripts qui appellent ssh.

Une alternative consiste à exporter une fonction. Par exemple dans ~/.bashrc:

function ssh() {
    LANG="en_US.UTF-8" \
    LC_ADDRESS="$LANG" \
    LC_IDENTIFICATION="$LANG" \
    LC_MEASUREMENT="$LANG" \
    LC_MONETARY="$LANG" \
    LC_NAME="$LANG" \
    LC_NUMERIC="$LANG" \
    LC_PAPER="$LANG" \
    LC_TELEPHONE="$LANG" \
    LC_TIME="$LANG" \
    LC_ALL="$LANG" \
    /usr/bin/ssh $@
}
export -f ssh
Fernando Correia
la source
1

Il y a l'option SetEnv, on peut forcer LANGà une valeur spécifique avant de l'envoyer.

La page de manuel indique également que

Il est possible d'effacer les noms de variables SendEnv précédemment définis en préfixant les modèles avec -.

mais je n'ai pas réussi à faire ça.

burunduk3
la source
Voir bugzilla.mindrot.org/show_bug.cgi?id=1285 , cela expliquera probablement pourquoi l' -approche n'a pas fonctionné. Bonne suggestion cependant pour coder en dur LANG distant et d'autres vars dans la configuration ssh. Rend les choses plus prévisibles. Peut SetEnv- être est-ce une directive plus récente parce que personne d'autre ne l'a suggérée. SetEnv LANG=en_US.UTF-8
akostadinov
0

Si vous utilisez bash, vous pouvez configurer un alias ssh = 'LANG = command ssh' pour désactiver le passage de LANG aux autres serveurs.

Tharrrk
la source
0

Vous pouvez l'utiliser su - youruserlorsque vous êtes connecté via ssh. Cela réinitialisera l'environnement pour l'utilisateur.

En fait, vous initialisez une nouvelle session avec un nouvel environnement.

Lambert
la source
La question est d'avoir un environnement sain d'esprit automatiquement. Et btw su n'est pas toujours installé. Et vous devez taper votre mot de passe avec su. Pas utile. Il existe des solutions de contournement plus faciles.
akostadinov
0

Selon man ssh:

 -F configfile
         Specifies an alternative per-user configuration file.  If a con-
         figuration file is given on the command line, the system-wide
         configuration file (/etc/ssh/ssh_config) will be ignored.  The
         default for the per-user configuration file is ~/.ssh/config.

Ainsi, vous pouvez ssh sans vous y conformer/etc/ssh/ssh_config en spécifiant explicitement le fichier de configuration (par défaut) sur la ligne de commande ( ~/.ssh/configest OK pour être vide):

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

Vous pouvez en créer un alias dans ~/.bashrc:

alias ssh="ssh -F ~/.ssh/config"

Redémarrez le shell bash, puis vous pouvez simplement ssh comme ceci:

$ ssh your_user@your_host
Rockallite
la source
Voir mon commentaire ci-dessus. if one supplies on command line -F, then the system wide config is ignored according to man pagede bugzilla.mindrot.org/show_bug.cgi?id=1285 ; c'est une option mais pas vraiment la fonctionnalité souhaitée.
akostadinov