windows下面的ahk真是个利器,从头开始学,很有意思。
?
这个代码的作用是从linux的.ssh文件夹下面的config文件中读取存储的站点配置,生成一个桌面菜单,采用热键启动弹出,点击菜单可以直接打开ssh窗口连接到server。(密码处理是由ssh自身来处理,跟这个代码没有什么关系)。
代码思路:
1)配置config文件(本代码中默认使用ahk脚本所在目录\.ssh\config,config文件内容与linux系统下面的一致)
2)根据文件内关键词”Host “来读取serve的名称,根据a_index来运算,得到对应的user,hostname,port的行数据,并对各行的数据进行关键词定位,截取后得到serve服务器的相应数据(用户名,ip地址,端口)
3)根据得到的数据中的host名称生成新菜单(本代码中为二级菜单,准备后期编一个自己用的详细菜单)
4)设置热键显示热菜,设置热键reload脚本(这样可以在config文件修改后重新读取正确的数据)
?
代码段:
#Persistent ;保持后台运行
#SingleInstance ignore ;单实例运行模式
file1:=A_WorkingDir . "\.ssh\config" ;设定config文件变量处于脚本下面的.ssh目录下;
;读取文件配置,生成菜单,ssh连接在子菜单SSH-serve中;
loop,read,%file1%
{
if instr(A_LoopReadLine,"Host "){
hostpos:=a_index+0
rootpos:=a_index+1
ippos:=a_index+2
portpos:=a_index+3
filereadline, str_serve, %file1%, %hostpos%
servename:=trim(substr(str_serve,instr(str_serve,"Host ")+4))
filereadline, str_root, %file1%, %rootpos%
username:=trim(substr(str_root,instr(str_root,"User")+4))
filereadline, str_ip, %file1%, %ippos%
ipname:=trim(substr(str_ip,instr(str_ip,"Hostname")+8))
filereadline, str_port, %file1%, %portpos%
portname:=trim(substr(str_port,instr(str_port,"Port")+4))
if (servename <> "") {
menu,sshmenu,add, %servename%, svname1
}
}
}
menu,mymenu,add,SSH-Serve,:sshmenu ;定义为子菜单
Menu,mymenu, add
Menu,mymenu, add, Exit, exit1
return
^!r::ReLoad ;重载脚本,热键为Ctrl+Alt+R
#F7:: ;显示菜单,热键为Win+F7
Menu, mymenu, show
return
;菜单点击处理
svname1:
run, ssh -p %portname% %username%@%ipname%
return
exit1:
exitapp
return
?
在这个代码之前写了另外一段代码,采用input输入name,以及命令行中带入参数的方式来运行,也成功,但是实用性不大,因为config配置文件本身就是手动编写,那么参数需要记忆才可以。代码也备存,用于后期学习用:
?
代码段(inputbox方式+带命令行参数模式)
file1:=A_WorkingDir . "\.ssh\config" ;设定config文件变量处于脚本下面的.ssh目录下;
a:=0 ;检测是否检查到关键词
Gosub, getarg1 ;查找命令行参数,如果有参数则参数赋值给svname,如果无参数跳出inputbox对话框赋值给svname
Loop, Read, %file1% ;循环读取内容
{
if instr(A_LoopReadLine,svname) {
rooti:=a_index+1 ;a_index为内置变量,循环次数,在此处表示文件读到的行
ipi:=a_index+2
porti:=a_index+3
a:=a+1;调试代码用,判断最后是否存在所要查找的字符
;读取name段落
filereadline, str_name,%file1%, %namei%
str_name:=trim(substr(str_name,instr(str_name,"Host")+4))
;读取用户名段落
filereadline, str_root,%file1%, %rooti%
str_root:=trim(substr(str_root,instr(str_root,"User")+4))
;读取IP地址段落
filereadline, str_ip,%file1%, %ipi%
str_ip:=trim(substr(str_ip,instr(str_ip,"Hostname")+8))
;读取端口段落
filereadline, str_port,%file1%, %porti%
str_port:=trim(substr(str_port,instr(str_port,"Port")+4))
;msgbox %str_name% | %str_root% | %str_ip% | %str_port% ;调试结果用
run, ssh -p %str_port% %str_root%@%str_ip% ;直接运行ssh
}
}
;调试代码段,测试是否最后查找到该服务器
if (a=0) {
msgbox serve [%svname%] is not found in config-file.
exit app ;退出进程
}
return
;获取参数处理段落
getarg1:
argnum=%0% ;参数数量为:%argnum%
if (argnum =0)
{
inputbox,svname, 输入服务器代码名称,Google,,,100
if (svname="" ){
exit app
}
}
else if (argnum =1)
{
svname=%1% ;%1%表示第一个参数
}
else
{
msgbox 参数输入错误,请重新输入。
exit app
}
return
?