cargando alias de shell locales a la sesión ssh dinámicamente


24

Cuando inicio sesión en alguna máquina con ssh , deseo que mis alias y funciones estén allí. En otras palabras, inicie sesión en alguna máquina ojalá pueda usar mis atajos de comando.

Necesito que sea dinámico, cada vez que inicio sesión deseo tener alias actualizados.

Notas: Muy a menudo es la primera vez que inicia sesión, sin conocer la máquina y los archivos allí. A veces es un inicio de sesión único. Solo una vez para esa máquina. Debe limpiarse después, la configuración anterior también debe restaurarse.

Respuestas:


18

Puede copiar temporalmente su .bashrcmáquina remota con otro nombre. Por ejemplo, usando .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Luego puede iniciar sesión en la máquina remota:

user@local$ ssh user@remote

y sourceel archivo .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Ahora puede usar sus .bashrcy sus funciones. Cuando haya terminado con su trabajo, puede eliminar el archivo ~ / .bashrc_temp en la máquina remota y cerrar sesión.

La copia del archivo y el inicio de sesión en la máquina remota se pueden lograr con una función bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Actualización :

También puede considerar que copiar el .bashrcque /tmpen la máquina remota y la fuente /tmp/.bashrc_temp.

Actualización 2 :

Puede iniciar sesión en la máquina remota utilizando ssh -t . Esto usará automáticamente su temp .bashrc. Función actualizada s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Esto es definitivamente lo que estoy buscando. ¡Gracias! ¿Pero es posible hacerlo más funcional? En un paso? Porque ahora necesitamos 3 pasos: iniciar sesión, fuente, eliminar antes de cerrar sesión.

Bien, ahora veo después de su actualización. Excelente. Una solución más: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

He agregado su solución a mi actualización 2. Gracias.

55
Casi todas las respuestas (incluida esta) usan un nombre de archivo predecible en /tmp/. Esto puede ser explotado trivialmente por cualquier otro usuario para ejecutar cualquier código como un usuario que inicia sesión. Esto debería usarse mktemppara asegurarse de que el archivo temporal tenga un nombre único.
Tometzky

9

jens-na dio una excelente respuesta. Pasé un poco de tiempo y volví a trabajar un poco para trabajar un poco mejor. De esta manera, puede pasar cualquier parámetro a SSH, como los números de puerto. La diferencia es que usa el sshcomando para cargar el .bashrcarchivo, en lugar de scpusar nombres de parámetros de comando diferentes.

También notará que carga un archivo diferente .bashrc_remote, para que pueda seleccionar exactamente lo que desea obtener en servidores remotos, en lugar de todo

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Ejecútelo de la siguiente manera:

sshs user@server

El nombre ' sshs' es para "SSH Fuente". Úselo sshcuando no desee obtenerlo y úselo sshscuando lo desee.

https://gist.github.com/jonahbron/5549848


Eso es útil El mismo conjunto de parámetros, no es necesario agregar una entrada a ~ / .ssh / config solo para especificar un número de puerto diferente.
Tomek Wyderka

Dado que es el mismo nombre de comando, tal vez sea posible hacerlo de una vez, y escriba la contraseña solo una vez ... Desafortunadamente, uniendo sus comandos en uno de los informes:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka Sí, intenté durante unos 20 minutos reducirlo a un solo comando, pero no encontré la manera. Tal vez una persona más conocedora de BASH de lo que podría entender, pero no parece ser posible.
Jonás

2
Tomé esta respuesta y la repetí durante algunas semanas. El resultado es una herramienta completa que resuelve
RussellStewart

1
@ Jonás, ¿puedes explicarme por qué usaste $ {*: 1} en lugar de $ @.
RussellStewart

8

Creo que sshrc es lo que estás buscando: https://github.com/Russell91/sshrc

sshrc funciona igual que ssh, pero también genera ~ / .sshrc después de iniciar sesión de forma remota.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Puede usar esto para establecer variables de entorno, definir funciones y ejecutar comandos posteriores al inicio de sesión. Es así de simple y no afectará a otros usuarios en el servidor, incluso si también usan sshrc. Para una configuración más avanzada, continúe leyendo.


Agradable. Me gusta el hack xxd!
Tomek Wyderka

@Tomek: sí, el hack xxd es completamente increíble. Realmente intenté hacer el trabajo con scp. Luego con tubería en ssh. Simplemente no se puede hacer sin 2 llamadas al servidor - 2 entradas de contraseña - 2 viajes de ida y vuelta. Fue inaceptable. Entonces hice lo impensable.
RussellStewart

Tengo un error sshrc se cuelga sin respuesta. ¿Puedes poner algún código de depuración (puede estar en los comentarios) en sshrc para que pueda rastrearlo?
Tomek Wyderka

Interesante. Es solo un script bash, por lo que generalmente cualquier error o advertencia que se arroje se imprimirá automáticamente en la pantalla. ¿Cuántos bytes hay en su .sshrc.d? Además, solo escriba vim $(which sshrc)y podrá ver el archivo bash. Puede agregar comandos de eco después de cada línea para ver dónde se cuelga.
RussellStewart

5

No estoy seguro de las limitaciones, pero pude hacer que esto funcione con algo como:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

Esta es la mejor respuesta para mí porque es un solo comando ssh, sin cosas scp. La única mejora restante para mí sería encontrar una manera de evitar la RC_DATAvariable.
Sridhar Sarnobat

2

Esto es lo que se me ocurrió. Le permite mantener un archivo rc normal, pero también hacer todo en una conexión ssh (es decir, solo necesita iniciar sesión una vez en lugar de hacer un scp primero).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Sin embargo, no estoy seguro de qué tan grande puede ser ese archivo rc, ya que podría llegar al límite en algún momento.


Tuve que ajustar parte del comando entre comillas simples para que esto funcionara correctamente. echo '' base64 ... sh '' - después de eso, funcionó maravillosamente ¡¡Gracias!!
K Robinson

Si el tamaño se convierte en un problema, puede canalizar el contenido del archivo a través de una utilidad de compresión como gzip antes de la codificación base64.
K Robinson

2

Creo que https://github.com/fsquillace/pearl-ssh hace lo que necesita.

Lo escribí hace mucho tiempo antes de que naciera sshrc y tiene más beneficios en comparación con sshrc:

  • No requiere dependencias en xxd para ambos hosts (que pueden no estar disponibles en el host remoto)
  • Pearl-ssh usa un algoritmo de codificación más eficiente
  • Es solo ~ 20 líneas de código (¡realmente fácil de entender!)

Por ejemplo:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

Una opción para que funcione con una sola sesión SSH es usar una variable para almacenar su archivo bash en lugar de copiarlo.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Parece funcionar para mi.


1

Estaba buscando resolver un problema como el tuyo, y me di cuenta de que lo que realmente estaba buscando eran sshfs. ¿Quizás tú también puedas usarlo?

Mi problema era que al hacer ssh'ing, deseaba mantener mis colores, alias, funciones y scripts mientras trabajaba a distancia.

http://fuse.sourceforge.net/sshfs.html


Lol, esto nunca se me ocurrió tampoco. Es una solución bastante creativa.
Sridhar Sarnobat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.