我经常需要使用已知的固定用户名和密码通过串行端口登录 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