2010-07-16 8 views
44

Mis claves ssh definitivamente están configuradas correctamente, ya que nunca se me pide la contraseña cuando uso ssh. Pero capistrano todavía pide una contraseña al implementar con cap deploy. Sin embargo, no me pide la contraseña cuando configuro con cap deploy:setup, por extraño que parezca. Haría que el ciclo de despliegue fuera mucho más fluido sin una solicitud de contraseña.Capistrano pide una contraseña al implementar, a pesar de las teclas SSH

Particularidades: Estoy implementando una aplicación Sinatra en una cuenta compartida de Dreamhost (que usa Passenger). Había seguido un tutorial por mucho tiempo atrás, que funcionó perfectamente en aquel entonces. Algo roto desde entonces. Estoy usando capistrano (2.5.9) y git versión 1.6.1.1. Aquí está mi Capfile:

load 'deploy' if respond_to?(:namespace) # cap2 differentiator 

set :user, 'ehsanul' 
set :domain, 'jellly.com' 

default_run_options[:pty] = true 

# the rest should be good 
set :repository, "[email protected]:git/jellly.git" 
set :deploy_to, "/home/ehsanul/jellly.com" 
set :deploy_via, :remote_cache 
set :scm, 'git' 
set :branch, 'deploy' 
set :git_shallow_clone, 1 
set :scm_verbose, true 
set :use_sudo, false 

server domain, :app, :web 

namespace :deploy do 
    task :migrate do 
    run "cd #{current_path}; /usr/bin/rake migrate environment=production" 
    end 
    task :restart do 
    run "touch #{current_path}/tmp/restart.txt" 
    end 
end 

after "deploy", "deploy:migrate" 

Y aquí está la salida de lo que sucede cuando cap deploy, hasta la solicitud de contraseña:

$ cap deploy 
    * executing `deploy' 
    * executing `deploy:update' 
