Mon équipe est responsable de milliers de machines Linux / Unix, donc naturellement le compte root est "partagé" entre les administrateurs. Je préfère le mode vi, d'autres préfèrent le mode emacs.
Comment puis-je définir la ligne de lecture de bash en mode vi lors de la connexion SSH à n'importe quelle machine, sans forcer tout le monde à utiliser également le mode vi?
Essentiellement, j'aimerais avoir l'effet set -o vi
après la connexion sans avoir à le taper à chaque fois, et sans l'imposer à tout le monde (autant que le mode emacs me dérange, le mode vi le gêne).
Je sais que ce ne serait pas un problème si tout le monde utilisait ses propres comptes avec sudo pour exécuter des commandes privilégiées, mais en raison de circonstances indépendantes de ma volonté, ce n'est malheureusement pas une option.
set -o vi
avant de me donner le contrôle du shell.set -o vi
commande, puis passer en mode interactif.sshd
configure plusieurs variables d'environnement qui pourraient vous aider à déterminer qui est à l'autre bout. Par exemple,SSH_CLIENT
contient l'adresse IP de connexion (et le port sortant / entrant du client également). Jouer avec cela~/.bashrc
pourrait vous permettre de faire des choses juste pour vous .Réponses:
Voici une façon idiote de le faire, qui ne fonctionne vraiment bien qu'avec l'authentification par clé publique:
Tout d'abord, assurez-vous que votre machine locale est
nc
dessus.Deuxièmement, toujours sur votre machine locale, créez un script (je l'appellerai
connect-to-server
) et placez-le dans un endroit que vous${PATH}
connaissez *:Ensuite, modifiez le
.bashrc
sur le système distant pour inclure quelque part:Enfin, de retour sur votre machine locale, modifiez
~/.ssh/config
pour ajouter:Inconvénients de cette approche (et pourquoi je l'appelle stupide):
.yourname
fichier n'ait pas encore été supprimé, auquel cas il le recevraset -o vi
également.ssh serverNickname command
,command
s'exécutera, mais (puisqu'il.bashrc
n'est jamais fourni), le.yourname
fichier reste, il serait donc poli d'avoir un deuxième alias dans votre configuration ssh qui n'utilise pas le pseudo-proxy.En fait, le seul avantage de cette approche est que votre
ssh
commande n'a pas besoin de recevoir d'arguments supplémentaires.* Si vous ne voulez rien changer sur les systèmes distants, voici un pseudo-proxy alternatif qui crée un temporaire
.bashrc
:Cela a tous les mêmes inconvénients de l'autre méthode, vous voudrez donc toujours un deuxième alias dans votre
ssh
configuration qui n'invoque pas le pseudo-proxy.la source
J'irais pour:
mais si vous êtes administrateur, vous pouvez essayer quelque chose de plus propre. Par exemple, vous pouvez utiliser l'
SendEnv
option ssh côté client pour transmettre une variable spécifique, utiliserAcceptEnv
dans lasshd
configuration (côté serveur) pour l'accepter, et en fonction de cela, modifier le.bashrc
fichier racine pour ajuster le comportement en fonction de la valeur de la variable.Cela implique de changer la
sshd
configuration sur tous les hôtes ainsi que sur leurs.bashrc
. Ce n'est pas exactement une façon "autonome" de faire, cependant ...la source
Pour une solution côté client simple:
Cela échouera si les scripts d'initialisation du shell de la racine utilisent explicitement
set -o emacs
ou sont définisEDITOR
suremacs
, ou si le.initrc
fichier de la racine appelle lesemacs
raccourcis clavier.Le reste de cette réponse concerne les solutions côté serveur.
Cela fonctionne lorsque vous entrez
ssh
dans la machine et utilisez ensuitesudo -i
:Pour votre
/root/.bashrc
:Cela vous permet d'avoir un
bashrc
fichier personnel appelé/root/.bashrc-patrick
dans lequel vous pouvez faire ce que vous voulezset -o vi
.Combiner cela avec une approche quelque peu naïve pour choisir ce fichier rc en fonction de
$SSH_CLIENT
:Cela ne fonctionne évidemment que si vous vous connectez à partir de la même adresse IP tout le temps ...
Une autre approche qui utilise le champ de commentaire de la clé SSH particulière que vous utilisez, qui fonctionne si vous transférez l'agent SSH vers le serveur:
Cela sélectionne le champ de commentaire pour la clé que vous avez utilisée pour vous connecter au serveur. Le
head -n 1
est là au cas où vous auriez plusieurs clés dans leauthorized_keys
fichier.Vous pouvez ensuite utiliser
$ssh_comment
pour sélectionner un fichier rc à source, soit directement comme avec l'$SUDO_USER
approche ci-dessus (dans laquelle le commentaire dans$ssh_comment
peut nécessiter un nettoyage si c'est un nom de chemin), ou via unecase
instruction comme avec l'$SSH_CLIENT
approche.la source
SSH_CLIENT
etSUDO_USER
c'est ce que j'utilise actuellement, mais cela nécessite une modification côté serveur et ce n'est pas particulièrement fiable. J'espérais une solution purement côté client. Merci pour la suggestion.Si vous voulez vraiment le faire sans modification côté serveur, soit:
1) Exécutez quelque chose comme
Je ne pense pas que la documentation soit trop claire à ce sujet, mais elle
-o option
est mentionnée et semble fonctionner.2) Utilisation attendez:
Le
expect
script:Rendez-le exécutable et exécutez:
Cela suppose que vous pouvez vous connecter sans saisir de mot de passe (pour l'hôte distant ou pour vos clés), sinon le script attendu devrait en tenir compte. Mais avec beaucoup de machines, vous avez probablement déjà cela. De plus, je m'attendais à un signe dollar et à un espace, modifiez-le selon votre invite:
"# "
peut - être.Bien que si quelque chose imprimé avant l'invite inclut ces mêmes caractères, vous devrez inclure quelque chose de plus spécifique dans la chaîne attendue.
En outre, ce script ne prend pas en charge la fourniture d'arguments supplémentaires à
ssh
. Si vous allez donner une commande explicite à exécuter, vous n'avez probablement pas besoin de vi-mode, mais si vous avez besoin par exemple de tunneling de port, cela pourrait être un problème.Mais en tout cas, je pense vraiment que cela devrait être résolu sur les systèmes cibles avec des comptes séparés (
sudo
ou tout simplement l'ancien UID 0). Une configuration personnalisée serait également utile dans de nombreux autres cas, et en général, vous auriez un tas de fichiers de configuration et de variables d'environnement que vous souhaitez définir. (Considérez que les administrateurs peuvent ne pas s'entendre sur la valeur$EDITOR
, le contenuvirc
ou quoi que ce soit.)Il serait également plus facile de supprimer des utilisateurs avec des comptes séparés.
Toute façon de synchroniser des fichiers sur tous les hôtes résoudrait également trivialement cela en vous permettant de vous connecter avec quelque chose comme
ssh -t user@host 'patricks_shell.sh'
oussh -t user@host 'bash --rcfile patrick.rc'
.la source
interact
. Il n'existe pas, les invites peuvent être très différentes, tout comme les motds / sorties des profils. Merci pour la suggestion.vous pouvez avoir un fichier rc personnalisé en suivant ce guide:
Fichier rc utilisateur | Secure Shell: le guide définitif
ou injectez une action de ligne de commande dans votre fichier authorized_keys:
Config SSH exécuter automatiquement la commande à distance | Échange de pile Unix et Linux
la source