ubuntu下在.sh脚本运行sudo时自动输入密码



以sudo apt-get update为例

1、使用echo和管道命令

1
  #! /bin/bash
2  echo “password” | sudo -S apt-get update

这种方法网上说是可行,不过会将密码显示在屏幕上,但我在ubuntu12.04

上测试不成功。

2、使用文本块输入重定向

1
  #! /bin/bash
2  sudo -S apt-get update<<EOF
3  password
4  EOF

注意:-S 是必须的

3、使用expect命令

1
  #! /usr/bin/expect
2  set timeout 30
3  spawn sudo apt-get update
4  expect "password for xxx:"
5  send "password\r"
6  interact

\1. [#! /usr/bin/expect]

这个跟bash shell 开头一样,是告诉系统使用那个解释器来解释脚本

注意:这一行需要在脚本的第一行。

\2. [set timeout 30]

设置超时时间为30秒

\3. [spawn sudo apt-get update]

spawn是expect内部命令,如果没有装expect或者直接在默认的SHELL

下执行是找不到spawn命令的。

它主要的功能是给后面的"sudo apt-get update"运行进程加个壳,用来

传递交互指令。

\4. [expect “password for xxx:"]

这里的expect也是expect的一个内部命令。

个命令的意思是判断上次输出结果里是否包含“password for xxx:”的字符

串,如果有则执行下一步,否则就等待一段时间后返回,这里等待时长就是

前面设置的30秒

在ubuntu下输入sudo命令,shell会提示

“[sudo]password for xxx”

这里的xxx就是你的登录名

\5. [send “password\r” ]

这里就是执行交互动作,与手工输入密码的动作等效。

温馨提示: 命令字符串结尾加上“\r”,如果出现异常等待的状态可以核

查一下。

\6. [interact]

执行完成后保持交互状态,把控制权从expect交会给shell,shell就可以

执行sudo apt-get update。

没有这句的话,即使密码已经成功输入,也不会执行sudo命令,因为控制

权还是expect手里,而expect是不能解释apt-get update 命令的。

注意:ubuntu12.04默认是没装expect的,可以通过下面命令安装。

sudo apt-get install expect