0

我有一个非常简单的 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
')

所以这行不通。期望 shell 无法识别 $PASSWD 变量。这如何实现?

谢谢你。

4

2 回答 2

0

单引号内的变量不会被 shell 扩展,这就是为什么在这种情况下$PASSWD仍然是文字 string $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
")

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

于 2013-05-01T20:51:26.767 回答
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
于 2013-05-01T21:11:40.460 回答