如何制作一个可以打开mysql的程序

如何制作一个可以打开mysql的程序,mysql,ruby,inspec,Mysql,Ruby,Inspec,我正在开发一个InSpec控件,它运行CIS符合性命令。 在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*\

我正在开发一个InSpec控件,它运行CIS符合性命令。 在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"
谢谢你的帮助@Matt

我读了你的答案,发现它真的很有用,除了最后一段代码:Does

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

?


另外,我尝试了你之前写的所有模块,但没有一个成功。。是的,我使用的是linux 16.04,您可以使用以下方法提取SQL请求的输出:

command('mysql -u <user> -p -e "show variables where variable_name = \'datadir\'"').stdout.split(' ')
在上面,我们迭代SQL查询中捕获的变量数组,并在
descripe命令()
RSpec测试中对其进行测试。执行此测试的更好方法是在matcher中测试
命令的stdout,而不是
egrep
。执行此操作并清除
匹配
方法:

# 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
我们可以做的另一个改进是使用更适合的
文件
类型和权限匹配器,而不是原始命令。这有助于平台独立测试:

# 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
#存储变量数组
variables=command('mysql-u-p-e“显示变量,其中变量名=\'datadir\'”).stdout.split(“”)
#在文件类型中使用数组
变量。每个do |变量|
描述文件(“#{variable}/.”)do
#检查权限
它{expect(subject).to_不被'mysql'拥有}
它{expect(subject).to\u不被\u分组\u进入'mysql'}
它{expect(subject).to_不是由'mysql'执行的}
结束
结束

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

问题中的第二个命令和您的代码块中的命令是不同的。哪个是正确的命令?块只是一个例子。我在使用这些命令时遇到了一些问题,我已经编辑了我的问题
# 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
# 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
# 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
# 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