Me gustaría usar mi clave SSH protegida con contraseña al realizar tareas con parallel-ssh
(y herramientas relacionadas). Sin embargo, no puedo hacer que esto funcione.
Toda la documentación relacionada con parallel-ssh
, muestra que debería poder usar --askpass
o -A
hacer esto:
-A
--askpass
Prompt for a password and pass it to ssh. The password may be
used for either to unlock a key or for password authentication. The
password is transferred in a fairly secure manner (e.g., it will not
show up in argument lists). However, be aware that a root user on
your system could potentially intercept the password.
Sin embargo, cuando ingreso la contraseña de mi clave, no funciona:
$ parallel-ssh --hosts=machines --user=my_user --askpass \
--timeout=0 --inline -v 'sudo apt-get update'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 09:59:36 [FAILURE] amritiii Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[2] 09:59:37 [FAILURE] gbdev Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[3] 09:59:37 [FAILURE] code Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[4] 09:59:37 [FAILURE] apollo Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[5] 09:59:37 [FAILURE] odin Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[6] 09:59:37 [FAILURE] hathor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[7] 09:59:37 [FAILURE] ldap Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[8] 09:59:37 [FAILURE] thor Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
[9] 09:59:37 [FAILURE] bioserver Exited with error code 255
Stderr: Enter passphrase for key '/home/nhaigh/.ssh/id_rsa':
Permission denied (publickey,password).
Confirmé que mi clave SSH y mi contraseña funcionan en cada una de las máquinas, por lo que no tengo idea de cómo hacer que esto funcione.
Respuesta1
Suponiendo que parallel-ssh
y pssh
son equivalentes, entonces sí, lo que está intentando hacer debería funcionar bien al canalizar la frase de contraseña al usar el -A
interruptor.
Ejemplo
Aquí hay un ejemplo en el que me conecto a 2 sistemas diferentes host1
y host2
. Utilizo el -l
interruptor pssh
para proporcionar un usuario predeterminado de root
. Sin embargo, host2
anulo esto en el -H
conmutador especificando el nombre de host como user1@host2
.
$ pssh -A -i -H "host1 user1@host2" -l root 'echo "hi"'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 21:38:00 [SUCCESS] user1@host2
hi
Stderr:
This is a private site. Unauthorized connections are prohibited.
All activity may be logged. Disconnect immediately if you object to
this policy or are not an authorized user.
X11 forwarding request failed on channel 1
Killed by signal 1.
[2] 21:38:00 [SUCCESS] host1
hi
Stderr:
This is a private site. Unauthorized connections are prohibited.
All activity may be logged. Disconnect immediately if you object to
this policy or are not an authorized user.
ControlSocket /home/user1/.ssh/[email protected]:22 already exists, disabling multiplexing
X11 forwarding request failed on channel 0
Killed by signal 1.
Cuando lo anterior funcione, notarás el resultado del comando que estoy ejecutando echo "hi"
.
Tu problema
El problema que está encontrando con una frase de contraseña en su par de claves SSH se debe a un error. Este es el error titulado:Problema 80: ¿No pasas la frase de contraseña?. El cuarto comentario de ese problema muestra un parche:
extracto
#4[correo electrónico protegido]
Cambié la línea a
if not ( prompt.strip().lower().endswith('password:') or 'enter passphrase for key' in prompt.strip().lower()):
Y parece funcionar
Referencias
Respuesta2
Logré que esto funcionara instalando keychain
en lugar de parchear manualmente elbichocausando mis problemas.
Instalar y ejecutar manualmente el llavero
# install keychain package
$ sudo apt-get install keychain
# add my key to the keychain, entering passphrase when asked
$ keychain ~/.ssh/id_rsa
# source the file generated by the above command
$ . ~/.keychain/$(uname -n)-sh
Ejecutar comando sin ingresar contraseña/frase de contraseña
Ahora, esta vez no necesito mi contraseña cuando llamo parallel-ssh
ya que el llavero se encarga de la autenticación:
$ parallel-ssh --hosts=machines --user=my_user --timeout=0 'sudo apt-get update'
[1] 14:52:15 [SUCCESS] amritiii
[2] 14:52:17 [SUCCESS] odin
[3] 14:52:25 [SUCCESS] gmod
[4] 14:53:11 [SUCCESS] bioserver
[5] 14:53:14 [SUCCESS] thor
[6] 14:53:14 [SUCCESS] apollo
[7] 14:53:16 [SUCCESS] gbdev
[8] 14:53:17 [SUCCESS] code
[9] 14:53:18 [SUCCESS] hathor
[10] 14:53:34 [SUCCESS] ldap
Ejecutar llavero al iniciar sesión
En lugar de tener que ejecutar y agregar manualmente su clave al llavero, simplemente agregue lo siguiente al final de su ~/.bash_profile
:
$ keychain --clear $HOME/.ssh/id_rsa
$ . $HOME/.keychain/$(uname -n)-sh
Esto garantiza que en su primer inicio de sesión, después de reiniciar, se le solicitará la frase de contraseña de su clave. Su clave permanecerá en el llavero hasta el próximo reinicio o hasta que borre el llavero manualmente.
Trabajos cron usando el llavero
Con lo anterior ingresado en su ~/.bash_profile
archivo, puede aprovechar el hecho de que su clave ahora está almacenada en el llavero al almacenar el mismo archivo antes de ejecutar su cronjob. Por ejemplo, tengo un script de respaldo que se ejecuta a las 21:00 todas las noches y copia cosas a una computadora remota a través de SSH. Esta es una entrada en mi crontab ( crontab -e
):
0 21 * * * . $HOME/.keychain/$(uname -n)-sh; $HOME/backup_script.sh
Respuesta3
Utilizar elagente sshpara autenticarse automáticamente (con un nombre de shell como argumento para tener las variables de entorno del agente configuradas en ese nuevo shell). Añade la clave conssh-añadiry escriba su contraseña solo una vez.
$ ssh-agent bash
$ ssh-add
Enter passphrase for /xxxx/.ssh/identity:
$
$ pssh ...