如何将bash中的值传递给expect?

时间:2013-05-01 20:40:35

标签: linux bash shell unix expect

我有一个非常简单的bash脚本需要期待。 我需要将bash中的值传递给expect,并且我没有尝试ssh到另一台服务器或任何东西(因为我似乎只能找到有关通过ssh登录到另一台服务器的问题)。

这个想法就是这样的:

#!/usr/bin/env bash

echo "Please enter your password: "
read PASSWD

x=$(expect -c '
    spawn su -c 'whoami'
    expect "Password:"
    send "$PASSWD\r"
    interact
')

所以这不起作用。 expect shell不识别$ PASSWD变量。 怎么可以实现呢?

谢谢。

2 个答案:

答案 0 :(得分:0)

单引号中的变量不会被shell扩展,这就是为什么在这种情况下$PASSWD仍然是文字字符串$PASSWD

尝试更改引号:

#!/usr/bin/env bash

echo "Please enter your password: "
read PASSWD

x=$(expect -c "
    spawn su -c 'whoami'
    expect 'Password:'
    send '$PASSWD\r'
    interact
")

还有一点需要注意:您应该知道这可能会带来安全风险,因为在命令运行时密码将在进程列表的纯文本中显示。

答案 1 :(得分:0)

另一个选择是将PASSWD存储在环境中,然后让它在那里捡起来:

read -p "Your password: " passwd
export passwd

expect -c '... ; send "$env(passwd)\r"; ...'

安全方面最好的选择可能是提示输入密码:然后,密码不会出现在命令行或环境中。

expect -c <<'END'
    stty -echo 
    send_user "Your password: " 
    expect_user -re "(.*)\n" 
    send_user "\n" 
    set passwd $expect_out(1,string)
    stty echo 

    # your script starts here
    ...
    send "$passwd\r"
    ...
END