Копирование и запуск скрипта на удаленной машине через ssh без ввода пароля

Материал из support.qbpro.ru

Задача: Скопировать файл выгрузки с файлового сервера на удалённый веб сервер и запустить на нём php скрипт обработки данного файла.

Реализуется следующим образом:

Сначала настраиваем подключение по ssh без пароля:

Создаём ключ:

ssh-keygen -t rsa

На запрос ввести путь для сохранения ключа "Enter file in which to save the key (/home/<имя_пользователя>/.ssh/id_rsa):" нажимаем Enter
На запрос ввести секретную фраз "Enter passphrase (empty for no passphrase):" нажимаем Enter (Если её ввести, то при подключении вместо пароля
будет спрашиваться секретная фраз для разблокировки ключа). На запрос повторить ввод секретной фразы "Enter same passphrase again:" нажимаем Enter.

Ключ будет создан в директории /home/<имя_пользователя>/.ssh/id_rsa,там же будет лежать публичный ключ /home/<имя_пользователя>/.ssh/id_rsa.pub
который необходимо поместить на удалённый сервер при помощи команды:

ssh-copy-id -i /home/<имя_пользователя>/.ssh/id_rsa.pub имя_пользователя_удалённого_сервера@ip_адрес_сервера

Параметр -i позволяет задать путь к публичному ключю. Вместо имя_пользователя_удалённого_сервера необходимо поставить имя пользователя удалённого сервера, от имени которого планируется выполнять
операции на удалённом сервере. Вместо ip_адрес_сервера можно использовать dns имя сервера.

Для проверки выполним:

ssh <имя_пользователя_удалённого_сервера>@ip_адрес_сервера uptime

Команда выведет время работы с системы.
Если команда возвращает данные, и не спрашивает пароль, то всё настроено верно. Теперь аутентификация пользователя происходит по публичному
ключу, и пароль не будет спрашиваться при выполнении команд: ssh, sftp, scp.

Далее, создаём скрипт, который будет копировать файл с выгрузкой на удалённый сервер:

nano -u /usr/bin/export.sh
#!/bin/bash
#Дата для подстановки к имени файла
DATE=`date +%F_%H:%M`
#Копируем файл на удалённую машину
scp <исходная_директория>/<файл> <ip_адрес_удалённого_сервера>.<расширение>:<конечная_директория>_$DATE.<расширение>
#Запускаем php скрипт на удалённой машине
ssh <ip_адрес_удалённого_сервера> "php -f <путь_к_скрипту>/<файл>.php <необходимые_параметры>
#Очищаем файл экспорта
echo > <исходная_директория>/<файл>

Сделаем скрипт запускаемым:

cmod +x /usr/bin/export.sh

Запускаем скрипт:

/usr/bin/./export.sh

Проверяем наличие файла и исполнение скрипта php на удалённом сервере.

Теперь, можно поставить выполнение скрипта в cron (планировщик заданий):

crontab -e
# m h dom mon dow user command
15 0 * * * /usr/bin/export_payment.sh

Скрипт будет выполняться ежедневно в 00:15


...еще вариант:

[arcfi@arcfi-laptop ~]$ sshpass -p "$SSH_PASSWD" ssh admin@srv08
Last login: Wed Aug 29 12:08:20 2012
[admin@srv08 ~]$

или

sshpass -p "$PASSWD" ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $USER@$HOST