** transaction: start 
    * executing `deploy:update_code' 
    updating the cached checkout on all servers 
    executing locally: "git ls-remote [email protected]:git/jellly.git deploy" 
/usr/local/bin/git 
    * executing "if [ -d /home/ehsanul/jellly.com/shared/cached-copy ]; then cd /home/ehsanul/jellly.com/shared/cached-copy && git fetch origin && git reset --hard ea744c77b0b939d5355ba2dc50ef1ec85f918d66 && git clean -d -x -f; else git clone --depth 1 [email protected]:git/jellly.git /home/ehsanul/jellly.com/shared/cached-copy && cd /home/ehsanul/jellly.com/shared/cached-copy && git checkout -b deploy ea744c77b0b939d5355ba2dc50ef1ec85f918d66; fi" 
    servers: ["jellly.com"] 
    [jellly.com] executing command 
** [jellly.com :: out] [email protected]'s password: 
Password: 
** [jellly.com :: out] 
** [jellly.com :: out] remote: Counting objects: 7, done. 
remote: Compressing objects: 100% (4/4), done. 

Qué podría ser roto?

Respuesta

51

La solicitud de contraseña se debe a que el servidor al que está implementando se está conectando al servidor de git y necesita autenticación. Debido a que su máquina local (en el que se va a implementar de) ya tiene una clave ssh válida, el uso que uno al permitir el reenvío en su Capfile:

set :ssh_options, {:forward_agent => true} 

que reenvía la autenticación de su máquina local a través cuando el despliegue servidor intenta conectarse a su servidor git.

¡Se prefiere mucho más que poner su llave privada en el servidor de despliegue!

Otra forma de evitar la solicitud de contraseña cuando el servidor se está recuperando es decirle a capistrano que no lo haga. Gracias a la sección 'readme' para capistrano-site5 repo github de Daniel Quimper, podemos señalar los siguientes:

set :deploy_via, :copy 

Obviamente, esto funciona para el caso en que tanto la aplicación y el repositorio Git están siendo alojados en el mismo host. Pero creo que algunos de nosotros lo estamos haciendo :)

+3

No puse mi clave privada en el servidor. Acabo de agregar la clave pública del servidor de implementación a su propia lista de 'authorized_keys'. Esto se debe a que el servidor de implementación también es mi servidor git, y aparentemente intenta introducirse en sí mismo debido a la forma en que funciona Capistrano, lo que provoca un inicio de sesión con contraseña. Así que, básicamente, configuré claves ssh entre el servidor y él mismo. Mucho más seguro que poner mi llave privada por ahí;) Aunque probaré el artículo forward_agent, parece una solución más limpia. ¡Gracias! :) – ehsanul

+0

Funcionó maravillosamente para mí. – kain

+0

En caso de que alguien más se pregunte por qué funciona esto y dónde está documentado, estas son opciones para Net: SSH, consulte "Opciones" en http://net-ssh.github.com/ssh/v1/chapter-2.html. – oseiskar

3

Los registros muestran que se solicitó una contraseña después de iniciar sesión a través de SSH a jellly.com, por lo que parece que la actualización actual de git está solicitando una contraseña.

Creo que esto se debe a que la configuración de su repositorio especifica su usuario de git, aunque en este caso puede acceder de forma anónima.

debe crear una cuenta GIT anónimo y cambiar su línea de recompra así:

set :repository, "[email protected]:git/jellly.git" 

Alternativamente, usted podría poner su clave SSH en el servidor de producción, pero eso no suena útil. También es posible que pueda configurar SSH para reenviar las solicitudes de autenticación a través de la conexión SSH inicial. Sin embargo, el control de fuente de solo lectura anónimo para implementación es probablemente más fácil.

+2

¡Gracias, eso lo solucionó! Parece que la configuración de otro usuario también funcionaría, pero me limité a autorizar la propia clave ssh del servidor: fácil y sin riesgo de seguridad. Usado esto: 'cat ~/.ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'' – ehsanul

+0

Hmmm, de hecho, ¿no solo especificaría 'set: repository,/home/ehsanul/git/jellly.git' también, sin el ssh? Editar: no, no funciona. – ehsanul

+0

Me alegro de que haya funcionado. Es un riesgo de seguridad mantener su clave privada en el servidor, solo debe almacenar allí la clave pública. Al menos esto confirma el problema. Recomiendo usar la cuenta de acceso anónimo o limitado en lugar de publicar su clave privada en el servidor de la aplicación. – Winfield

16

He tenido el mismo problema.

Esta línea did'nt funciona:

set :ssh_options, {:forward_agent => true} 

Entonces ejecutado mencionado en Dreamhost wiki

[local ~]$ eval `ssh-agent` 
[local ~]$ ssh-add ~/.ssh/yourpublickey # omit path if using default keyname 

Y ahora puede desplegar sin contraseña.

+2

Eso línea por sí misma no debería funcionar. Simplemente habilita el reenvío de agente. Si no tienes uno funcionando en primer lugar, no sería de mucha ayuda. –

+2

Debería agregar su clave privada, no pública. – DaveStephens

+0

Hago esto todo el tiempo, pero todavía pido una contraseña. Mi configuración es 'set: ssh_options, {forward_agent: true, user: fetch (: user), keys:% w (~/.ssh/id_rsa.pub)}' –

0

Si está utilizando una estación de trabajo Windows (portátil) que a veces se conecta directamente a una red corporativa interna y algunas veces se conecta a través de VPN, puede encontrar un comportamiento incoherente al ejecutar tareas remotas que le piden una contraseña.

En mi situación, nuestra empresa tiene scripts de inicio de sesión que se ejecutan cuando usted inició sesión mientras estaba conectado a la LAN de la compañía que estableció su directorio HOME en una ubicación compartida de red. Si inicia sesión desde las credenciales en caché y luego ingresa VPN, el script de inicio no configurará su directorio de inicio. El directorio .ssh que almacena su clave privada puede estar en solo una de esas ubicaciones.

Una solución fácil en esa situación es simplemente copiar el directorio .ssh desde el HOME que lo tiene al que no lo hace.

55

Ejecutando ssh-add ~/.ssh/id_rsa en mi máquina local resuelto el problema para mí. Parecía que la herramienta de línea de comandos de ssh no detectaba mi identidad cuando se llamaba con Capistrano.

+2

Agregué ese comando a mi archivo bash_profile, por lo que estoy seguro de que la identidad predeterminada se carga siempre que inicie una nueva sesión de terminal. –

+0

¡Esto resolvió mis problemas! –

+0

Esto funcionó para mí. – rocLv

1

puedo copiar y pegar mi llave Machie id_rsa.pub local para archivo authorized_key servidor remoto y funcionó

0

copiar la clave pública de forma manual para authorized_keys no funcionó en mi caso, pero lo hace a través del servicio trabajado, cuando me encontré con el servicio simplemente había agregado una llave más al final

ssh-copy-id ~/.ssh/id_rsa.pub [email protected] 
Cuestiones relacionadas