LINUX.ORG.RU

ssh по cron

 ,


0

1

всем приветик ) подскажите плиз как сделать так , что бы из крона срабатывал bash скрипт в исполняемом файле backup.sh?

#bin/sh ssh user@server «mysqldump -u$user -p$password $dbname --lock-all-tables --quick | gzip -c» | gzip -d > db.sql

в итоге на локальном диске создаётся файл пустого дампа БД ! может переменные окружения ещё какие не совпадают с ssh и cron ??? через терминал норм отрабатывает ./backup.ah ,а через cron не работает.

может тут прочёл так вот запускать в кроне надо ? * * * * * ${SHELL} -l -c backup.sh



Последнее исправление: morgusha (всего исправлений: 1)

Можно же посмотреть все переменные, запустив env из под крона и руками.
К серверу хотя бы коннект есть из крона, или с авторизацией по ключам облом происходит?

imul ★★★★★
()
Ответ на: комментарий от morgusha

набери в консоли env и смотри.
или проблема с запуском в кроне? там надо будет перенаправить вывод env в файл и дождаться срабатывания.
0 * * * * env > /tmp/environment.txt
и в начале следующего часа прочитаешь всё в файле

imul ★★★★★
()

А тебя не учили в системных скриптах полные пути писать?

PS: еще иногда есть такие директории, как /etc/cron.daily

PPS: еще советую подумать от какого пользователя запускается этот ssh.

soomrack ★★★★★
()
Последнее исправление: soomrack (всего исправлений: 1)

поставь переменные в скипте как надо.

а crontab прописывай командой

crontab -e

от того же юзера, что запускать должен.

ну и полные пути пиши, если $PATH не ставишь

и пустую строку в конце

drBatty ★★
()
Ответ на: комментарий от drBatty

#!/bin/bash if [ ! -d $dirbackup ] then echo «Directory for store backup of database not existing. Starting creating...» mkdir -p $dirbackup echo «Directory» $dirbackup «created successfully» fi ssh morgusha@morgusha.ru mysqldump -u$user -p$password $dbname --quick > $dirbackup/morgusha.sql echo «Backup of database» $dbname «is finished»

где тут прописать полные пути ??? или переменную path ???

morgusha
() автор топика
Ответ на: комментарий от morgusha

опять пустой файл появился и всё

А добавили опцию к параметрам ssh, что предложил вам сэр sdio?
Она даёт возможность ссх отработать без юзершелла.

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от morgusha

так вот в крон записал : 3 1 * * * /home/metko/backup.sh >> /home/metko/cron.log 2>&1 В логе такое вот появилось: Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). Backup of database morgusha is finished

morgusha
() автор топика
Ответ на: комментарий от morgusha

да добавилв скрипте ключ -t вот что в логе:

Pseudo-terminal will not be allocated because stdin is not a terminal. Permission denied, please try again. Permission denied, please try again. Permission denied (publickey,password). Backup of database morgusha is finished

morgusha
() автор топика
Ответ на: комментарий от sdio

