0

我有一个脚本应该创建一个文件并将内容添加到文件中列出的主机上的文件中:

#!/bin/bash

while read f; do

   sshpass -p "mypassword" ssh-copy-id myusername@"$f"
   ssh -ntt myusername@"$f" '
        echo mypassword | sudo -S touch  /etc/sudoers.d/10_icinga_check_postfix_queue || true
        echo mypassword | sudo -S echo "icinga ALL=(ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_postfix_queue" > /etc/sudoers.d/10_icinga_check_postfix_queue || true' </dev/null

done < linux-list.txt

但我得到一个错误,不知道为什么。你能帮忙吗?

bash: line 1: /etc/sudoers.d/10_icinga_check_postfix_queue: Permission denied

谢谢

4

2 回答 2

1

重构戈登的答案怎么样?无论如何都不需要单独touch将要覆盖的文件。

#!/bin/bash

while read -r f; do
   sshpass -p "mypassword" ssh-copy-id myusername@"$f"
   ssh -ntt myusername@"$f" '
        echo mypassword | sudo -S bash -c "echo \"icinga ALL=(ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_postfix_queue, /usr/lib64/nagios/plugins/contrib/restart_service.sh\" > /etc/sudoers.d/10_icinga_check_postfix_queue" || true' </dev/null    
done < linux-list.txt

-r另请注意(重新)引入read. 这在这里可能并不重要,但习惯它可以帮助避免不愉快的意外,因为它确实有所作为。

于 2018-08-06T04:16:44.490 回答
0

尝试这个:

#!/bin/bash

while read f; do

   sshpass -p "mypassword" ssh-copy-id myusername@"$f"
   ssh -ntt myusername@"$f" '
        echo mypassword | sudo -S touch  /etc/sudoers.d/10_icinga_check_postfix_queue || true
        echo mypassword | sudo -S bash -c "echo \"icinga ALL=(ALL) NOPASSWD: /usr/lib64/nagios/plugins/check_postfix_queue, /usr/lib64/nagios/plugins/contrib/restart_service.sh\" > /etc/sudoers.d/10_icinga_check_postfix_queue" || true' </dev/null

done < linux-list.txt

这将在 sudo shell 中运行整个echo ... >file命令(而不是仅echo使用 sudo 运行,并且>file部分没有特权)。这里棘手的是引用:有一个单引号字符串ssh作为参数传递(在远程计算机上运行的命令);在其中,有一个双引号字符串bash -c作为命令运行(作为 root)传递给,在其中,还有另一个带引号的字符串。由于引号不嵌套,所以最里面的引号字符串使用转义的双引号 (\"),当在本地计算机上解析单引号字符串时,它会原封不动地传递,然后当远程 shell 解析外部双引号字符串时,转义符被删除,所以当远程 root shell 看到它时,它是一个普通的双引号字符串。是的,这是一团糟,但它应该可以工作(虽然我还没有测试过)。

于 2018-08-04T01:32:37.527 回答