1) En su script SSH rc (~ / .ssh / rc) configurará un enlace simbólico desde una ubicación canónica al SSH_AUTH_SOCK "actual". Así es como lo hago en bash (contenido de ~ / .ssh / rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(y asegúrese de chmod 755 ~ / .ssh / rc). La "prueba" es solo para evitar que se muestre un error si no está ejecutando ssh-agent (es decir, ssh sin -A). La segunda mitad de ese comando configura un enlace simbólico en una ubicación canónica que se actualiza a sí mismo al SSH_AUTH_SOCK "real" en el momento del inicio de sesión. Esto es independiente de usar un shell en ssh o llamar a un comando directamente, también funciona con "ssh -t screen -RRD".
Nota: la existencia de ~ / .ssh / rc cambia el comportamiento de sshd. Notablemente, no llamará a xauth. Consulte man sshd para obtener más información y cómo solucionarlo.
Además, no debe usar "-v" con ln tan pronto como rompa rsync-over-ssh con los siguientes diagnósticos:
$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
2) En su .screenrc, solo necesita anular SSH_AUTH_SOCK a la ubicación canónica:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Tenga en cuenta que usa setenv sin importar qué shell use; Creo que setenv es la sintaxis de la pantalla, no el shell.
Solución originalmente adaptada de esta publicación , que no funciona, pero tiene la idea correcta.
Creo que esto funciona como una simplificación de la respuesta de @ sandip-bhattacharya. Ponga esto en su
~/.bashrc
archivo y ejecute el comando de exportación en cualquier sesión de pantalla que se esté ejecutando actualmente.Que dice "si
$SSH_AUTH_SOCK
es un socket (-S
) y no un enlace simbólico (! -h
), cree un nuevo enlace simbólico en la ruta conocida. En todos los casos, redefinaSSH_AUTH_SOCK
para señalar la ruta conocida.Los
! -h
evita crear una referencia circular si ejecuta esto varias veces.Además, si lo usa
byobu
, lo hace automáticamente, sin necesidad de editar ningún archivo de configuración.El único error que he encontrado en esto (
byobu
también lo tiene) es que si abres un segundossh -A
o unaForwardAgent
conexión, sobrescribirá el primer socket, y si cierras la segunda conexión antes que la primera, perderás tu único socket bueno.fuente
tmux
.~/.ssh/ssh_auth_sock_"$(hostname)"
úsalo para tu enlace simbólico. Mantendrá sockets de autenticación separados para cada host."ssh -t some.machine screen -R" no ejecutará bash y, por lo tanto, no ejecutará el script .bash_profile donde se crea el enlace simbólico.
Puede intentar: ssh -t some.machine bash -c "screen -R"
(suponiendo que está usando bash como su caparazón, por supuesto)
Editar: Esa "respuesta" es en realidad un comentario sobre la primera respuesta dada anteriormente :)
fuente
Creo que necesitas autossh. Lo he estado usando durante años y, combinado con la pantalla, hace que todas mis sesiones de terminal sean completamente portátiles y transparentes. Simplemente cierro el disquete, me muevo a una nueva ubicación, abro el disquete y todas mis pantallas y pantallas anidadas se conectan automáticamente. Ya ni siquiera pienso en eso.
http://www.linux.com/archive/feature/134133
es lo básico ... Escribí un script lil para automatizar el proceso en mi .screenrc para un host dado. (también hace mi reenvío ssh, por lo que en todos estos lugares diferentes puedo hacer un túnel de mi conexión a través de mis servidores)
en la distribución autossh debería haber un programa llamado rscreen (y ... ¡lo hay!)
Esto debería ayudar con problemas ssh / screen
Finalmente, para mantener mi agente ssh en ejecución, uso el llavero, ya que soy una especie de cabeza de shell ... Creo que OSX tiene algo disponible para mantener a su agente cerca ...
fuente
Aquí está el método que uso:
Por lo general, configuro un alias o una función de shell con estos comandos:
Puede que tenga que adaptar la expresión regular ' pantalla - (r | DR) ' a los comandos exactos que utiliza para volver a conectar su pantalla.
Una advertencia con mi método: las cosas pueden salir mal si hay otro comando de " pantalla " ejecutándose en la computadora.
fuente
sudo
.Normalmente mantengo sesiones a largo plazo (más de 6 meses) en mi lugar de trabajo en diferentes servidores. Por lo tanto, volver a conectar y tener un agente de reenvío ssh viable ha sido problemático. Esto es lo que configuré en mis sistemas:
Si acabo de iniciar sesión en el servidor remoto sin iniciar / volver a conectar la pantalla, habrá dos "sockets", uno en uso
screen
y otro por el nuevo shell. No debe haber dos sesiones de "puesta en marcha", pero una segunda sesión todavía podría haber empezado a utilizarreattach -S new
; en esta situación, el agente se compartiría con el~/.ssh/agent-screen
valor. Para recuperar un agente de reenvío en funcionamiento, luego me desconectaría y volvería a iniciar sesión. EstoX${USER} = Xmyusername
garantiza que el código no se invoquesudo
en el mismo servidor.fuente
Estoy usando una variación de lo que @apinstein está usando para mi .bashrc .
Esto funciona para todas las aplicaciones que se ejecutan en mi sesión de pantalla. Esto funcionaría para todos los nuevos shells en su sesión de pantalla. Para los shells existentes, debe ejecutar
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
el shell del host para que funcione.PD Perdón por agregar esto como una respuesta independiente, mientras que se basó en la respuesta de @ apinstein. Tuve que hacer esto ya que los comentarios en stackoverflow no admiten bloques de código.
fuente
Probé este sencillo revestimiento como se sugiere en Hagamos amigos de screen y ssh-agent y funciona para mí.
Inicio de sesión por primera vez en Target. Solo debe hacerse una vez.
Pantalla de inicio por primera vez ... Debe hacerse solo una vez.
Si está desconectado o desconectado, use este comando para iniciar sesión posteriormente para conectarse a la pantalla de salida.
fuente
Todas estas son respuestas realmente buenas. Lo hago de manera ligeramente diferente. Después de iniciar una nueva sesión ssh y volver a conectar la pantalla, restablezco la
SSH_AUTH_SOCK
variable de entorno en función del contenido del entorno de bash de raíz. Solo necesito acceso ssh-agent de vez en cuando cuando estoy usando svn, así que simplemente restablezco elSSH_AUTH_SOCK
requerido en estos shells.Esto utiliza el sistema de archivos proc, por lo que es específico de Linux. Solo he probado esto en una caja de linux sin cabeza a la que solo tengo acceso, podría tomar algunos ajustes para que funcione en otros entornos.
Para restablecer SSH_AUTH_SOCK (esto podría convertirse en un alias).
screen_auth.sh tiene este aspecto
fuente
Todas las soluciones anteriores sufren condiciones de carrera (ya sea en múltiples sesiones de SCREEN o en múltiples conexiones SSH). La única solución universal que se me ocurre es primero presionar SSH_AUTH_SOCK para SCREEN el proceso del servidor
screen -r
y luego colocarlo dentro de la sesión BASH antes de cada comando interactivo no integrado. Desafortunadamente, SCREEN y BASH se diseñaron sin ser conscientes de este tipo de problemas, por lo que es bastante difícil de implementar correctamente (aunque nunca es tarde para publicar solicitudes de funciones en ambos proyectos). Se intentó superar este problema para las sesiones de BASH que se pueden encontrar aquí:Instalar:
$HOME/bin
, agregar bit ejecutable;asegúrese de que eso
$HOME/bin
vaya antes/usr/bin
en PATHRUTA = $ INICIO / bin: $ RUTA
agregue esto a su
.bashrc
:fuente $ HOME / bin / screen-helper setup
Ahora puede intentar crear una sesión SCREEN dentro de la sesión SSH, desconectar, desconectar, conectar y volver a conectar y, con suerte,
ssh-add -l
debería mostrar correctamente sus claves.fuente
ssh-agent
daemon permanente (como se sugiere aquí superuser.com/a/412052/376867 ) no sufre de una condición de carrera, sino un llavero obsoleto. Y lo que es más importante, no es muy seguro dejar todas sus claves en el host remoto junto con la sesión de pantalla (o incluso más tiempo hasta que se reinicie en caso de una publicación mencionada).Hojeé otras respuestas y no pude encontrar la mía. Esto es lo que uso. Cree un archivo
~/.screenrc-wrapper
con los siguientes contenidos:Y agregue esto a su
~/.bashrc
(o~/.zshrc
si lo usa):De esta forma, usaría dos sesiones de pantalla: una es "envoltura" y la otra es la interna. Esto mantendrá vivo a este último incluso cuando cierre la sesión y seguirá teniendo ssh-agent. Otra buena característica es que recordará la configuración de su ventana: si usa ventanas divididas, puede ser muy útil.
Puede encontrar esta función en contexto en mis archivos de puntos .
fuente