当我在bash脚本中使用 expect interact 手动请求root密码时,它接受该密码,提升为root用户,但退出时未完成bash脚本的其余部分。
我正在将用户从旧的CentOS计算机迁移到新的RHEL计算机。我有一个手动执行此操作的过程,但是正在尝试使该过程自动化。我已经完成了大部分工作,但是其中一些步骤需要root级权限。我试图在bash脚本中使用Expect交互来执行 su 命令,以确保root密码保持安全。
#!/bin/bash
elevate()
{
echo
echo "You must be logged in as root to continue."
echo "Press [Enter] to login as root."
/usr/bin/expect -c 'expect "\n" { eval spawn su; interact }'
}
User=`whoami`
if [ $User != "root" ]
then
elevate
fi
echo "script completed"
exit
如果我在启动脚本时以root用户身份登录,则它将永远不会执行elevate函数,并且会收到“ 脚本已完成”响应。如果我以任何其他用户身份登录,则执行elevate函数,我手动输入root密码,并且脚本退出时未提供“ 脚本已完成”响应,但我仍以根用户。
答案 0 :(得分:0)
如果您不是root用户,则su
要求输入密码,然后启动root shell。您现在interact
正在使用该shell。
我手动输入root密码,脚本退出而没有提供“脚本完成”响应,但是我仍然以root用户身份登录。
我相信您在陈述“脚本退出”方面是不正确的。选中pstree -s $$
,我敢打赌,您会在其中看到期望的过程。
当退出该根shell时,su
进程将结束,interact
命令将返回,expect
脚本将退出,elevate
函数将返回,然后您将看到“已完成”消息。