Empujando mi indicador de PS1 sobre ssh

19

Uso un mensaje específico de "PS1" que me gusta. Comparto algunos inicios de sesión con otras personas en algunos servidores diferentes. Me preguntaba si había una manera de especificar en mi perfil de bash local un aviso remoto, o de alguna otra manera que no sea copiar y pegar cada vez que me remoto.

Nuez sin fondos
fuente

Respuestas:

17

Cargue un archivo en cada máquina remota, por ejemplo ~/.my_custom_bashrc, con su bashconfiguración personalizada (en este caso PS1=...) y luego inicie sshcon:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Puede usar fácilmente una bashfunción como envoltorio para facilitar la lectura.

Ciro
fuente
10

Si solo desea enviar la PS1variable, y no contiene una '(comilla simple), intente:

ssh targethost -t "PS1='$PS1'; exec bash"

Sin embargo, el local .bashrcpuede sobrescribir PS1(gracias a Dennis Williamson por señalar esto).

Hay formas de transmitir variables de entorno a través de ssh , pero generalmente están deshabilitadas en la configuración del servidor. Si la PermitUserEnvironmentdirectiva está habilitada en la configuración del servidor y cada usuario tiene su propio par de claves (sí, es posible que no tenga tanta suerte), puede agregar environment="PS1=…"a la línea ~/.ssh/authorized_keyscorrespondiente a su clave.

Si desea mantener su propia configuración en una cuenta de usuario compartida, puede crear su propio directorio de archivos de configuración y establecer la HOMEvariable de entorno para que apunte a ese directorio.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Cree enlaces simbólicos en el mrstatic.homedirectorio que apunten a la entrada correspondiente en el directorio principal cuando desee compartir un archivo con los otros usuarios.

Luego, inicie sesión con

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Si está dispuesto a modificar el control remoto .profile(u otro archivo de inicialización), probablemente pueda automatizar su configuración. Muchos sitios permiten LC_*variables de entorno (normalmente se usan para la configuración regional). Si se cumplen ambas condiciones, puede establecer una variable que no se use realmente para configuraciones regionales, por ejemplo LC_USER, en el lado del cliente, y probarla en el servidor .profile.

(Por supuesto, las cuentas compartidas son una mala idea, pero me doy cuenta de que es posible que no esté en condiciones de cambiar esa situación).

Gilles 'SO- deja de ser malvado'
fuente
3
ssh -t user@host "remote='$PS1' bash -i"

Luego, en el indicador:

PS1=$remote
Pausado hasta nuevo aviso.
fuente
1
Es probable que un indicador de bash sofisticado se rompa si no se cita (viniendo de ti, me sorprende). ¿Y por qué el comando extra, y no solo "PS1='$PS1' bash -i"(y por qué no exec, también)?
Gilles 'SO- deja de ser malvado'
1
@Gilles: cita faltante: descuido. Comando adicional: no sería inusual PS1que se sobrescribiera durante el inicio del shell. Sin ejecutivo: durante las pruebas en mi sistema no parecía haber ninguna diferencia, sin proceso adicional.
Pausado hasta nuevo aviso.
1
Oh, sí, ese es un buen punto, .bashrces probable que el local sobrescriba PS1.
Gilles 'SO- deja de ser malvado'
2

Coloque su solicitud de PS1 en ~ / .ssh / environment y la sesión ssh lo llevará a cada host que inicie sesión. A mí me funciona con openssh 4.3p2.

Valmik
fuente
1
Esto solo funciona si la configuración del servidor se ha habilitado PermitUserEnvironment, lo cual está desactivado de manera predeterminada.
Flimm
1

puede especificar variables de entorno en el lado del cliente y si el servidor ssh lo permite (marque man sshd-config), estas variables se copian en la sesión cuando inicia sesión en la máquina.

por lo tanto, tendría que configurar el .bashrc en el servidor para verificar una PS1 existente (o cualquier variable) y solo establecer la PS1 si aún no está configurada.

o, lo que simplifica las cosas, agrupa sus configuraciones en una función ... y despliega esa función como un archivo especial de su fuente a pedido ( source joes_bashrc) o directamente en el .bashrc. tener tu propio archivo parece un poco más robusto. las otras personas pueden usar su configuración, pero no están obligados a hacerlo.

akira
fuente
1

No comparta inicios de sesión. SSH como tú mismo, luego hazlo sudo -su shareduser( -ssignifica "shell").

Haga sudomantener su directorio de inicio:

Defaults env_keep += "HOME"
usuario1686
fuente
Cuando me asciendan, intentaré promulgar esa política, pero por ahora estoy atrapado en esto.
financiado
1

Si quieres hacerlo sin necesitar un scp adicional, puedes hacer algo como esto:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Eso generará un .bashrc.n que se basa en los servidores bashrc pero con sus anulaciones.

neurona
fuente
Es por eso que algunas personas temen a las terminales.
0

Si usted está dispuesto a entrometerse de manera imperceptible en sus colegas, y se puede confiar en ellos para no interferir con su preferencia, entonces sugiero una combinación de respuesta de Cyrus , la respuesta de Akira y la respuesta de Dennis Williamson .

  1. En cada servidor, edite ~/.bashrcy agregue
    if ["$ Unf" = 1] # Código especial para Unfundednut
    luego
        PS1 = " (su solicitud deseada) "
         (cualquier otra personalización que desee) 
    fi
    al final. Si bien sus colegas "no apreciarían que [usted] escribiera sobre el perfil base", no se darán cuenta de esto a menos que lo busquen.
  2. Cuando inicie sesión en un servidor remoto, haga
    ssh -t usuario @ host "Unf = 1 bash -i"
    Si bien es probable que desee poner eso en un alias o función de shell en su cuenta local, es lo suficientemente corto, más corto que cualquiera de las otras respuestas, que podría escribirlo manualmente.

Creo que esto es bastante claro, pero: el sshcomando hace que la Unfvariable se establezca en el servidor remoto cuando inicia sesión. Eso invocará su código en el control remoto .bashrc, lo que pondrá en vigencia su (s) personalización (es). Como coloca su código al final de .bashrc, anulará la configuración general anteriormente en el archivo.

Divulgación: no he probado esto.

Scott
fuente
-1

La forma más fácil es en mi humilde opinión:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'
Matias Barrios
fuente
No estoy seguro de que funcione; parece faltar una capa de citas. Incluso si lo hiciera, la configuración PROMPT_COMMAND(que se ejecuta cada vez que el shell emite un mensaje) parece ser una forma muy difícil de resolver este problema. Y, dado que es algo arcano, cualquier respuesta que sugiera que realmente debería tener una explicación de cómo funciona.
Scott
-2

Podrías hacer cosas como montar tu casa sobre sshfs / nfs, pero la solución más fácil es pasar tu bashrc a la nueva máquina. Esto también trae alias y esas cosas.

Dentrasi
fuente
Como dije en mi pregunta, comparto estos inicios de sesión con otras personas. Estoy bastante seguro de que no apreciarían que escribiera sobre el perfil base.
financiado
1
Montar $ HOME sobre NFS es una locura. Sólo digo'.
Wesley Rice