最近准备把ssh连接工具从Xshell转移到Windows Terminal,发现终端工具(Windows Terminal) 不支持保存密码功能,百度一番无果,ssh命令中不支持密码参数,只能上传服务器密钥来解决免密登录的问题,闲置几天后还是不死心,折腾一番过后终于想到了另一种方法实现相同的功能
本地环境:
宿主机是Windows系统,已安装WSL子系统Ubuntu20
大概思路:
打开终端后,运行脚本,通过 expect 交互进行自动输入密码,完成免密登录
最终结果:
完成文章中所有配置后,每次打开设定的新窗口将会自动登入远程服务器,期间无需进行任何操作
expect介绍:
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect自动交互流程:
spawn启动指定进程---expect获取指定关键字---send向指定程序发送指定字符---执行完成退出.
安装expect
检测是否已安装
ls /usr/bin |grep expect
如果没有则进行安装
Ubuntu:sudo apt-get install expect
Centos: yum install expect
编写脚本(任意位置)
创建脚本目录(名称自定义)
mkdir service-start
创建脚本文件并写入内容(名称自定义)
cd service-start
vim server.sh
写入内容
#! /usr/bin/expect
# 连接ssh
spawn ssh -p 222 username@39.111.11.11
# 捕获末尾为password的内容
expect "*password:"
# 输入密码并回车
send "123456\r"
# 允许用户交互
interact
第一行一定不能删!!!
赋予脚本权限
sudo chmod +x server.sh
测试运行
./server.sh
如果进入服务器代表成功
配置Windows Terminal
打开设置
选择将要修改为ssh连接的窗口,并在右侧命令行的输入框中输入指定字符
wsl.exe -e ./service-start/server.sh
命令行参数详解
wsl.exe 用于打开wsl的终端
-e 打开终端后输入的命令
./service-start/server.sh 脚本位置 (刚才创建的脚本位置)
Windows11 版本需要将启动目录里的"%USERPROFILE%"改为"~"
Ubuntu22需改为 ubuntu2204.exe run ~/service-start/tool.sh
wsl.exe 是安装wsl子系统后自带的终端工具,参数可在cmd窗口中输入 wsl.exe -help 进行查看
如果使用powershell.exe 可输入 powershell.exe -NonInteractive ./service-start/server.sh