dmesg с/без sudo в Debian / Mint

Пока вы можете do mysql запросы / обновления / и т. д. в сценарии оболочки гораздо проще использовать язык (например, perl или python ) с хорошей поддержкой обеих баз данных. и файлы CSV.

Вот один из способов сделать это в perl , используя модуль perl DBI и модули DBD :: CSV и DBD :: mysql .

Он читает каждую строку из вашего CSV-файла (я назвал это «обновлениями».csv 'и предположил, что имя столбца - phonenum ), и выдает команды SQL UPDATE для пользователей таблицы базы данных dbname в mysql. Измените dbname в соответствии с вашей базой данных.

ПРИМЕЧАНИЕ: следующий код не тестировался, но должен работать. Поскольку это не проверено, возможно, я допустил несколько опечаток или других ошибок.

Я настоятельно рекомендую сначала протестировать его на КОПИИ вашей базы данных, а не сразу запускать его на реальных данных. Фактически, ВСЕГДА - хорошая идея протестировать свой код на копии реальных данных, независимо от того, что вы пишете или на каком языке пишете.

#! /usr/bin/perl

use strict;
use DBI;

### 
### variables setup
### 

# DBD::CSV treats all .csv files in this dir as tables.
# i.e. this directory is the "database" and the .csv files
# are the tables in that database.
my $csv_dir = '/path/to/csv/dir'; 

my $csv_db  = 'updates';    # corresponds to "$csv_dir/updates.csv"

my $m_db    = 'dbname';     # replace with your mysql database name 
my $m_user  = 'username';
my $m_pass  = 'password';
my $m_host  = 'localhost';
my $m_port  = '3306';
my $m_dsn   = "DBI:mysql:database=${m_db};host=${m_host};port=${m_port}";

###
### database handle setup
###

# database handle for CSV connection
my $c_h = DBI->connect ("DBI:CSV:", undef, undef, {
               f_ext      => ".csv/r",
               f_dir => $csv_dir,
               RaiseError => 1,
               }) or die "Cannot connect: $DBI::errstr";


# database handle for mysql connection
my $m_h = DBI->connect($m_dsn, $m_user, $m_pass, { PrintError => 0 });

###
### all set up, time to do some work.
###

# NOTE: this script assumes that the .csv file contains a header line with
# the field names as the first line of the file.
#
# If not, the easiest thing to do is edit it with your preferred text
# editor and add one.  Otherwise, see `man DBD::CSV` to find out how to
# specify field names.
#
# or EDIT and uncomment the following three lines of code:

#$c_h->{csv_tables}{$csv_db} = { 
#  col_names => [ qw(column1 phonenum column3 column4 ...) ];
#};

# prepare statement handle for csv db query using a placeholder ? for the
# column name.
my $c_sth = $c_h->prepare("select phonenum from ?");

# and execute it.  later, we'll use a forech loop to read the data returned
$c_sth->execute($csv_db);

# prepare the SQL statement for the mysql db using placeholders ? for
# the values. this assumes that the column/field name is also called
# 'phonenum' in mysql.  These placeholders are invaluable, they automaticaly
# quote any data that needs to be quoted (e.g. strings) while not quoting
# things that shouldn't be quoted (e.g. integers).  They prevent a huge
# range of common mistakes.
#
# prepare it once, execute it multiple times with different values.

my $m_sth = $m_h->prepare('UPDATE users SET phonenum = ? WHERE phonenum = ?');

$m_h->begin_work;  # begin transaction

foreach ($c_sth->fetchrow_array) {
   chomp;
   my $newphone = "A2B1 $_";
   $m_sth = $m_sth->execute($newphone, $_);
};

$m_h->commit;  # commit transaction

### 
### we're done.  finish the statement handles and disconnect from
### the databases.
###
$c_sth->finish;
$m_sth->finish;
$c_h->disconnect;
$m_h->disconnect;

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

3
31.10.2017, 15:13
2 ответа

Это контролируется записью dmesg_restrictsysctl, описанной в документации ядра . Его значение по умолчанию определяется значением конфигурации ядра CONFIG_SECURITY_DMESG_RESTRICT, которое обычно включено в современных дистрибутивах.

Вы можете увидеть текущее значение, запустив

/sbin/sysctl kernel.dmesg_restrict

и измените его значение, используя (как root)

.
sysctl -w kernel.dmesg_restrict=1

(для включения ограничения )или

sysctl -w kernel.dmesg_restrict=0

(, чтобы отключить его и восстановить старое поведение ).

Чтобы сделать это изменение постоянным (, автоматически применяемым при загрузке ), запишите его в /etc/sysctl.confили в файл конфигурации в/etc/sysctl.d:

echo kernel.dmesg_restrict=0 | sudo tee -a /etc/sysctl.d/99-dmesg.conf
11
27.01.2020, 21:15

Как ответили другие, вы можете использовать /sbin/sysctlдля проверки и изменения значений во время выполнения.

Однако, чтобы эти изменения сохранялись при перезагрузке, их следует добавить в/etc/sysctl.conf

0
27.01.2020, 21:15

Теги

Похожие вопросы