我正在尝试使用Expect自动化no-ip client配置。脚本(make install
)运行已编译的noip2.c
,需要输入服务的电子邮件和密码。
似乎\r
以某种方式被此程序视为密码的一部分。我使用以下脚本:
#!/usr/bin/expect
spawn sudo make install
expect "email string for no-ip.com" { send "my@email.com\r" }
expect "password for user" { send "mypassword\r" }
然而,它会导致接收程序无限期地等待(\r
看似被忽略)。使用exp_internal 1
选项,我收到了以下发送字符的确认信息:
send: sending "mypassword\r" to { exp6 }
noip2
逐个接收字符,并用星号掩盖每个字符。处理密码输入的代码如下所示:
do {
if (read(0, &ch, 1) != 1)
continue;
if (ch == 0x0d)
break;
if ((ch == 0x08) || (ch == 0x7f)) {
putchar(8);
putchar(' ');
putchar(8);
x--;
} else {
*x++ = ch;
putchar('*');
}
fflush(stdout);
} while (1);
我在printf("%.2x", ch);
旁边添加了putchar('*');
,并为Expect发送的0x0a
字符 获得了\r
(完整结果:{{1} })。
接下来,我将Expect脚本行更改为:
*0x6d*0x79*0x70*0x61*0x73*0x73*0x77*0x6f*0x72*0x64*0x0a
并得到了同样的结果:
expect "password for user" { send "mypassword\x0d" }
当我改为:
*0x6d*0x79*0x70*0x61*0x73*0x73*0x77*0x6f*0x72*0x64*0x0a
我得到了:
expect "password for user" { send "mypassword\x0b" }
在Expect和*0x6d*0x79*0x70*0x61*0x73*0x73*0x77*0x6f*0x72*0x64*0x0b
计划的相关部分之间,某些事情明显干扰并将0x0d
更改为0x0a
。可能是什么原因?