【问题标题】:Using expect interact, inside of a bash script, exits bash script prematurely在 bash 脚本中使用 expect 交互,过早退出 bash 脚本
【发布时间】:2019-06-29 17:32:01
【问题描述】:

当我在 bash 脚本中使用 expect interact 手动请求 root 密码时,它会接受密码,提升为 root 用户,但未完成bash 脚本的其余部分。

我正在将用户从旧的 CentOS 机器迁移到新的 RHEL 机器。我有一个手动执行此操作的过程,但我正在尝试自动化该过程。我有大部分工作,但有几个步骤需要根级别的权限。我正在尝试使用 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 身份登录,它永远不会执行提升功能并且我得到“脚本完成”响应。如果我以任何其他用户身份登录,则执行提升功能,我手动输入 root 密码,脚本退出而不提供“脚本完成”响应,但我仍然以根用户。

【问题讨论】:

  • eval 命令在这里没有添加任何好处,您可以将其删除。

标签: bash expect


【解决方案1】:

当您不是 root 时,su 要求输入密码,然后启动 root shell。你现在interact正在使用那个 shell。

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

我认为您说“脚本退出”是不正确的。检查pstree -s $$,我敢打赌你会在那里看到一个expect进程。

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

【讨论】:

  • 如果你是对的,那么这意味着 OP 没有以 root 身份执行脚本中的任何命令。将spawn su 命令更改为spawn su root ./someOtherScript 是否允许someOtherScript 中的命令以root 身份运行?
  • 根命令没有脚本化 -- 用户被放入一个交互式shell并且可以输入任何东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2010-11-21
相关资源
最近更新 更多