Puede hacer conexiones ssh dentro de una sesión cron. Lo que necesita es configurar una autenticación de clave pública para tener acceso sin contraseña. Para que esto funcione, debe tener PubkeyAuthentication yes
en cada servidor remoto sshd_config
.
Puede crear un par de claves privadas / públicas con o sin frase de contraseña. Si usa una frase de contraseña (recomendada), también debe iniciar ssh-agent. Sin una frase de contraseña, solo necesita agregar el parámetro -i your_identity_file
a la ssh
línea de comando. ssh
se usará $HOME/.ssh/id_rsa
por defecto.
Repliqué tu ejemplo usando un par de claves con una frase de contraseña. Así es como lo hice.
1) Creó el par de claves con frase de contraseña. Guardado la clave privada como ~/.ssh/id_rsa_test
, que debería tener los permisos correctos por defecto. Podemos ingresar una frase de contraseña vacía para no usar una.
john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]
2) Envió la clave pública a los servidores, hizo lo mismo para todos ellos. Recuerde que necesitan tener PubkeyAuthentication
habilitado.
john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password:
Now try logging into the machine, with "ssh 'server1'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
3) Ejecute ssh-agent como servicio con -s
. Esto no lo matará si cierra sesión. Su salida es un script de shell válido, que configura el entorno para que el cliente ssh sepa cómo conectarse a él. Lo guardamos en un archivo (solo se necesita la primera línea).
john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf
john@coffee:~$ cat ssh-agent.cf
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;
4) Cargué lo anterior en nuestro entorno actual para que podamos usarlo ssh-add
para agregar nuestra clave privada ssh-agent
. la frase de contraseña de arriba.
john@coffee:~$ source ssh-agent.cf
john@coffee:~$ ssh-add .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test:
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)
5) Verificado se agrega.
john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)
6) El script que utilicé, ligeramente modificado que el tuyo. Tenga en cuenta que no incluí el comando ssh entre paréntesis y no utilicé backticks $()
, que es una mejor alternativa para la sustitución de comandos (esto es bash
compatible, no mencionó qué shell está usando). Usé exactamente el mismo comando ssh que el tuyo.
john@coffee:~$ cat foo.sh
#!/bin/bash
source /home/john/ssh-agent.cf
for server in server1 server2; do
usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
date=$(ssh -o ConnectTimeout=60 $server date)
echo "$server - $date - $usr" >> /home/john/foo.log
done
7) Mi crontab (tenga en cuenta que mi sh
es realmente bash
)
john@coffee:~$ crontab -l
# m h dom mon dow command
*/1 * * * * sh /home/john/foo.sh
8) La salida
john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john
El único problema con el uso de una frase de contraseña es que debe ingresarla manualmente al menos una vez. Por lo tanto, lo anterior no funcionará automáticamente después de un reinicio.