如何在交互式 shell 之前发送击键以使用 GNU 屏幕自动登录 Linux 串口?

如何在交互式 shell 之前发送击键以使用 GNU 屏幕自动登录 Linux 串口?

我经常需要使用已知的固定用户名和密码通过串行端口登录 Linux 开发板。

正常的命令是:

screen /dev/ttyS0 115200

然后screen会话内部如下所示:

<enter>
somehost login: root<enter>
Password: root<enter>
user@host#

如何自动执行此登录过程,以便我不必每次都输入用户名和密码?

如果需要的话我也可以使用expect。我试过了:

expect -c "spawn screen /dev/ttyS${1:-0} ${2:-115200}; send "\r"; expect \"* login: \"; send \"root\"; expect \"Password: \"; send \"root\"; interact"

但我的expect技能并不能完全解决这个问题,这只是悬而未决。

另外,如果我立即注销并登录,第二次它不会要求输入密码,而是直接进入提示符:

user@host#

所以希望脚本也应该考虑到这一点。也可以看看:https://stackoverflow.com/questions/9464887/modify-expect-based-ssh-script-to-work-on-machines-that-dont-require-a-password

SSH 的类似问题:https://stackoverflow.com/questions/459182/using-expect-to-pass-a-password-to-ssh

答案1

expect您可以通过添加选项来帮助调试-d。在您的示例中,您会看到您正在执行的"...send "\r"..."操作由 shell 进行评估,因为...send r...\r本身位于双引号之外。尝试将其更改send \"\r\"为其他情况。您还需要在每次发送的末尾放置一个类似的回车符:send \"root\r\"

编写一个小的 shell 脚本文件,或者使用单引号,将${1:-0}需要插值的内容转换为双引号,会更干净:

expect -c 'spawn screen /dev/ttyS'"${1:-0} ${2:-115200}"'; send \r; expect " login: ";...'

这个完整的脚本(不使用 shell)还处理已经登录的情况:

#!/bin/expect --
set tty 0
set baud 115200
if { $argc >= 1 } {
 set tty [lindex $argv 0]
}
if { $argc >= 2 } {
 set baud [lindex $argv 1]
}
spawn screen /dev/ttyS$tty $baud
send \r
expect {
      "login: " {
           send root\r
           expect "Password: "
           send root\r
       }
       "#" 
    }
interact

相关内容