我正在为您使用用户名和密码登录的类(class)制作一个网站,然后它会将您带到一个显示您在类(class)中的成绩的页面。
该网站正在运行 bash script , 并将托管在用户已有用户名和密码登录的计算机上。
我还有一个名为 calcgrade.sh
的脚本,它将为当前登录的用户或作为参数传递给脚本的用户计算成绩。
所以最初,我打算使用这个命令:
echo -e "$password\n" | sudo -Sk -u $user ./website/calcgrade.sh
以网站用户身份运行calcgrade.sh
。但是,我发现sudo
要求输入当前 登录用户的密码,而不是您尝试运行的目标 用户的密码一个命令作为。
所以在阅读之后,我发现一个更好的选择是将 su
与 expect
脚本一起使用,但我无法让它工作。以下是 expect
脚本的代码(目前用户名和密码已硬编码以供测试):
#!/usr/bin/expect
log_user 0
spawn /bin/su myusername
expect "Password: "
send "mypassword"
spawn "./website/calcgrade.sh"
interact
当我运行这个脚本时,它似乎没有使用 su
登录用户,因为它继续使用我的帐户运行 calcgrade.sh
,而是比用户的。
你看到我的脚本有什么问题了吗?或者你能找到更好的方法来做我想做的事吗?
此外,此方法的另一个问题是 calcgrade.sh
应该将一些输出发送到 stderr
,但是当我使用 expect< 运行它时
脚本,错误消息被发送到网站(服务器通过将网站的 html 发送到 stdout
来工作)。有没有办法解决这个问题,或者让 expect
脚本只检查 su
用户名/密码是否正确可能更好,如果正确,则运行 ./calcgrade.sh $user
之后?
最佳答案
首先,这是做您想做的事情的正确方法:
- 授予您的 Web 服务器用户
sudo
权限,以任何用户身份运行./website/calcgrade.sh
,无需密码。 - 让网络服务器以您认为合适的方式对用户进行身份验证。
- 让它运行
sudo -u someuser ./website/calcgrade.sh
,不需要密码。
现在让我们看看为什么您的方法不起作用:
通常认为 su
会切换用户。不是这种情况。它实际上启动了一个以另一个用户身份运行的新 shell。
这意味着您不能生成 su otheruser
,让它完成,然后再生成 calcgrade.sh
。
相反,您必须运行 su otheruser
,然后将命令发送到 su
启动的 shell:
#!/usr/bin/expect
log_user 0
spawn /bin/su someuser
expect "Password: "
send "somepassword\n"
# Now wait for a prompt and send the command to run
expect "$"
send "./website/calcgrade.sh\n"
interact
关于bash - 无法使用 su 和 expect 脚本登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29174337/