我有一个shell脚本,它需要非root用户帐户来运行某些命令,然后将用户更改为root来运行脚本的其余部分。我使用SUSE 11。我使用expect来自动化密码提示。但是当我使用spawn su -执行命令时,提示符会返回root,脚本的其余部分不会执行。
例
< non-root commands>
spawn su -
<root commands>
但是在su -之后,提示符以root用户身份返回。如何执行脚本的其余部分。
sudo -S选项没有帮助,因为它不运行sudo -S ifconfig命令,我需要找到机器的IP地址。
我已经看过这些链接,但找不到解决方案:Change script directory to user's homedir in a shell script
Changing unix user in a shell script
6条答案
按热度按时间e0bqpujr1#
sudo
可以在这里工作,但是你需要稍微修改一下你的脚本:您需要在
<<EOF
块中运行命令,并将块交给sudo
。当然,如果你愿意,你可以使用
su
。但是你需要使用expect/pexpect
来运行它,它会为你输入密码。但即使你可以自动输入密码(或关闭它),这种结构也不会起作用:
在这种情况下,
root-command
将以user而不是root权限执行,因为它将在su
完成后执行(su
打开一个新的shell,而不是更改当前shell的uid)。当然,您可以在这里使用相同的技巧:但是现在你有与
sudo
相同的。bihw5rsg2#
有一个简单的方法可以做到这一点,而不需要第二个脚本。只需将以下内容放在文件的开头:
当然,这是假设你可以
sudo su
而不需要提供密码--但这超出了本答案的范围;请参阅关于在shell脚本中使用sudo的其他问题之一,了解如何做到这一点。zzwlnbp83#
简短版本:创建一个块来包含所有要以root身份运行的命令。
例如,我创建了一个脚本来从根子目录运行命令,该片段如下所示:
yuvru6vn4#
另外,请注意,如果您在shell脚本中更改为“root”用户,如下面的一个,一些Linux实用程序,如awk,用于数据提取或定义甚至一个简单的shell变量等,将表现得很奇怪。
要解决这个问题,只需使用〈'EOF'代替EOF引用整个文档。
1rhkuytd5#
最简单的方法是创建至少两个脚本。
第一个脚本应该以root权限调用第二个脚本,所以在第二个脚本中执行的每个命令都将以root权限执行。
例如:
runasroot.sh
scriptname.sh
或者任何你需要的东西
ddarikpa6#
您可以使用此函数,它将以root身份再次调用脚本,并将第一个参数传递给新调用:
请注意,“$0”[may not be what you think it is]](http://mywiki.wooledge.org/BashFAQ/028)