LINUX.ORG.RU
ФорумAdmin

Как запустить cron скрипт sh

 , , , ,


0

2

Я создал простой скрипт sh, который должен вырубать все контейнеры докера и делать комит в гит:

#!/bin/bash
docker stop $(docker ps -aq | tr '\n' ' ');
cd /home/firnen/xsampdocker;
git add -A;
git commit -m "base commit";
git push webmail master;
docker start $(docker ps -aq | tr '\n' ' ');

я запускаю его следующей командой под рутом:

sh backup.sh

из терминала все работает. Потом я сделал запись в cron тоже под рутом:

sudo crontab -e
* * * * * bash /home/firnen/xsampdocker/backup.sh >/var/log/myjob.log 2>&1

В логах следующее:

8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1
/home/firnen/xsampdocker/backup.sh: line 2: $'\r': command not found
/home/firnen/xsampdocker/backup.sh: line 3: $'\r': command not found
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
/home/firnen/xsampdocker/backup.sh: line 4: $'\r': command not found
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
/home/firnen/xsampdocker/backup.sh: line 5: $'\r': command not found
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
/home/firnen/xsampdocker/backup.sh: line 6: $'\r': command not found
8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1

Подозреваю дело в синтаксисе скрипта, но я не пойму что именно не так…


/home/firnen

Рут не должен запускать ничего из /home. И трогать гит репы в /home тоже не должен, про это даже специальная проверка в гите есть, о чём он и ругается.

А ещё ты походу этот файл создавал в винде и в нём виндузятная кодировка концов строк, переделай.

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

Есть мнение, что:

Bash scripts are sensitive to line-endings, both in the script itself and in data it processes. They should have Unix-style line-endings, i.e., each line is terminated with a Line Feed character (decimal 10, hex 0A in ASCII).

Try:

sed -i 's/\r$//' backup.sh

Or:

dos2unix backup.sh

И еще, вот это $(docker ps -aq | tr '\n' ' ') можно заменить на это: $(docker ps -aq | tr '\r\n' ' ')

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

Переметил скрипт в /usr/local/sbin, Переделал команду в корн соответственно:

* * * * * sh /usr/local/sbin/backup.sh >/var/log/webmailbackup.log 2>&1

Создал файл скрипта так:

touch myscript.sh

Логи:

8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
fatal: detected dubious ownership in repository at '/home/firnen/xsampdocker'
To add an exception for this directory, call:

	git config --global --add safe.directory /home/firnen/xsampdocker
8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1

Мне надо было только скрипт перенести или и все файлы докера в какое-то другое место?

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

Зачем ты даёшь вредные советы? Гит пытается уберечь автора от организации дыры LPE, а ты советуешь как отключить эту защиту.

Повторю ещё раз: рутовый гит не должен трогать юзерские репозитории, ни при каких обстоятельствах.

Собственно правило более общее: рут вообще много чего юзерского не должен трогать, в ряде мест это может привести к нарушению безопасности или просто сбоям в работе софта.

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

Я дал «быстрое решение» и ссылку на «почитать» об этом.

Если это домашний компьютер, то вообще пофиг ) Иначе, почему этим занимается человек, который в этом не разбирается и не знает, как пользоваться гуглом?

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

Надо запускать гит с теми правами, которые у /home/firnen/xsampdocker. Подозреваю что это юзер firnen. Соответственно:

su -c 'cd /home/firnen/xsampdocker; git add -A; git commit -m "base commit"; git push webmail master;' - firnen

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

Это так называемое «быстрое решение» вредоносно и категорически неприемлемо. Оно из той же серии как chmod 777.

Если это домашний компьютер, то вообще пофиг

Нет не пофиг.

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

Нет не пофиг.

Ну, а чем это грозит в случае однопользовательского компьютера?

Т.к., это бэкап то и с репозиторием работа, вероятно, тоже однопользовательская…

Каковы будут цели и сценарий атаки?

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

Я изначально и хотел запускать скрипт от этого пользователя, но я получаю следующий вывод:

8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1
error: open("mysql/data/ib_buffer_pool"): Permission denied
error: unable to index file 'mysql/data/ib_buffer_pool'
fatal: updating files failed
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    backup.sh
        modified:   data/slapd/database/lock.mdb
        modified:   mysql/data/hmail/hm_accounts.ibd
        modified:   mysql/data/hmail/hm_imapfolders.ibd
        modified:   mysql/data/hmail/hm_logon_failures.ibd
        modified:   mysql/data/hmail/hm_messagerecipients.ibd
        modified:   mysql/data/hmail/hm_messages.ibd
        modified:   mysql/data/hmail/hm_securityranges.ibd
        modified:   mysql/data/ib_buffer_pool
        modified:   mysql/data/ib_logfile0
        modified:   mysql/data/ibdata1
        modified:   mysql/data/mysql/innodb_index_stats.ibd
        modified:   mysql/data/mysql/innodb_table_stats.ibd
        modified:   mysql/data/roundcube/fetchmail.MYD
        modified:   mysql/data/roundcube/fetchmail.MYI
        modified:   mysql/data/roundcube/session.ibd
        modified:   src/logs/errors.log

