Назад | Перейти на главную страницу

как подключиться к базе данных mysql из сценария оболочки? Является ли это возможным?

Я запускаю прокси-сервер squid в своей системе, чтобы делиться интернет-соединением с друзьями в локальной сети. Я просто хочу записывать данные из файлов /var/log/squid/access.log в базу данных mysql всякий раз, когда мой сценарий обнаруживает ограниченный IP-адрес в файле журнала. Как это сделать? Можно ли подключиться к базе данных из сценария оболочки?

Вы можете просто использовать клиент CLI MySQL mysql для запроса или управления вашей базой данных.

Вы могли бы сделать что-то вроде

echo "insert into squidlog (time) values (now());" | mysql -u log -ploguserpassword log_db

Я не большой скриптер оболочки, но идею вы поняли. Я уверен, что с помощью некоторых необычных манипуляций вы также сможете получить всю необходимую информацию (например, IP-адрес).

Вы можете использовать команду mysql CLI, используя ...

mysql -hhostname -uusername -p'password' -e'select some sql here;'

Какой язык вы используете для своего сценария?

В Perl, например, вы можете определенно запросить базу данных.

Если вы используете Bash (или любой другой сценарий оболочки), вы не можете сделать это напрямую; вам придется полагаться на инструменты командной строки, которые могут выполнять эту работу (например, клиентские инструменты MySql) и анализировать их вывод.

В дополнение к приведенным выше ответам эта форма может быть более удобной:

mysql -h hostname -u username -p 'password' <<- _END_ | grep something
insert into....;
select * from....;
_END_

я добавил | grep something просто чтобы показать вам вариант вывода по конвейеру. Нет необходимости обрабатывать вывод используемого SQL-кода. Возможно, вы могли бы обернуть все это в myvariable=$(....) для локальной обработки вывода без использования другого скрипта. Это пример здесь документ. Обратите внимание, что это не проверено.


Более элегантная альтернатива:

Более элегантный способ сделать то, что вы делаете, может заключаться в передаче данных журнала непосредственно в скрипт вместо обработки файла журнала. Это даст вам данные в реальном времени, и вам не нужно будет беспокоиться о настройке задания cron для проверки файла на предмет изменений через определенные промежутки времени.

Пример этого метода:

LogFile Path/To/Log/In/Your/Configuration

к

LogFile |/usr/local/custom_script_you_made_to_process_the_data

Обратите внимание на трубу в начале пути. Это будет записывать выходные данные непосредственно в ваш скрипт, а не в файл журнала. Лично я бы использовал этот конвейерный метод, а затем использовал бы сценарий Perl для извлечения и форматирования данных, а затем пакет Perl `DBI :: mysql 'для отправки его в mysql. Если вам все еще нужны другие данные, вы можете добавить их в исходный файл журнала.

Обратите внимание, что для вашего сценария с помощью этого второго метода данные, отправляемые по-видимому, поступают из STDIN (стандартный ввод), как будто кто-то ввел их или вы отправили файл в сценарий.


Просто мой скромный комментарий, если вы хотите сделать это только в оболочка.... Когда я только начинал, я хотел все делать с Bash. Хотя оболочка довольно хороша, я обнаружил, что ограничение себя только Bash на самом деле заставляло меня прыгать через нелепые обручи, чтобы выполнить некоторые задачи. Как только я добавил Perl в свои сценарии и переключался между ними, чтобы воспользоваться преимуществами каждого из них, я сэкономил много времени и нашел свои решения более элегантными и чистыми. В этот момент я стал использовать лучший инструмент для работы вместо того, чтобы пытаться использовать один и тот же инструмент для всех проблем, который невероятно хорошо работает с Linux с тех пор. Оболочка делает феноменально универсальным и простым в использовании связующим звеном между разными скриптами на разных языках.