从shell脚本

时间:2017-07-01 11:04:32

标签: bash shell unix sudo

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

#!/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&#34; $ path&#34;。

之后得到的
Password: Sorry, try again.
Password: Sorry, try again.
Password: Sorry, try again.
sudo: 3 incorrect password attempts

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

1 个答案:

答案 0 :(得分:1)

当你这样做时:

somecmd | cmd << EOF
...
EOF

stdin的{​​{1}}将是here-document的内容, 并且不会读取来自管道的任何内容。 cmd的{​​{1}}将被关闭而不会从中读取任何内容。

因此,您的示例中发生的事情是stdout尝试从here-document读取密码,而不是您尝试传递给它的somecmd

换句话说,您无法向sudo提供密码,同时将here-document传递给它的shell。

你可以做的是分开这两个动作, 利用echo的超时选项。 也就是说,一旦您成功使用sudo, 它会记住你认证状态一段时间, 以及之后对sudo的调用不会再次要求输入密码。

sudo

但我建议你不要这样做。 在shell中以明文形式传递密码, 特别是在脚本中安全性很差。 最好创建一个专用脚本来执行其他用户帐户所需的操作,并适当地配置sudo