Linux 如何将值从bash传递到expect?
我有一个非常简单的bash脚本,它需要expect。 我需要将一个值从bash传递到expect,并且我没有尝试使用ssh连接到另一台服务器或其他任何东西(因为我似乎只发现有关通过ssh登录到另一台服务器的问题) 这个想法很简单: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:"
#!/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书