在bash脚本内部使用expect interact,可以提前退出bash脚本

时间:2019-02-05 20:03:13

标签: bash expect

当我在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密码,并且脚本退出时未提供“ 脚本已完成”响应,但我仍以根用户。

1 个答案:

答案 0 :(得分:0)

如果您不是root用户,则su要求输入密码,然后启动root shell。您现在interact正在使用该shell。

  

我手动输入root密码,脚本退出而没有提供“脚本完成”响应,但是我仍然以root用户身份登录。

我相信您在陈述“脚本退出”方面是不正确的。选中pstree -s $$,我敢打赌,您会在其中看到期望的过程。

当退出该根shell时,su进程将结束,interact命令将返回,expect脚本将退出,elevate函数将返回,然后您将看到“已完成”消息。