我有一个非常简单的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变量。 怎么可以实现呢?
谢谢。
答案 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