我正在制作一个程序,以在尝试ssh时自动输入密码。我的想法是,我将在后台运行我的type_pass可执行文件,然后启动ssh进程。有点像
$ type_pass & ssh [email protected]
当前,这是有效的,因为我在自身的type_pass应用程序中提供了一个小的延迟(5秒)。
type_pass看起来像
void typeout(int tofd, char* txt, int usecs = 100000) {
int len = strlen(txt);
for(int ii = 0; ii < len; ++ii) {
usleep(usecs);
int ioctlerr = ioctl(tofd, TIOCSTI, &txt[ii]);
int err = errno;
}
}
int main() {
sleep(10);
typeout(1, "asdas\n");
}
我的问题是我如何才能聪明地等待服务器发出的密码提示,然后开始发送密码密钥?
这是我用于此目的的期望脚本:
#!/usr/bin/expect
send_user "password: "
set old_timeout $timeout
set timeout -1
expect_user -re "(.*)\n"
send_user "\n"
set timeout $old_timeout
set password "$expect_out(1,string)\r"
spawn /bin/bash
interact {
-o -nobuffer "assword: " {
send $password
}
}
以上程序要求最终用户输入密码,然后将其存储在password变量中。这样,永远不会将密码写入文件,但是期望它将回显输出到终端。可以添加一些代码来关闭回声,但我不知道是不是要用。
期望然后启动bash交互式shell。
从现在开始,expect会查看到终端的所有输出。如果输出的字符串包含“ assword:”,则Expect将输出存储的password变量。
顺便说一句,我不是期望的粉丝,但是我发现该程序在包括ssh在内的许多情况下都非常有用。
我还发现sshpass对您的特定问题很有帮助。我也曾用ansible做类似的工作-但您在这里有足够的能力来解决您的问题。