О БОЖЕ ! ( ничего не понимаю ! вот код скрипта! #!/bin/bash SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

dbname=«morgu» # Имя базы данных user=«morga» # Пользователь mysql password=«eph3» # Пароль пользователя mysql dirbackup=«/home/metko/backup-db» # Каталог назначения на локальной машине if [ ! -d $dirbackup ] then echo «Directory for store backup of database not existing. Starting creating...» mkdir -p $dirbackup echo «Directory» $dirbackup «created successfully» fi

ssh -t morgusha@morgusha.ru mysqldump -u$user -p$password $dbname --quick > $dirbackup/morgusha.sql

echo «Backup of database» $dbname «is finished»

morgusha
() автор топика
Ответ на: комментарий от morgusha

если ты запускаешь script вручную, ты ведь не вводишь пароль сервера (юзера morgusha на сервере morgusha.ru)?

sdio ★★★★★
()
Ответ на: комментарий от morgusha

Используй теги
[code]

[/code]

иначе невозможно читать кашу твоих сообщений

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от morgusha

Я тебе это и сказал. На ключах пароль есть или нет? Сеансовый ssh-agent может предоставлять тебе уже распароленный rsa-key, который не доступен из под cron'a

sdio ★★★★★
()
Ответ на: комментарий от morgusha

Как-то так:

запусти ssh-agent

#!/bin/sh

eval `ssh-agent -s`
/root/add-ssh-pass

/path/to/backup.sh

ssh-agent -k

cat /root/add-ssh-pass

#!/usr/bin/expect

spawn ssh-add
expect "Enter passphrase"
send "Your-rsa-key-password\r"
expect eof

sdio ★★★★★
()
Ответ на: комментарий от sdio
metko@metko-System-Product-Name:~$ eval `ssh-agent -s`/root/add-ssh-pass
Agent pid 7783
bash: /root/add-ssh-pass: Отказано в доступе

я вообще ничего не понимаю ( если ставлю sudo то не знает команду eval

morgusha
() автор топика
Ответ на: комментарий от morgusha

Сделай уж сразу ключи без пароля и не морочь людям голову.

sdio ★★★★★
()
Ответ на: комментарий от morgusha

ну подумай чуть-чуть. Если cron не root'овый, а юзерский, то не надо класть скрипт add-ssh-pass в /root

sdio ★★★★★
()
Ответ на: комментарий от morgusha

нельзя сделать аутентификацию просто по паролю в скрипте ???

НЕТ.

пароль — такая штука, которая подтверждает, что ТЫ за компьютером. Используй ssh-keygen для генерации нового ключа БЕЗ пароля.

переменные прописывай в самом скрипте так

#!/bin/bash
export HOME=${HOME:-/home/username}
export PATH=${PATH:-<здесь PATH>}
# дальше все остальные нужные тебе переменные пропиши
cd $HOME
# потом команды
в самом crontab допиши в конце 2>&1 >>/home/username/crond.log в этом логе смотри каков результат.

drBatty ★★
()
Ответ на: комментарий от drBatty

оооо у меня итак рса ключ сделан без парольной фразы !

#!/bin/bash

export HOME=${HOME:-/home/username}
export PATH=${PATH:-/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin}

 
dbname="morgusha" # Имя базы данных
user="morgusha" # Пользователь mysql
password="Me13" # Пароль пользователя mysql
dirbackup="/home/metko/backup-db" # Каталог назначения на локальной машине
 
# Проверяем существование каталога для локального хранения дампа
# базы данных, если каталог не существует создаем его
if [ ! -d $dirbackup ]
then echo "Directory for store backup of database not existing. Starting creating..."
mkdir -p $dirbackup
echo "Directory" $dirbackup "created successfully"
fi
 
ssh morgusha@morgusha.ru -i ~/.ssh/example_rsa ssh morgusha@morgusha.ru mysqldump -u$user -p$password $dbname --quick > $dirbackup/morgusha.sql
 
echo "Backup of database" $dbname "is finished"

поправьте плиз что тут не так... или аську дайте хоть кто плиз ,а то тут эпопея расстянуться может (

morgusha
() автор топика
Ответ на: комментарий от morgusha

ssh morgusha@morgusha.ru -i ~/.ssh/example_rsa ssh morgusha@morgusha.ru

Это у тебя только тут два раза ssh или в реальном скрипте тоже?

sdio ★★★★★
()
Ответ на: комментарий от sdio

Аааааааааа СПАСИБО! ПОБЕДА ) Дамп создался номально вроде ! Вот такой вот код скрипта!

#!/bin/bash

export HOME=${HOME:-/home/username}
export PATH=${PATH:-/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin}

 
dbname="morgusha" # Имя базы данных
user="morgusha" # Пользователь mysql
password="Me3" # Пароль пользователя mysql
dirbackup="/home/metko/backup-db" # Каталог назначения на локальной машине
 
# Проверяем существование каталога для локального хранения дампа
# базы данных, если каталог не существует создаем его
if [ ! -d $dirbackup ]
then echo "Directory for store backup of database not existing. Starting creating..."
mkdir -p $dirbackup
echo "Directory" $dirbackup "created successfully"
fi
 
ssh morgusha@morgusha.ru -i ~/.ssh/example_rsa mysqldump -u$user -p$password $dbname --quick > $dirbackup/morgusha.sql
 
echo "Backup of database" $dbname "is finished"
так вот с крона поставил ! )
18 13 * * * /home/metko/backup.sh >>/home/metko/cron.log 2>&1

morgusha
() автор топика
Ответ на: комментарий от morgusha

А может кто сталкивался с такой же задачей делать бэкапы на серверах и скажет по какому пути правильней идти будет ? А вообще теперь мне надо для каждого сервера делать отдельный rsa ключ и потом просто в скрипте после одного бэкапа делать разрыв связи и устанавливать новое соединение используя другой ключ и делать там бэкап, так будет верно ?

morgusha
() автор топика
Ответ на: комментарий от morgusha

/home/username

тут СВОЁ имя писать надо, а НЕ username.

Пароль пользователя mysql

смени пароль! И не публикуй его больше.

echo «Backup of database» $dbname «is finished»

поменяй на

err=$?
if [ $err == 0 ]; then
    echo "Backup of database" $dbname "is finished"
else
    echo "Backup failed! Error: $err"
    exit $err
fi

а так вроде всё верно...

drBatty ★★
()
Ответ на: комментарий от morgusha

А может кто сталкивался с такой же задачей делать бэкапы на серверах и скажет по какому пути правильней идти будет ?

всё ты правильно делаешь.

А вообще теперь мне надо для каждого сервера делать отдельный rsa ключ

можно один ключ на все сервера делать. Это сам думай как оно лучше.

просто в скрипте после одного бэкапа делать разрыв связи

он сам делается. Ещё код ошибки надо проверять, он ==0 если ОК.

устанавливать новое соединение используя другой ключ

читай про ~/.ssh/config, и там задай имена и ключи для всех своих серверов. В скрипте этого не нужно делать, там только имя надо.

Кроме того желательно и имя/пароль к базе тоже хранить возле этой базы (всё равно, если сломают тот сервер, то базу всё равно сольют), а локально надо просто скрипт на том сервере запускать, например так:

ssh servername ~/backup_mysql.bash >backupname
drBatty ★★
()
Ответ на: комментарий от drBatty

ох по поводу безопасности пока не задумывался вопрос и без того валом ( Спасибо всё равно за напутствие ! Подскажите как нужно подключаться через ssh к БД и делать к ней селект ? есть просто пример синтаксиса команд и как подключиться к интерпритатору sql команд ?

morgusha
() автор топика

gzip -c»

Что это за артифакт? Проверь, не появился ли какой файл посторонний. Ну и почту root проверь - ошибки по-умолчанию ему мылятся.

anonymous
()
Ответ на: комментарий от anonymous

какой ещё артефакт ? делаю в скрипте так вот :

mysql -u  morgusha -p Me
mysql>show databases
в итоге ничего не выводится ! ???

morgusha
() автор топика
Ответ на: комментарий от morgusha

к удалённой СУБД по ссш? А зачем? Для репликации mysql я использовал ssl/tls (сертификат можно и самому подписать, ведь подключаться будут только ваши сервера)

ну а запросы может и локальный код обработать. Или у вас там всё так серьёзно, что логику сервера вы на отдельную железку уже выносите, а СУБД на другую? Тогда извините, я не в курсе.

drBatty ★★
()
Ответ на: комментарий от anonymous

Что это за артифакт? Проверь, не появился ли какой файл посторонний. Ну и почту root проверь - ошибки по-умолчанию ему мылятся.

какой артефакт? Всё правильно, ключ --to-stdout используется для ввода архива на stdout. Единственное неправильно то, что ssh само умеет сжимать

-C Requests compression of all data (including stdin, stdout, stderr, and data for forwarded X11 and TCP connections). The compression algorithm is the same used by gzip(1), and the ``level" can be controlled by the CompressionLevel option for protocol version 1. Compression is desirable on modem lines and other slow connections, but will only slow down things on fast networks. The default value can be set on a host-by-host basis in the configuration files; see the Compression option.

конечно надо проверить, что сервер тоже поддерживает компрессию (gnu sshd давно умеет, но я не помню, включено-ли оно по дефолту)

drBatty ★★
()
Ответ на: комментарий от morgusha

такой вариант может иметь место существовать ?

да, нормальный ИМХО вариант.

советую в этом случае использовать ещё и

--batch, -B

Print results using tab as the column separator, with each row on a new line. With this option, mysql does not use the history file.

Batch mode results in nontabular output format and escaping of special characters. Escaping may be disabled by using raw mode; see the description for the --raw option.

потому-что без него вывод mysql «для человека», т.е. содержит разные украшательства и прочее такое.

drBatty ★★
()
Ответ на: комментарий от morgusha

или кто знает как сделать select из базы при помощи bash скрипта ???

echo "SELECT * FROM $TABLE WHERE id=$ID" |mysql ...

Hint: несколько комаанд лучше выполнить сразу, а не по одной, так оно намного быстрее

echo "C1
C2
C3
C4
C5" | mysql ...

drBatty ★★
()
Последнее исправление: drBatty (всего исправлений: 1)
Ответ на: комментарий от kvitaliy

всё спасибо с файлом mysql работает ) а подскажите ещё плиз ! вот есть php скрипт в нём идёт конект по ssh итд всё конектится, а как сделать скажем вывод команды pwd через этот скрипт ???

$result = ssh2_exec($ssh_conn, 'pwd');
if ($result === false) {
   die("Failed to execute command");
}else{
echo $result;
}

morgusha
() автор топика
Ответ на: комментарий от morgusha

вот я не пойму оболочка sh сначало работает с командами,а как указывать что другие команды надо исполнять другой оболочке???

morgusha
() автор топика
Ответ на: комментарий от morgusha

подскажите плиз.если на сервере есть несколько БД и mysqldump делать с ключом

—all-databases
то по какому приницпу будут формароваться имена баз данных ? или всё кинется в один файл ? и как сделать что бы каждая БД делалась со своим именем ?

morgusha
() автор топика
1 октября 2013 г.
Ответ на: комментарий от morgusha
ssh morgusha@morgusha.ru mysqldump -u$user -p$password $dbname > $dirbackup/db.sql

далее хочу делать бэкап директории на сервере делаю так вот:

>tar -zcvf morgusha.tar.gz morgusha.ru

ошибка tar нет такой директории !

morgusha
() автор топика
Ответ на: комментарий от morgusha

> $dirbackup/db.sql

tar -zcvf morgusha.tar.gz morgusha.ru

Ты реально такой бестолковый или тебе просто нравиться постить на ЛОР тупняк?

sdio ★★★★★
()
Ответ на: комментарий от sdio

ну ты и вредина ) я на работе занимаюсь одним делом. потом появляется вот время хочу доделать начатое и сразу так не могу переключиться !

ssh morgusha@morgusha.ru mysqldump -u$user -p$password $dbname > $dirbackup/db.sql 
ssh morgusha@morgusha.ru tar -zcvf morgusha1.tar.gz domains/morgusha.ru
так вот работает !

morgusha
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.