2017-07-01 35 views
1

嗨,我正在执行SUDO从shell脚本并从hereDOC获取指令。但我想知道我做的是正确的还是以更安全的方式。它有时锁定我的帐户(当我试图改变路径),我不知道为什么。从shell脚本执行SUDO的更安全的方法

#!/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“$路径”后得到的。

Password: Sorry, try again. 
Password: Sorry, try again. 
Password: Sorry, try again. 
sudo: 3 incorrect password attempts 

对于相同的密码crontab工作正常。

+0

你会得到什么信息?我很确定它不会说“您的帐户已被锁定,因为...”。只有当你输入错误的密码时,它才会要求输入密码3,因为这是sudo的行为。尝试运行'sudo echo test'。 – NieDzejkob

+0

@NieDzejkob更新回答 –

+0

'3不正确的密码尝试'意味着'3不正确的密码尝试',而不是'入侵者警报'。停止阅读未写的内容。 – NieDzejkob

回答

1

当你这样做:

somecmd | cmd << EOF 
... 
EOF 

的的cmdstdin将是这里的文档, 的内容和无论是从管道未来将不会被读取。 somecmdstdout将被关闭,但不会读取任何内容。

因此,在您的示例中发生的是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

+0

感谢janos的好解释是否有任何要求使用BASH以上? –

+0

@TusharSharma我不明白你的意见。无论如何,在你的问题和这个答案的背景下,没有Bash的要求。 – janos

+0

没关系Janos你的回答帮助我解决了我的问题,谢谢。 –