在编写shell脚本的批处理代码时,一般只要求用户在调用shell时,输入有限的几个参数,然后由shell进行批处理作业,在批处理作业完成之前,中途不会有任何打断。但是linux有些命令本身是要求进行人机交互的,命令基本上是以一问一答形式在终端上跟用户交互,如passwd、smbpasswd,在设置某个用户的密码时,传入username参数,回车后系统要求输入密码,而smbpasswd还要求再次输入确认密码,这样就需要人工干预2次,这个命令才能执行完毕。
      最近写一个小工具,恰巧碰到这个问题,用户要求提供一个shell,输入username和端口号后,自动完成linux 用户的创建、密码设置、网上邻居的开通、代码的检出、apache配置、启动等一系列操作,所有帐号中username跟passwd一致。用户输入shell命令敲击回车后,便不再与系统交互,由系统自动完成之后的所有操作。
    但由于passwd和smbpasswd两个命令都需要用户干预才能完成,有没有什么办法不用用户干预,由系统模拟用户完成输入操作呢?答案是肯定的,就是利用linux的管道技术,通过“echo”命令进行标准输出,然后通过管道符“|”转换为passwd和smbpasswd的标准输入,由此模拟人机交互,具体实现:
假设用户调用shell脚本为:
[root@myhost]# ./myshell.sh username
则在脚本里实现为:
#!/bin/sh
#Usage: myshell.sh username
userName=$1;
password=$1;
#add user and set default password 
useradd $userName;
#通过设定--stdin参数,指明接受标准输入;
echo $password | passwd - -stdin $userName;
#add samba user and set default password 
#通过设置-s参数,指明使用安静模式设置密码
( echo $password ; echo $password  ) | smbpasswd -s -a $userName;
   
  这样的话,通过linux 的管道技术,将标准输出通过管道转换为某些命令的标准输入,实现了人工输入的模拟,从而屏蔽了人机交互,实现了完全的自动化。