【问题标题】:How to make a program that can open mysql如何制作一个可以打开mysql的程序
【发布时间】:2018-10-13 15:50:15
【问题描述】:

我正在开发一个运行 CIS 合规性命令的 InSpec 控件。 在使用 MySQL 时,我被困在这里:

执行以下SQL语句确定datadir的值:

show variables where variable_name = 'datadir';

我需要从上面的命令中提取输出并在下一个命令中重用它:

ls -l <THE OUTPUT OF THE PREVIOUS COMMAND>/.. | egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"

问题是第一个命令是 SQL 请求,第二个命令是终端命令。

如何将它们(在获得第一个命令的输出并将其放入第二个命令后)放入 InSpec 控件,如下所示:

control "mysql1" do
    impact 1.0
    title "Use dedicated Least Privileged Account for MySQL Daemon/Service"
    desc "May reduce the impact of a MySQL-born vulnerability"
    describe command ('ps -ef |e grep "^mysql.*$"') do
    its('stdout') { should match ''}
    end
end

感谢您的帮助@Matt

我已阅读您的回答,发现它真的很有帮助,除了最后一段代码:是否

egrep "^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql"

意思

it { expect(subject).to_not be_owned_by 'mysql' }
it { expect(subject).to_not be_grouped_into 'mysql' }
it { expect(subject).to_not be_executable_by 'mysql' }

?

另外,我确实尝试了您之前编写的所有块,但它们都不起作用。是的,我使用的是 linux 16.04

【问题讨论】:

  • 问题和代码块中的第二个命令不同。哪个是正确的命令?
  • 块只是一个例子

标签: mysql ruby inspec


【解决方案1】:

您可以使用以下方法提取 SQL 请求的输出:

command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')

mysql -u &lt;user&gt; -p -e 部分是从 Linux 命令执行 SQL 查询所必需的。如果您使用的是 Window,则可能需要改用 sqlcmd。这允许使用command 方法成功执行 SQL 查询。

command 方法在这里起作用的原因是因为它是一个自定义的 RSpec 类型(因此隐含地也是一个类构造函数,因为 Ruby 有构造函数),它将在测试系统上本地或远程执行。 .stdout 方法是类的成员,用于捕获命令的标准输出。 .split 将确保输出变量存储在以空格分隔的数组中。

现在我们可以像这样在下一个命令中使用它:

# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
  describe command("ls -l #{variable}/.. | egrep \"^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql\"") do
    its('stdout') { should match ''}
  end
end

上面我们遍历 SQL 查询中捕获的变量数组,并在describe command() RSpec 测试中对其进行测试。执行此测试的更好方法是测试匹配器中command 的标准输出,而不是egrep。这样做并清理match 方法:

# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
  describe command("ls -l #{variable}/..") do
    its('stdout') { should_not match(/^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql/)}
  end
end

更新到未弃用的 RSpec 匹配器并将 stdout 方法的调用修复为字符串而不是我们到达的符号:

# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in command
variables.each do |variable|
  describe command("ls -l #{variable}/..") do
    its(:stdout) { is_expected.to_not match(/^d[r|w|x]{3}------\s*.\s*mysql\s*mysql\s*\d*.*mysql/)}
  end
end

我们可以做的另一个改进是使用更适合的file 类型和权限匹配器而不是原始命令。这有助于独立于平台的测试:

# store array of variables
variables = command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
# use array in file type
variables.each do |variable|
  describe file("#{variable}/..") do
    # check permissions
    it { expect(subject).to_not be_owned_by 'mysql' }
    it { expect(subject).to_not be_grouped_into 'mysql' }
    it { expect(subject).to_not be_executable_by 'mysql' }
  end
end

我知道这里有一些很好的地方可以实现您正在寻找的功能以及许多修复和改进,因此请务必仔细检查代码和解释以了解我在这里所做的一切。

【讨论】:

  • 我在使用这些命令时遇到了一些问题,我已经编辑了我的问题
猜你喜欢
  • 2015-12-24
  • 2018-05-06
  • 2015-07-22
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多