bash - 无法使用 su 和 expect 脚本登录用户

标签 bash expect sudo su

我正在为您使用用户名和密码登录的类(class)制作一个网站,然后它会将您带到一个显示您在类(class)中的成绩的页面。

该网站正在运行 bash script , 并将托管在用户已有用户名和密码登录的计算机上。

我还有一个名为 calcgrade.sh 的脚本,它将为当前登录的用户或作为参数传递给脚本的用户计算成绩。

所以最初,我打算使用这个命令:

echo -e "$password\n" | sudo -Sk -u $user ./website/calcgrade.sh

以网站用户身份运行calcgrade.sh。但是,我发现sudo 要求输入当前 登录用户的密码,而不是您尝试运行的目标 用户的密码一个命令作为。

所以在阅读之后,我发现一个更好的选择是将 suexpect 脚本一起使用,但我无法让它工作。以下是 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 之后?

最佳答案

首先,这是做您想做的事情的正确方法:

  1. 授予您的 Web 服务器用户 sudo 权限,以任何用户身份运行 ./website/calcgrade.sh,无需密码。
  2. 让网络服务器以您认为合适的方式对用户进行身份验证。
  3. 让它运行 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/

相关文章:

bash - 如何为多个项目创建多个 Neo4j 数据库?

python - 使用 python readline 时如何获取(和设置)当前 bash 光标位置?

python - Netcat 断开连接时自动重新连接

linux - 如何将字符串作为可选字符串在 expect 脚本中等待它?

macos - 当 "Operation not permitted"和 `sudo` 不起作用时,如何在 macOS 上避免 `bypass`

docker - 如何在 docker 容器中使用 sudo?

ubuntu - sudoers 是世界可写错误

bash - 如何用bash替换文本文件中的单行?

linux - 抑制期望输出

expect - 如何在 Expect 中发送 Ctrl + a 然后 d