我有一个从 Linux 计算机运行的脚本,用于更改可通过 ssh 访问的远程 Solaris 计算机上的 root 密码。一切似乎都很好,passwd 命令要求输入密码,第二个密码,回复长度不是 8 个字符,并以 ... 结束,更新成功,但是当我转到 Solaris 并检查时,密码没有更改。影子文件没有被修改。我可以直接在 Solaris 机器上更改密码,没有任何问题。
$ cat ./expect2.txt
#!/usr/bin/expect --
# Input: username password hostname
set USER [lindex $argv 0]
set PASS [lindex $argv 1]
set IP [lindex $argv 2]
spawn ssh user1@$IP
expect "user1"
spawn sudo passwd $USER
expect "assword:"
send "$PASS\r"
expect "assword:"
send "$PASS\r"
expect eof
exit
exit
我运行脚本:
$ expect ./expect2.txt root abc123 host1
spawn ssh user1@host1
host1 user1 : spawn sudo passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
调试
$ expect -d ./expect2.txt root abc123 host1
expect version 5.45.4
argv[0] = expect argv[1] = -d argv[2] = ./expect2.txt argv[3] = root argv[4] = abc123 argv[5] = host1
set argc 3
set argv0 "./expect2.txt"
set argv "root abc123 host1"
executing commands from command file ./expect2.txt
spawn ssh user1@host1
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {2669765}
expect: does "" (spawn_id exp4) match glob pattern "user1"? no
match glob pattern "user1"? yes
expect: set expect_out(0,string) "user1"
expect: set expect_out(spawn_id) "exp4"
spawn sudo passwd root
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {2669769}
expect: does "" (spawn_id exp7) match glob pattern "assword:"? no
Changing password for user root.
New password:
expect: does "Changing password for user root.\r\nNew password: " (spawn_id exp7) match glob pattern "assword:"? yes
expect: set expect_out(0,string) "assword:"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) "Changing password for user root.\r\nNew password:"
send: sending "abc123\r" to { exp7 }
expect: does " " (spawn_id exp7) match glob pattern "assword:"? no
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
expect: does " \r\nBAD PASSWORD: The password is shorter than 8 characters\r\nRetype new password: " (spawn_id exp7) match glob pattern "assword:"? yes
expect: set expect_out(0,string) "assword:"
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) " \r\nBAD PASSWORD: The password is shorter than 8 characters\r\nRetype new password:"
send: sending "abc123\r" to { exp7 }
passwd: all authentication tokens updated successfully.
expect: read eof
expect: set expect_out(spawn_id) "exp7"
expect: set expect_out(buffer) " \r\npasswd: all authentication tokens updated successfully.\r\n"
答案1
这将启动与 表示的主机的远程会话$IP
:
spawn ssh user1@$IP
expect "user1"
这开始新会话更改由 表示的用户的密码$USER
:
spawn sudo passwd $USER
expect "assword:"
请注意,这两个会话是相互独立的,并且您正在$USER
本地主机上更改密码。你可能是有意的send
而不是spawn
。