使用sudo访问权限附加到文件

时间:2017-05-03 18:54:28

标签: linux bash automation

我试图将行附加到root拥有的现有文件,我必须使用大约100台服务器执行此任务。所以我创建了servers.txt所有的IP和ntp.txt文件,它将包含我需要追加的行。我正在执行以下脚本,但我没有达到我想要的目标。有人可以建议需要纠正的内容吗?

!/bin/bash
servers=`cat servers.txt`;
for i in $servers;
do
  cat ntp.txt | ssh root@${i} sudo sh -c "cat >>ntp.conf""
done

1 个答案:

答案 0 :(得分:1)

以下是一些问题;不确定我找到了所有这些。

  1. shebang line缺少#,这是重要而重要的。
  2. 无需将服务器名称读入变量,除了浪费内存外,您还会遇到许多潜在问题;见https://mywiki.wooledge.org/DontReadLinesWithFor
  3. Unless you specifically require the shell to do whitespace tokenization and wildcard expansion on a value,用双引号(甚至是单引号),但这会禁止变量扩展,这仍然是你想要的。)
  4. 如果您以root身份登录,则无需明确sudo
  5. ssh为你运行一个shell;无需明确sh -c您的命令。
  6. 另一方面,如果可以,您希望避免运行root shell。在不必为了能够重定向而生成shell的情况下,附加到文件的常用方法是使用tee -a(只需删除-a来覆盖而不是追加)。同时将文件打印到标准输出是一种不受欢迎的效果(有些人会说tee的主要影响而不是副作用,但是我们不去那里)所以你经常会重定向到/dev/null以避免出现文本也溢出到你的屏幕上。
  7. 你可能想要避免使用useless use of cat,只是为了避免让某人指出它没用。
  8. #!/bin/bash
    while read -r server; do
    do
      ssh you@"$server" sudo tee -a /etc/ntp.conf <ntp.txt >/dev/null
    done <servers.txt
    

    我将代码更改为以you身份登录,但您需要根据自己的环境进行调整。 (如果您以自己的身份登录,通常只需ssh server而不明确指定用户名。)

    根据您的评论,我还添加了目标文件/etc/ntp.conf

    的完整路径

    更严格的服务器配置方法是使用类似CFengine2的东西来管理配置。