Group :: Development/Tcl
RPM: expect
Main Changelog Spec Patches Sources Download Gear Bugs and FR Repocop
Patch: a-bit-better-autopasswd.patch
Download
Download
diff --git a/example/autopasswd b/example/autopasswd
index 1d095e2..47e925e 100755
--- a/example/autopasswd
+++ b/example/autopasswd
@@ -1,17 +1,50 @@
-#!/bin/sh
-# -*- tcl -*-
-# The next line is executed by /bin/sh, but not tcl \
-exec tclsh "$0" ${1+"$@"}
+#!/usr/bin/tclsh
+# $Id: autopasswd.expect,v 1.6 1999/08/27 19:39:18 moniot Exp $
+# Wrapper to run passwd(1) non-interactively
+# Usage: autopasswd username password
+# or echo " username password" | autopasswd
+# Returns code 0 if successful, nonzero otherwise (bad password)
+#
+# Author: R. Moniot, based on simpler version found in expect distribution
+# Date: 27 August 1999
package require Expect
-# wrapper to make passwd(1) be non-interactive
-# username is passed as 1st arg, passwd as 2nd
+if "$argc > 0" {
-set password [lindex $argv 1]
-spawn passwd [lindex $argv 0]
-expect "assword:"
-send -- "$password\r"
-expect "assword:"
-send -- "$password\r"
-expect eof
+# Get username and password from commandline if present.
+
+ set username [lindex $argv 0]
+ set password [lindex $argv 1]
+} else {
+
+# Otherwise read username and password from stdin: they must be separated
+# by exactly one blank space and contain no blanks themselves.
+
+ expect_user {
+ -re "(.*) (.*)" {
+ set username $expect_out(1,string);
+ set password $expect_out(2,string)
+ }
+ }
+}
+
+spawn passwd $username
+
+# The sleep is needed to give passwd time to get ready.
+expect {
+ "password:" { sleep 1; send -- "$password\r" } # send
+}
+
+expect {
+ "BAD PASSWORD:*" { exit 1 }
+ "password:" { sleep 1; send -- "$password\r" } # resend
+}
+
+expect {
+ "successfully" { exit 0 } # OK (Linux flavor)
+ eof { exit 0 } # OK (AIX flavor)
+ timeout { exit 2 } # something went wrong
+}
+
+exit 0