Хочу поделиться проблемкой, с которой столкнулся на днях при обновлении одного из серверов. Проблему решил достаточно быстро, но возможно будет кому-нибудь полезно, да и до конца не разобрался в чем причина. Может вместе додумаем.
Debian GNU/Linux 7.5 (wheezy)
MySQL: обновлял с 5.5.37-0+wheezy1 на 5.6.17-1~dotdeb.1$
Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
Подключенный репозиторий:
Код: Выделить всё
$ cat /etc/apt/sources.list.d/php-fpm.list
deb http://packages.dotdeb.org wheezy all
deb-src http://packages.dotdeb.org wheezy allМои изначальные действия:
Стандартное обновление системы через apt (apt-get update, apt-get upgrade, apt-get distr-upgrade)
Происходит обновление MySQL. Вываливается ошибка
Код: Выделить всё
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 37: use: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 38: use: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 46: BEGIN: команда не найдена
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 47: syntax error near unexpected token `('
May 14 08:48:18 letters mysqld_safe[14303]: /usr/bin/mysql_install_db: line 47: ` my @req_mods = ('Fcntl', 'File::Basename', 'File::Copy', 'Getopt::Long','Решил вычистить сам старый mysql-server перед установкой новой версии.
apt-get purge mysql-server mysql-client mysql-common
Удалил каталог /etc/mysql
Проиндексировал по новой файловую систему updatedb и через locate удалил остатки старого mysql-а оставив только /var/lib/mysql
Ставлю по новой - другие ошибки:
Код: Выделить всё
May 14 09:03:03 letters mysqld_safe[26387]: 2014-05-14 09:03:03 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
May 14 09:03:05 letters mysqld_safe[26413]: ERROR: 1062 Duplicate entry 'innodb' for key 'PRIMARY'
May 14 09:03:07 letters /etc/init.d/mysql[26488]: WARNING: /etc/mysql/my.cnf cannot be read. See README.Debian.gz
May 14 09:12:58 letters /etc/mysql/debian-start[27724]: FATAL ERROR: Upgrade failedВ консоль при запуске вываливалось сообщения о том что нет $HOME.
No directory, logging in with HOME=/
Нашел пример /etc/mysql/my.cnf, добавил туда explicit_defaults_for_timestamp.
Иду в passwd и вижу что у пользователя mysql сменился домашний каталог на /nonexistent, оболочка /bin/false
И вроде бы это норма, по причине:
If an attacker can trick mysqld into creating
dot files in the home directory, he could do .rhost-like attacks
on the system.
Далее вываливается ошибка:
Код: Выделить всё
-su: 39: function: not found
итого 88
755 drwxr-xr-x 23 root root 4096 Дек 9 15:10 ./
755 drwxr-xr-x 23 root root 4096 Дек 9 15:10 ../
755 drwxr-xr-x 2 root root 4096 Дек 9 15:22 bin/
755 drwxr-xr-x 3 root root 4096 Май 14 08:44 boot/
755 drwxr-xr-x 13 root root 3120 Апр 1 12:43 dev/
755 drwxr-xr-x 78 root root 4096 Май 14 10:48 etc/
755 drwxr-xr-x 2 root root 4096 Сен 23 2013 home/
777 lrwxrwxrwx 1 root root 30 Дек 9 15:10 initrd.img -> /boot/initrd.img-3.2.0-4-amd64
755 drwxr-xr-x 14 root root 4096 Апр 2 09:49 lib/
755 drwxr-xr-x 2 root root 4096 Мар 12 14:10 lib64/
700 drwx------ 2 root root 16384 Дек 9 15:09 lost+found/
755 drwxr-xr-x 4 root root 4096 Дек 9 15:09 media/
755 drwxr-xr-x 3 root root 4096 Апр 1 12:42 mnt/
755 drwxr-xr-x 2 root root 4096 Дек 9 15:09 opt/
555 dr-xr-xr-x 106 root root 0 Апр 1 22:43 proc/
700 drwx------ 5 root root 4096 Май 14 10:52 root/
755 drwxr-xr-x 11 root root 540 Май 14 10:55 run/
755 drwxr-xr-x 2 root root 4096 Май 14 08:44 sbin/
755 drwxr-xr-x 2 root root 4096 Июн 10 2012 selinux/
755 drwxr-xr-x 2 root root 4096 Дек 9 15:09 srv/
755 drwxr-xr-x 13 root root 0 Апр 1 22:43 sys/
776 drwxrwxrwt 5 www-data root 4096 Май 14 10:54 tmp/
755 drwxr-xr-x 10 root root 4096 Дек 9 15:09 usr/
755 drwxr-xr-x 12 root root 4096 Апр 2 09:51 var/
777 lrwxrwxrwx 1 root root 26 Дек 9 15:10 vmlinuz -> boot/vmlinuz-3.2.0-4-amd64
-su: 41: Syntax error: "}" unexpectedт.е. почему то вызывается команда ll и выводится содержимое корня потому что нету домашнего каталога.
Причем у меня в системном профиле переназначен альяс ll на мою функцию которая как видно у меня добавляет столбик с битами прав.
Так же хочу обратить внимание на такой момент, который я не заметил в выводе:
-su: 39: function т.е. '-' перед su...
Откуда он появляется ниже.
Пробовал запускать от пользователя mysql с оболочкой sh. Вываливалось следующее:
Код: Выделить всё
Error: mysqld-su
Command not found!Тут я увидел как раз этот -su который не понятно откуда формировался.
Для тотального логирование действий пользователей я использую ELF-библиотеку snoopy (snoopy logger). Кстати всем ее очень советую
Полез я в логи snoopy посмотреть что же происходит такое и какие процессы вообще запускаются.
При старте вижу там следующее:
Код: Выделить всё
May 14 10:35:30 letters snoopy[11347]: [uid:0 sid:11108 tty: cwd:/ filename:/bin/su]: su - mysql -s /bin/bash -c /usr/bin/mysqld_safe > /dev/null 2>&1 &
May 14 10:35:30 letters snoopy[11348]: [uid:104 sid:11348 tty: cwd:/var/lib/mysql filename:/bin/bash]: -su -c /usr/bin/mysqld_safe > /dev/null 2>&1 &т.е. как видно от рута выполняется команда запуска mysql-a от пользователя mysql и сполучением его окружения через '-'
А пользователь уже выполняет -su ...
Думаю, неужели косяк в /etc/init.d/mysql скрипте. Полез туда, но там все нормально:
Код: Выделить всё
# Could be removed during boot
test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld
# Start MySQL!
su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"Пробую вручную выполнить команду. Ошибка аналогичная.
Убираю аргумент получения окружения '-' работает.... меняю оболочку /bin/sh на bash - рабоет....
пока как временное решение сменил команду
su - mysql -s /bin/sh -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"
на
su - mysql -s /bin/bash -c "/usr/bin/mysqld_safe > /dev/null 2>&1 &"
Почему при вызове su - mysql с оболочкой sh выполняется команда -su я так и не понял
Смотрел env-ы, ничего особенного и не правильного не заметил.
У кого какие мысли на этот счет?