我正在使用expect和shell代码在CentOS 7.9上进行Postgres数据库自动备份。我的代码在英语环境中运行良好,但在日语环境中失败了。这是我的期望代码
#!/usr/bin/expect
set homeDirectory "/home/kds/DB_BACKUP"
set dbPassword "manager"
log_file $homeDirectory/LOG/db_backup.log;
#Execute database backup script
spawn $homeDirectory/./backupexecutor.sh
set found 0
while {$found < 1} {
expect {
"パスワード: $" {send "$dbPasswordr"}
"^Rollout Done " {set found 1}
"^Rollout Updated " {set found 1}
}
}
expect eof
检查日志文件后,很明显expect无法发送パスワード: $
关键字的密码。我也试过*スワー*
,但结果相同。如果将我的操作系统语言从日语更改为英语,并将パスワード
替换为Password
,则代码工作正常。除了使用不同的语言之外,还有什么其他的工作方法吗?
做了一个简单的测试,它对我有效(用Expect
5.45、Tcl
8.5.9、macOS
10.15测试(
[STEP 101] $ cat foo.sh
read -s -p 'Enter your パスワード: ' passwd
echo
echo "Your password is: $passwd"
[STEP 102] $ bash foo.sh
Enter your パスワード: foobar <-- manual input
Your password is: foobar
[STEP 103] $
[STEP 104] $ cat foo.exp
spawn bash foo.sh
expect {
"パスワード: $" {
send "foobarr"
}
}
expect eof
[STEP 105] $ expect foo.exp
spawn bash foo.sh
Enter your パスワード:
Your password is: foobar
[STEP 106] $
我的区域设置信息:
[STEP 107] $ locale
LANG=""
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
[STEP 108] $
expect -d
:
[STEP 109] $ expect -d foo.exp
expect version 5.45
argv[0] = expect argv[1] = -d argv[2] = foo.exp
set argc 0
set argv0 "foo.exp"
set argv ""
executing commands from command file foo.exp
spawn bash foo.sh
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {84009}
expect: does "" (spawn_id exp6) match glob pattern "u30d1u30b9u30efu30fcu30c9: $"? no
Enter your パスワード:
expect: does "Enter your u30d1u30b9u30efu30fcu30c9: " (spawn_id exp6) match glob pattern "u30d1u30b9u30efu30fcu30c9: $"? yes
expect: set expect_out(0,string) "u30d1u30b9u30efu30fcu30c9: "
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "Enter your u30d1u30b9u30efu30fcu30c9: "
send: sending "foobarr" to { exp6 }
Your password is: foobar
expect: read eof
expect: set expect_out(spawn_id) "exp6"
expect: set expect_out(buffer) "rnYour password is: foobarrn"
[STEP 110] $