我有一个shell脚本,需要非root用户帐户才能运行某些命令,然后将用户更改为root以运行脚本的其余部分.我正在使用SUSE11.我用expect期望自动化密码提示.但是当我使用spawn su - 并且命令被执行时,提示符将以root身份返回,并且脚本的其余部分不会执行.
例如.
< non-root commands>
spawn su -
<root commands>
Run Code Online (Sandbox Code Playgroud)
但在su之后 - 提示以root身份返回用户.如何执行剩余的脚本.
sudo -S选项没有帮助,因为它没有运行sudo -S ifconfig命令,我需要找到机器的IP地址.
我已经浏览了这些链接但找不到解决方案: 在shell脚本中将脚本目录更改为用户的homedir
Igo*_*bin 20
sudo 会在这里工作,但你需要改变你的脚本:
$ cat 1.sh
id
sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF
$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!
Run Code Online (Sandbox Code Playgroud)
你需要在<<EOF块中运行你的命令并给出块sudo.
如果你愿意,你su当然可以使用.但是你需要使用expect/pexpect它来运行它,为你输入密码.
但即使你可以设法自动输入密码(或关闭它),这种结构也行不通:
user-command
su
root-command
Run Code Online (Sandbox Code Playgroud)
在这种情况下,root-command将使用用户执行,而不是使用root权限,因为它将su在完成后执行(su打开一个新的shell,而不是更改当前shell的uid).当然,你可以在这里使用相同的技巧:
su -c 'sh -s' <<EOF
# list of root commands
EOF
Run Code Online (Sandbox Code Playgroud)
但现在你和它一样sudo.
没有第二个脚本,有一种简单的方法可以做到这一点.只需将其放在文件的开头:
if [ "$(whoami)" != "root" ]
then
sudo su -s "$0"
exit
fi
Run Code Online (Sandbox Code Playgroud)
然后它将自动以root身份运行.当然,这假设你可以sudo su不必提供密码 - 但这超出了这个答案的范围; 请参阅有关在shell脚本中使用sudo的其他问题之一.
小智 6
简短版本:创建一个块来包含要以 root 身份运行的所有命令。
例如,我创建了一个脚本来从根子目录运行命令,该段如下所示:
sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73418 次 |
| 最近记录: |