no changes added to commit (use "git add" and/or "git commit -a")
Everything up-to-date
8eee87483a12
7ad4a8af35e9
00a98896c801
1c1e5035bd97
26f91466a7f1

Я выставлял sudo chmod -R 777 . После чего от имени пользователя комит проходил нормльно, я подозреваю это происходит из-за того, что докер генерирует файлы другим пользователем(systemd-journal) и правами. Вот вывод ls -l в ./mysql/data:

-rw-r----- 1 999 systemd-journal        2 Dec 25 15:10 26f91466a7f1.pid
-rwxrwxrwx 1 999 firnen                 2 Nov 20 14:17 3b2a8c05d185.pid
-rw-r----- 1 999 systemd-journal       56 Dec 24 14:41 auto.cnf
-rwxrwxrwx 1 999 firnen              1680 Nov 13 11:38 ca-key.pem
-rwxrwxrwx 1 999 firnen              1112 Nov 13 11:38 ca.pem
-rwxrwxrwx 1 999 firnen              1112 Nov 13 11:38 client-cert.pem
-rwxrwxrwx 1 999 firnen              1680 Nov 13 11:38 client-key.pem
drwxrwxrwx 2 999 firnen              4096 Nov 20 15:17 hmail
-rw-r----- 1 999 systemd-journal      671 Dec 25 15:10 ib_buffer_pool
-rwxrwxrwx 1 999 firnen          50331648 Dec 25 15:11 ib_logfile0
-rwxrwxrwx 1 999 firnen          50331648 Dec 17 17:43 ib_logfile1
-rwxrwxrwx 1 999 firnen          79691776 Dec 25 15:11 ibdata1
-rw-r----- 1 999 systemd-journal 12582912 Dec 25 15:10 ibtmp1
drwxrwxrwx 2 999 firnen              4096 Nov 20 15:17 mysql
srwxrwxrwx 1 999 systemd-journal        0 Dec 25 15:10 mysql.sock
-rw------- 1 999 systemd-journal        2 Dec 25 15:10 mysql.sock.lock
drwxrwxrwx 2 999 firnen              4096 Nov 20 15:17 performance_schema
drwxrwxrwx 2 999 firnen              4096 Nov 20 15:17 php_mysql_db
drwxrwxrwx 2 999 firnen              4096 Nov 20 15:17 phpmyadmin
-rwxrwxrwx 1 999 firnen              1680 Nov 13 11:38 private_key.pem
-rwxrwxrwx 1 999 firnen               452 Nov 13 11:38 public_key.pem
drwxrwxrwx 2 999 firnen              4096 Dec 16 14:52 roundcube
-rwxrwxrwx 1 999 firnen              1112 Nov 13 11:38 server-cert.pem
-rwxrwxrwx 1 999 firnen              1680 Nov 13 11:38 server-key.pem
drwxrwxrwx 2 999 firnen             12288 Nov 20 15:17 sys

По этому я попробовал запускать от рута

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

Т.к., это бэкап

Что-то я сразу это не заметил. Странный способ делать бекапы гитом.

сценарий атаки?

Если кто-то взломает сервис, запущеный в контейнере, он сможет влиять на работу рута вне контейнера через этот скрипт и скорее всего получит таким образом LPE.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от Firnen

Очень странный способ бекапить базу. Ладно, тогда другой способ.

Организуй чтобы корень гит-репы принадлежат руту целиком, директория .git - тоже ему. Внутри неё уже создай директорию для докеров с какими хочешь правами и в ней делай что угодно. Тогда гит можно запускать от рута. Хотя я не уверен до конца, что это полностью безопасно, но лучше чем было.

firkax ★★★★★
()
  • 1. я бы от sh не работал. bash лучше
  • 2. не нужно перед скриптом писать sh система сама знает что ему запускать
  • 3. надо пробовать запускать от пользователя. если запускаешь от рута то можно команду запустить от пользователя su username -c
  • 4. пиши полные пути к исполняемым файлам
  • 5. для надежности в скрипте перейди в рабочий каталог
  • 6. надо знать как работает git и гуглить ошибку.

лучше выполнить все эти рекомендации.

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