将输出检测到tty

问题描述 投票:0回答:1

我正在制作一个程序,以在尝试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");
}

我的问题是我如何才能聪明地等待服务器发出的密码提示,然后开始发送密码密钥?

bash shell ssh tty pty
1个回答
0
投票

这是我用于此目的的期望脚本:

#!/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做类似的工作-但您在这里有足够的能力来解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.