Linux 如何将值从bash传递到expect?

Linux 如何将值从bash传递到expect?,linux,bash,shell,unix,expect,Linux,Bash,Shell,Unix,Expect,我有一个非常简单的bash脚本,它需要expect。 我需要将一个值从bash传递到expect,并且我没有尝试使用ssh连接到另一台服务器或其他任何东西(因为我似乎只发现有关通过ssh登录到另一台服务器的问题) 这个想法很简单: #!/usr/bin/env bash echo "Please enter your password: " read PASSWD x=$(expect -c ' spawn su -c 'whoami' expect "Password:"

我有一个非常简单的bash脚本,它需要expect。 我需要将一个值从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变量。 如何做到这一点


谢谢。

单引号中的变量不会被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
")

另一个注意事项:您应该注意,这可能会带来安全风险,因为在命令运行时,密码将以明文形式显示在进程列表中。

另一个选项是将密码存储在环境中,并让expect在那里获取密码:

read -p "Your password: " passwd
export passwd

expect -c '... ; send "$env(passwd)\r"; ...'
从安全角度来看,最好的选择可能是haveexpect提示输入密码:这样,密码就不会显示在命令行上,也不会显示在环境中

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

expect-c我确信有一种impler方法可以通过interact命令来实现这一点,但我还没有接近我的expect书