从 shell 脚本执行 SUDO 的更安全方法
Safer way of performing SUDO from shell script
您好,我正在从 shell 脚本执行 SUDO 并从此处 DOC 获取指令。但我想知道我做的是否正确或是否以更安全的方式。它有时会锁定我的帐户(当我尝试更改路径时)我不知道为什么。
#!/bin/bash
# set the STRING variable
path=/u/siebel/abcdef/sie/sieb/
echo abcd | sudo -S /usr/bin/su - abcdef << EOF
crontab -l > cronbackup1.txt
#ls -lrt
cd "$path"
ls -lrt
EOF
以上脚本刚刚锁定了我的帐户。但是当我在没有 cd
的情况下执行它时它工作正常。这次它自己提示我密码错误 3 次,就像我一样 ./testing.sh
并被锁定,有人可以解释一下为什么它运行 3 次但脚本中没有循环吗?
这是我在设置 cd "$path" 后得到的。
Password: Sorry, try again.
Password: Sorry, try again.
Password: Sorry, try again.
sudo: 3 incorrect password attempts
对于相同的密码,crontab 工作正常。
当你这样做时:
somecmd | cmd << EOF
...
EOF
cmd
的stdin
将是here-document的内容,
并且不会读取来自管道的任何内容。
somecmd
的 stdout
将在不读取任何内容的情况下关闭。
那么在您的示例中发生的情况是 sudo
尝试从此处文档中读取密码,而不是您尝试通过管道传输给它的 echo
。
换句话说,您不能在向 sudo
提供密码的同时将 here-document 传递给其 shell。
你能做的就是把这两个动作分开,
利用 sudo
的超时选项。
也就是说,一旦你成功使用了sudo
,
它会暂时记住您的身份验证状态,
随后对 sudo
的调用将不会再次询问密码。
echo abcd | sudo -S true
sudo /usr/bin/su - abcdef << EOF
crontab -l > cronbackup1.txt
#ls -lrt
cd "$path"
ls -lrt
EOF
但是我劝你不要这样做。
在 shell 中以明文形式传递您的密码,
尤其是在脚本中,安全性非常差。
最好创建一个专用脚本来使用其他用户帐户执行您需要的操作并适当配置 sudoers
。
您好,我正在从 shell 脚本执行 SUDO 并从此处 DOC 获取指令。但我想知道我做的是否正确或是否以更安全的方式。它有时会锁定我的帐户(当我尝试更改路径时)我不知道为什么。
#!/bin/bash
# set the STRING variable
path=/u/siebel/abcdef/sie/sieb/
echo abcd | sudo -S /usr/bin/su - abcdef << EOF
crontab -l > cronbackup1.txt
#ls -lrt
cd "$path"
ls -lrt
EOF
以上脚本刚刚锁定了我的帐户。但是当我在没有 cd
的情况下执行它时它工作正常。这次它自己提示我密码错误 3 次,就像我一样 ./testing.sh
并被锁定,有人可以解释一下为什么它运行 3 次但脚本中没有循环吗?
这是我在设置 cd "$path" 后得到的。
Password: Sorry, try again.
Password: Sorry, try again.
Password: Sorry, try again.
sudo: 3 incorrect password attempts
对于相同的密码,crontab 工作正常。
当你这样做时:
somecmd | cmd << EOF
...
EOF
cmd
的stdin
将是here-document的内容,
并且不会读取来自管道的任何内容。
somecmd
的 stdout
将在不读取任何内容的情况下关闭。
那么在您的示例中发生的情况是 sudo
尝试从此处文档中读取密码,而不是您尝试通过管道传输给它的 echo
。
换句话说,您不能在向 sudo
提供密码的同时将 here-document 传递给其 shell。
你能做的就是把这两个动作分开,
利用 sudo
的超时选项。
也就是说,一旦你成功使用了sudo
,
它会暂时记住您的身份验证状态,
随后对 sudo
的调用将不会再次询问密码。
echo abcd | sudo -S true
sudo /usr/bin/su - abcdef << EOF
crontab -l > cronbackup1.txt
#ls -lrt
cd "$path"
ls -lrt
EOF
但是我劝你不要这样做。
在 shell 中以明文形式传递您的密码,
尤其是在脚本中,安全性非常差。
最好创建一个专用脚本来使用其他用户帐户执行您需要的操作并适当配置 sudoers
。