我有一堆 bash 脚本,它们将执行一些需要用户输入的操作,因此我对它使用了 expect。
但是我需要一个继续运行的脚本。但是如果我使用 expect,expect 命令将在脚本运行时等待,我的主脚本将不会继续运行。
IE:script1 以 root 身份生成一个脚本:
#!/bin/bash
expect << EOF
spawn su root -c "/bin/bash script2.sh"
expect "Password:"
send "test\n"
set timeout -1
expect eof;
EOF
script2.sh 将产生一个屏幕:
#!/bin/bash
screen -dm nastyscript.sh
nastyscript.sh 将产生一个必须持续运行的二进制文件:
#!/bin/bash
expect << EOF
spawn mybinary
expect "*Enter password for my binary"
send "test\r"
expect "*I am running"
set timeout -1
expect -re . { exp_continue } eof { exit }
expect eof;
EOF
但是,由于一个脚本正在等待完成,我的主脚本将无法继续。
有什么办法吗?
答案1
首先,您绝对不想用 expect 发送密码。除了非常糟糕的风格之外,它还完全破坏了系统的安全性,因为您必须以明文形式存储用户密码。而且,当今时代的每个人都知道,您永远都不应该以明文形式存储任何密码。
我建议你阅读 的手册页sudoers
。然后你就可以在脚本中使用 sudo,而不必以明文形式存储密码。更可靠的解决方案可能是使用 suid root 的可执行文件。出于安全原因,Shell 脚本不能使用 suid,因此这需要编译一个小程序。
另一方面,如果您确定需要多个并行运行的进程相互通信,那么 bash 版本 4 以关键字的形式提供了解决方案coproc
。基本上,您将 放在coproc
命令行前面。对于简单命令,它与&
命令行末尾的效果大致相同;进程将与您的脚本并行运行。不同之处在于,coproc
您在数组中提供了另一个进程的stdout
和文件描述符,因此您的脚本可以与其他进程通信。请参阅stdin
COPROC
http://www.gnu.org/software/bash/manual/html_node/Coprocesses.html
然后您可能还想wait
在脚本退出之前启动另一个进程。