2015-09-05 114 views
1

更新:在这一点上我非常沮丧。我试着将期望代码移动到它自己的文件并从bash脚本中调用它。CLI的期望脚本

... 
if [[ "$okay" == "OK" ]] 
then 
    echo "PASSWORD ACCEPTED" 
    echo "Modifying User Passwords..." 
    COUNTER=0 
     while [ $COUNTER -lt $num ]; do 
      let index=COUNTER+1 
      tmp=user_$index 
      echo "Changing Password for " ${!tmp} 
       tmp2=$(${!tmp}) 
      echo $tmp2 
      sh ./input.sh ${current_user} ${pass} ${password} ${tmp2} 
      let COUNTER=COUNTER+1 
     done 
... 

input.sh

expect -f 
#------------------------------------------------------ 
set current_user [lindex $argv 0] 
set pass [lindex $argv 1] 
set password [lindex $argv 2] 
set tmp2 [lindex $argv 3] 

echo "EXPECT SCRIPT RUNNING" 
sudo passwd ${!tmp2} 
expect -exact "[sudo] password for $current_user: " 
send "$pass\r" 
expect -exact "New password: " 
send "$password\r" 

我将不胜,不胜感激,如果有人可以帮助我。


我写一个脚本,将允许Linux管理员迅速改变其用户的密码。

#!/usr/bin/expect 
# Check password for strength 
# ---------------------------------------------- 
read -p "What's your username?" current_user 
read -p "What's the root password?" pass 
read -p "How many users?" num 
COUNTER=0 
     while [ $COUNTER -lt $num ]; do 
     let index=COUNTER+1 
      read -p "Enter username$index : " user_$index 
      let COUNTER=COUNTER+1 
     done 
read -p "Enter password : " password 
echo 
echo "Tesing password strength..." 
echo 
result="$(cracklib-check <<<"$password")" 
okay="$(awk -F': ' '{ print $2}' <<<"$result")" 
if [[ "$okay" == "OK" ]] 
then 
    echo "PASSWORD ACCEPTED" 
    echo "Modifying User Passwords..." 
    COUNTER=0 
     while [ $COUNTER -lt $num ]; do 
      let index=COUNTER+1 
      tmp=user_$index 
      echo "Changing Password for " ${!tmp} 
      echo ${!tmp} 
      sudo passwd ${!tmp} 
      expect -exact "[sudo] password for $current_user: " 
      send "$pass\r" 
      expect -exact "New password: " 
      send "$password\r" 
      let COUNTER=COUNTER+1 
     done 

    #echo "$user:$password" | usr/sbin/chpasswd 
else 
    echo "Your password was rejected - $result" 
     echo "Try again." 
fi 

但是,期望部分会自动输入密码,在我的编辑器中没有突出显示,也不起作用。我不断收到提示以手动输入文字。这是特别令人惊讶的,因为脚本是采购期望,而不是bash。过去2个小时我一直在努力解决这个问题。任何人都可以请借我一只手吗?

+0

我真的很沮丧在这一点上。我已经尝试了一些新的代码,我创建了一个新的expect文件。 – LockX

回答

0

我在代码中看到一些问题。起初,你已经尝试在代码中,这应该抛出介绍一下read命令错误添加#!/usr/bin/expect

wrong # args: should be "read channelId ?numChars?" or "read ?-nonewline? channelId" 
    while executing 
"read -p "What's your username?" current_user" 

的原因很简单,因为脚本将被视为Expect脚本,它没有遵循它的语法为read。我想知道它是如何为你工作的。 :)

当被称为shell脚本,在当expect -c置于两个单引号应该封闭withing expect -cexpect -f

简单地说,它不会允许bash的换人。所以,我要用双引号。 (但是,这我们有逃脱Expect的反斜杠双引号)。

admin="dinesh" 
admin_pwd="root" 
user="satheesh" 
user_pwd="[email protected]" 
OUTPUT=$(expect -c " 
     # To suppress any other form of output generated by spawned process 
     log_user 0 

     spawn sudo passwd $user 
     expect { 
       timeout { send_user \"Timeout happened\n\";exit 0} 
       \"Sorry, try again\" {send_user \"Incorrect admin password\";exit 0} 
       \"password for $admin: $\" {send \"$admin_pwd\r\";exp_continue} 
       \"password: $\" {send \"$user_pwd\r\";exp_continue} 
       \"successfully\" {send_user \"Success\"; exit 1} 
     } 
") 
echo "Expect's return value : $?" 
echo "-----Expect's response-----" 
echo $OUTPUT 

Expect的返回值将在变量$?可用。这将帮助我们知道密码更新是否成功。变量OUTPUT将具有生成的进程生成的输出。

使用#!/bin/bash而不是#!/usr/bin/expect,因为它实际上是一个bash脚本。