Mi equipo es responsable de miles de máquinas Linux / Unix, por lo que, naturalmente, la cuenta raíz se "comparte" entre los administradores. Prefiero el modo vi, otros prefieren el modo emacs.
¿Cómo puedo configurar la línea de lectura de bash en modo vi al iniciar sesión SSH en cualquier máquina, sin obligar a todos los demás a usar el modo vi también?
En esencia, me gustaría tener el efecto de set -o vi
después de iniciar sesión sin tener que escribirlo todo el tiempo, y sin forzarlo a todos los demás (por mucho que el modo emacs me moleste, el modo vi es molesto para ellos).
Sé que esto no sería un problema si todos usaran sus propias cuentas con sudo para ejecutar comandos privilegiados, pero debido a circunstancias fuera de mi control, lamentablemente no es una opción.
set -o vi
antes de darme el control del caparazón.set -o vi
comando y luego cambiar al modo interactivo.sshd
configura varias variables de entorno que pueden ayudarlo a determinar quién está en el otro extremo. Por ejemplo,SSH_CLIENT
contiene la dirección IP de conexión (y el puerto de salida / entrada del cliente también). Jugar con esto~/.bashrc
podría permitirte hacer cosas solo por ti .Respuestas:
Aquí hay una manera tonta de hacerlo, que realmente solo funciona bien con la autenticación de clave pública:
Primero, asegúrese de que su máquina local tenga
nc
puesta.En segundo lugar, aún en su máquina local, cree un script (lo llamaré
connect-to-server
) y colóquelo en un lugar que${PATH}
sepa *:A continuación, modifique el
.bashrc
en el sistema remoto para incluir en alguna parte:Finalmente, de vuelta en su máquina local, edite
~/.ssh/config
para agregar:Desventajas de este enfoque (y por qué lo llamo tonto):
.yourname
archivo aún no se haya eliminado, en cuyo caso también obtendrá el archivoset -o vi
.ssh serverNickname command
,command
se ejecutará, pero (dado.bashrc
que nunca se obtiene) el.yourname
archivo permanece, por lo que sería cortés tener un segundo alias en su configuración ssh que no use el pseudo-proxy.De hecho, el único aspecto positivo de este enfoque es que su
ssh
comando no necesita ningún argumento adicional.* Si no desea tener que cambiar nada en sistemas remotos, aquí hay un pseudo-proxy alternativo que crea un temporal
.bashrc
:Esto tiene las mismas desventajas del otro método, por lo que aún querría un segundo alias en su
ssh
configuración que no invoque el pseudo-proxy.fuente
Yo iría por:
pero si eres administrador, puedes probar algo más limpio. Por ejemplo, podría usar la
SendEnv
opción ssh en el lado del cliente para transmitir una variable específica, usarAcceptEnv
en lasshd
configuración (lado del servidor) para aceptarla y, en base a esto, modificar el.bashrc
archivo raíz para ajustar el comportamiento de acuerdo con el valor de la variable.Esto implica cambiar la
sshd
configuración en todos los hosts, así como en sus.bashrc
. Sin embargo, no es exactamente una forma "independiente" de hacer ...fuente
Para una solución fácil del lado del cliente:
Esto producirá un error si las secuencias de comandos shell de inicialización de la raíz explícitamente usos
set -o emacs
o conjuntosEDITOR
aemacs
, o si la raíz.initrc
invoca el archivo deemacs
las asociaciones de teclas.El resto de esta respuesta se refiere a soluciones del lado del servidor.
Esto funciona cuando está
ssh
entrando en la máquina y luego usasudo -i
:Para su
/root/.bashrc
:Esto le permite tener un
bashrc
archivo personal llamado/root/.bashrc-patrick
en el que puede hacer lo que quiera, comoset -o vi
.Combinando esto con un enfoque algo ingenuo para recoger ese archivo rc dependiendo de
$SSH_CLIENT
:Obviamente, esto solo funciona si te estás conectando desde la misma dirección IP todo el tiempo ...
Otro enfoque que utiliza el campo de comentarios de la clave SSH particular que está utilizando, que funciona si reenvía el agente SSH al servidor:
Esto selecciona el campo de comentarios para la clave que usó para conectarse al servidor. El
head -n 1
está allí en caso de que tenga varias de sus claves en elauthorized_keys
archivo.Luego, puede usar
$ssh_comment
para elegir un archivo rc a la fuente, ya sea directamente como con el$SUDO_USER
enfoque anterior (en el que el comentario$ssh_comment
puede necesitar una limpieza si se trata de un nombre de ruta), o mediante unacase
declaración como con el$SSH_CLIENT
enfoque.fuente
SSH_CLIENT
ySUDO_USER
es lo que uso actualmente, pero requiere modificación del lado del servidor y no es particularmente confiable. Esperaba una solución pura del lado del cliente. Gracias por la sugerencia sin embargo.Si realmente desea hacerlo sin modificaciones en el lado del servidor, ya sea:
1) Ejecuta algo como
No creo que la documentación sea demasiado clara al respecto, pero
-o option
se menciona y parece funcionar.2) Utilice esperar:
El
expect
guión:Hazlo ejecutable y ejecuta:
Esto supone que puede iniciar sesión sin ingresar contraseñas (para el host remoto o para sus claves), de lo contrario, el script esperado debería tener eso en cuenta. Pero con muchas máquinas es probable que ya tenga eso. Además, esperaba un signo de dólar y un espacio, edítelo según su solicitud:
"# "
tal vez.Aunque si algo impreso antes del aviso incluye esos mismos caracteres, deberá incluir algo más específico en la cadena esperada.
Además, ese script no admite dar argumentos adicionales a
ssh
. Si va a dar un comando explícito para ejecutarse, probablemente no necesite el modo vi, pero si necesita decir túnel de puerto, eso podría ser un problema.Pero en cualquier caso, realmente creo que esto debería resolverse en los sistemas de destino con cuentas separadas (
sudo
o simplemente UID 0 antiguo). La configuración personalizada también sería útil para muchos otros casos, y en general tendría un montón de archivos de configuración y variables de entorno que le gustaría establecer. (Tenga en cuenta que los administradores podrían no estar de acuerdo con el valor$EDITOR
o el contenido devirc
lo que sea).También eliminar usuarios sería más fácil con cuentas separadas.
Cualquier forma de sincronizar archivos en todos los hosts también resolvería trivialmente esto al permitirle iniciar sesión con algo como
ssh -t user@host 'patricks_shell.sh'
ossh -t user@host 'bash --rcfile patrick.rc'
.fuente
interact
. No existe, las indicaciones pueden ser muy diferentes, al igual que los motds / resultados de los perfiles. Gracias por la sugerencia sin embargo.puede tener un archivo rc personalizado siguiendo esta guía:
Archivo rc de usuario | Secure Shell: la guía definitiva
o inyecte una acción de línea de comando en su archivo autorizado_claves:
SSH config auto ejecutar comando remoto | Intercambio de pila de Unix y Linux
fuente