执行 sudo 和 chmod 命令的 bash 脚本无法正常工作

Posted

技术标签:

【中文标题】执行 sudo 和 chmod 命令的 bash 脚本无法正常工作【英文标题】:bash script executing sudo and chmod command not working properly 【发布时间】:2014-02-08 06:25:17 【问题描述】:

我正在尝试创建一个以用户执行 sudo -s 命令开始的 bash 脚本。

这是我的脚本:

#!/bin/bash
SSH_USER=testuser
SUDO_PASSWD=secretpassword
FILE=/www/a/logs/service.log

MACHINES=( 'machine1' );
for HOST in $MACHINES[@]; do
    ssh -t -l "$SSH_USER" "$HOST" "echo '$SUDO_PASSWD' | sudo -Ss chmod 777 $FILE"
done

我觉得这个脚本不应该提示我输入密码,但它会提示。我不想输入 30 次不同的密码。我尝试了多个版本,将密码硬编码到脚本中,但仍然提示我输入密码。请帮帮我。我对创建 bash 脚本非常陌生,需要一些认真的指导。

【问题讨论】:

我已尝试修复您的代码格式,但该格式已损坏。请检查我是否无意中更改了内容。 最重要的是:不要硬编码你的root密码!如果您对安全性有一点担心,那正是您不应该做的事情。 我知道,硬编码我的密码是最终的禁忌,但我需要这样做一次。这个脚本不是一个 cronjob,它会运行一次,就是这样。脚本运行后,我将删除其内容。 我现在看到错误“[sudo] testuser 的密码:与 的连接已关闭 但是chmod 发生了吗?不确定这实际上是一个错误。 【参考方案1】:

同意 Sami,脚本中没有硬编码密码。

更多建议。

如果脚本不需要以 root 身份运行,并且可以由其他应用程序管理员帐户(例如 DBA)运行,则应指定该用户仅限制权限,例如:

foo ALL = (dba) NOPASSWD: /usr/local/sbin/do-unsafe

其次,不要给任何具有777权限的文件,这是不安全的。想想其他一些方式,例如 ACL 权限集。

chmod 777 $FILE

【讨论】:

【参考方案2】:

您的想法永远不会起作用,因为 sudo(1) 不会从标准输入读取密码,除非它是终端。正如 cmets 中反复指出的那样,将密码硬编码到脚本中也是非常糟糕的主意。

如果你真的想实现这一点(我建议不要这样做),你应该在你的目标机器上编辑/etc/sudoers,让你运行 sudo(1) 而不需要密码来完成你需要做的事情密码。为此,您不应该让自己在没有密码的情况下运行 any chmod 命令行,而是在目标机器上创建一个脚本(例如 ´/usr/local/bin/do-my-promiscuous-chmod` ) 然后告诉 sudo 让您在不询问密码的情况下只运行该脚本。

例如,将以下内容添加到 /etc/sudoers 将让用户“foo”在没有密码和 root 权限的情况下运行 /usr/local/sbin/do-unsafe

foo ALL = (root) NOPASSWD: /usr/local/sbin/do-unsafe

【讨论】:

以下命令适用于我,我输入一个密码 - ssh -l graeme localhost "echo mypassword | sudo -Ss chmod 777 test"。如果你给它 -S 选项,Sudo 将从 stdin 读取密码,如问题所示。 是的。我应该戴上眼镜。 感谢大家的帮助。我决定找一把钥匙来简化这个过程。

以上是关于执行 sudo 和 chmod 命令的 bash 脚本无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 之 sudo

为啥linux有时候命令会提示 Permission denied

chmod 777 /etc/sudoers

Linux下-bash: Permission denied 或者 sudo: command not found 错误

Bash:sudo:找不到命令

如何取消ubuntu可执行文件属性