使用Bash脚本配置Filebeat与Logstash时遭遇权限拒绝问题
权限拒绝问题的原因及解决方法
为啥会报错?
- Filebeat配置写入环节:你用
sudo rm删掉旧文件没问题,但后面cat > /etc/filebeat/filebeat.yml是用普通用户权限执行的,/etc目录属于root,普通用户根本没权限往里面写东西。 - Logstash配置写入环节:
sudo cat > ...这个写法有坑——sudo只给cat命令开了root权限,但重定向符号>是当前普通用户的shell在处理,所以还是没权限写入root拥有的文件。另外你脚本里/etc/logstash/conf.d/apache.conf后面多了个空格,会创建带空格的配置文件,Logstash肯定识别不了。
修正后的脚本方案
方案1:用sudo tee替代重定向(推荐)
sudo tee能在root权限下写入文件,还支持heredoc语法,完美解决重定向权限问题:
#!/bin/bash # 删除旧的Filebeat配置 sudo rm -f /etc/filebeat/filebeat.yml # 写入新的Filebeat配置 sudo tee /etc/filebeat/filebeat.yml > /dev/null <<EOF filebeat.inputs: - type: filestream id: my-filestream-id enabled: true paths: - /home/ubuntu/logs/.*log setup.kibana: # 如果需要连接Kibana,这里要填正确地址,比如 hosts: ["169.254.169.254:5601"] output.logstash: hosts: ["169.254.169.254:5044"] EOF # 写入Logstash配置(注意去掉文件名后面的空格!) sudo tee /etc/logstash/conf.d/apache.conf > /dev/null <<EOF input { beats { port => 5044 } } output { elasticsearch { hosts => ["169.254.169.254:9200"] # ES默认端口是9200,建议加上避免踩坑 } } EOF
加
> /dev/null是为了不让tee把配置内容输出到终端,只写入文件。
方案2:把写入逻辑放进sudo子shell
把所有需要root权限的操作包裹在sudo bash -c里,这样整个重定向操作都是root权限执行:
#!/bin/bash sudo bash -c ' rm -f /etc/filebeat/filebeat.yml cat > /etc/filebeat/filebeat.yml <<EOF filebeat.inputs: - type: filestream id: my-filestream-id enabled: true paths: - /home/ubuntu/logs/.*log setup.kibana: output.logstash: hosts: ["169.254.169.254:5044"] EOF cat > /etc/logstash/conf.d/apache.conf <<EOF input { beats { port => 5044 } } output { elasticsearch { hosts => ["169.254.169.254"] } } EOF '
额外要注意的点
- 配置文件权限:写完后可以手动确保权限正确(一般默认就是对的,保险起见可以跑一下):
sudo chown root:root /etc/filebeat/filebeat.yml /etc/logstash/conf.d/apache.conf sudo chmod 644 /etc/filebeat/filebeat.yml /etc/logstash/conf.d/apache.conf - 重启服务:改完配置必须重启服务才会生效:
sudo systemctl restart filebeat logstash - 检查配置语法:提前验证配置有没有语法错误,避免服务启动失败:
- Filebeat:
sudo filebeat test config - Logstash:
sudo logstash -f /etc/logstash/conf.d/apache.conf --config.test_and_exit
- Filebeat:
内容的提问来源于stack exchange,提问作者eme
相关产品推荐
相关产品推荐

