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

?