分类 默认分类 下的文章

sshfind通过主机别名查找主机信息Python实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#根据主机别名查找openSSH配置文件~/.ssh/config对应主机配置项
#自用sshfind命令python实现版本
#原始sshfind为shell脚本实现,参看:/v/bin/sshfind
import sys
import os
import re

sshConfigFile="~/.ssh/config"
sshConfigFile=os.path.expanduser(sshConfigFile)

if len(sys.argv)<2 or (len(sys.argv)==2 and (str(sys.argv[1]).lower()=="--help" or str(sys.argv[1]).lower()=="-h")):
    print("""
    /v/bin/sshfind.py
    使用主机别名或别名部分关键字查找主机配置项信息,查找 ~/.ssh/config 文件内容.
    注:脚本优先做主机别名全字匹配,没有结果再尝试模糊匹配.

Usage:
        sshfind.py [keyword]
Example:
        sshfind.py racknerd
    
    """)
    sys.exit(0)
else:
    hoststr=str(sys.argv[1]).strip()

foundCount=0
wrapMatch=False #全字匹配标志符

with open(sshConfigFile,"r") as read_f:
    Tag=False
    for num,line in enumerate(read_f.readlines(),1):
        #if re.match(r'Host .*[ ]?'+hoststr+'[ $]?',line,re.I):
        if re.match(r'Host .*[^-\.]?'+hoststr+'[ $]?',line,re.I):
            Tag=True
            foundCount+=1
            if re.match(r'.* '+hoststr+'( |$)',line,re.I):
                #标识全字匹配
                wrapMatch=True
            #找到两个及以上主机时,打印空行隔开
            if foundCount>=2:
                print("\n")
            #找到主机匹配则先打印开始行的行号,以供sshedit命令使用
            print(num)
            print(line,end='')
            continue
        if Tag==True and re.match(r'[ ]*Host ',line,re.I):
            Tag=False
        if Tag==True:
            print(line,end='')

if wrapMatch==True and foundCount==1:
    print("\n\t以上为全字匹配结果")
    
print("\nsshfind执行完毕;Python版本:%s"%sys.version)

扫描二维码,在手机上阅读!

/v/bin/programs;Cygwin下搜索Win快捷方式Function脚本

#!/bin/bash
#查询在/v/bin/aliaswinapp中已经定义的Win程序快捷方式
SCRIPTPATH=$(realpath $0)
. /v/bin/aliaswinapp
programs=$(declare -F|awk "{print \$NF}"|grep -vE "^_")

#echo "programs: $programs"

display_usage() {
    echo -e "$SCRIPTPATH\n"
    echo -e "\t查询或列出 /v/bin/aliaswinapp 定义的功能函数."
    echo -e "\tNotice:programs -h/--help 显示本帮助信息."
    echo -e "\nUsage:\n\tprograms \t\t#横向列出所有的函数功能,每行四个;"
    echo -e "\tprograms xxx \t\t#搜索包含xxx字符串的功能函数(不区分大小写);"
    echo -e "\tprograms -l \t\t#纵向列出所有的函数功能,每行仅显示一个(类似 ls -l);"
    echo -e "\tprograms -a|all \t#列出所有的功能函数及其当前会话所有alias名称;"
    echo -e "\tprograms -a|all|find xxx   #搜索包含xxx的函数名称和alias,没有结果则尝试whereis查找;"
    echo -e "\tprograms -d|-f|define name   #查询名为name的函数在aliaswinapp文件中的定义原文(即函数源代码);"
    echo -e "\tprograms -L|-F \t\t#列出所有的函数和alias定义原文,并尽可能按合理顺序排序;"
    echo -e "\tprograms -A \t\t#等同于programs -a,区别:-A支持grep原生选项,会把后续\$*直接传递给grep处理;"
    echo -e "\t\t\t\teg:高级搜索,区分大小写:programs -A  'Wget'" 
    echo -e "\t\t\t\teg:高级搜索,使用正则表达式:programs -A -E '^t'"   
    echo -e "\t\t\t\teg:高级搜索,统计个数(不区分大小写):programs -A -ci 'wget'"   
    echo -e "\tprograms [*grep origin options]\t#查找所有函数(不包含alias),同上,\$*接受grep原生选项过滤查找;"
}

##仿ls,横向列出
if [ $# -lt 1 ] || ([ $# -eq 1 ] && ([[ "$1" == "ls" ]] || [[ "$1" == "-s" ]]));then
    #echo -e "$programs"|tr '\n' '\t'
    str=$(echo -e "$programs"|tr '\n' '\t'|sed -r 's/[ \t]*$//g')
    #借助python格式化输出列表
    /usr/bin/env python3 /v/bin/python-formater.py "${str}"
    exit 0
##显示帮助信息
elif [ $# -eq 1 ] && ([[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]);then
    display_usage
    exit 0
##仿ls -l,纵向列出
elif [ $# -eq 1 ] && ([[ "$1" == "ll" ]] || [[ "$1" == "-l" ]]);then
    echo "$programs"
    exit 0
##列出全部,包括所有alias定义定义的值
elif [ $# -eq 1 ] && ([[ "$1" == "all" ]] || [[ "$1" == "-a" ]]);then
    . ~/.bash_profile >/dev/null
    allAlias=$(alias -p|grep -iE '^alias '|awk -F '[ =]' '{print $2}')
    programs=$(echo -e "$programs\n$allAlias"|sort -d)
    echo "$programs"
    exit 0
##列出全部,包括所有alias定义定义的值,并且以关键字查找,$2为要查找的关键字
##本功能和-A分支的区别在于本分支还提供 whereis 查找,另本分支查找参数可省略(省略时列出全部),不支持grep原生选项
## -A 分支查找参数是必须的,且提供grep原生接口,可以实现正则表达式查找等其他功能;
elif [ $# -eq 2 ] && ([[ "$1" == "all" ]] || [[ "$1" == "find" ]] || [[ "$1" == "-a" ]]) && [ ! -z "$2" ];then
    . ~/.bash_profile >/dev/null
    allAlias=$(alias -p|grep -iE '^alias '|awk -F '[ =]' '{print $2}')
    programs=$(echo -e "$programs\n$allAlias"|sort -d)
    programFind=$(echo "$programs"|grep -i "$2")
    #如果aliaswinapp和alias均未找到结果,则通过whereis再次查找
    if [ -z "$programFind" ];then
        whereis $2
    else
        echo "$programFind"
    fi
    exit 0
##查找aliaswinapp中具名function的定义
elif [ $# -eq 2 ] && ([[ "$1" == "-d" ]] || [[ "$1" == "define" ]] || [[ "$1" == "-f" ]]) && [ ! -z "$2" ];then
    fn_defined=$(declare -f $2)
    #如果 aliaswinapp 找不到已有定义,则更深一步去查询 alias 记录
    [ -z "${fn_defined}" ] && {
        . ~/.bash_profile >/dev/null
        . ~/.bashrc >/dev/null
        alias $2 2>/dev/null
        exit 0
    }
    echo "${fn_defined}"
    ## 以下输出 $apppath 路径到终端,供Ctrl+鼠标左键单击快捷打开对应目录
    if [ ! -z "${fn_defined}" ];
    then
        findappPath=$(echo "${fn_defined}"|grep -i 'apppath='|tac|grep -v -m1 '#')
        if [ ! -z "$findappPath" ];
        then
            echo "---------------------------------"
            findappPath=$(echo "$findappPath"|sed -r 's/^.*\=["|'\'']([^"'\'']+).*$/\1/')
            # eval展开环境变量 %APPDATA% 等~
            findappPath=$(eval echo "${findappPath//\\/\\\\}")
            ## 以下注意:经过测试,路径带有小括号等特殊符号时即便经过转义任然不奏效,无法在mintty窗口鼠标单击打开,空格没问题
            ## 这是 mintty本身的问题,只能修改mintty原生代码,无法曲线解决
            cygpath -u "$findappPath"|sed -r 's/( |\t|\(|\)|(|)|\[|\])/\\\1/g'
            OLD_IFS=$IFS #临时更改IFS为适配路径中带空格的情况
            IFS=$(echo -e "\n")
            cygpath -u `dirname "$findappPath"`|sed -r 's/( |\t|\(|\)|(|)|\[|\])/\\\1/g'
            IFS=$OLD_IFS
        fi
    fi
    exit 0
##关键词查找,不区分大小写
elif [ $# -eq 1 ] && [[ ! "$1" =~ ^\-[a-zA-Z]$ ]];then
    programFind=$(echo "$programs"|grep -i "$1")
    #如果aliaswinapp未找到结果,则通过whereis再次查找
    if [ -z "$programFind" ];then
        echo -e "not found in /v/bin/aliaswinapp;"
        whereis $1
    else
        #echo "$programFind"
        #借助python格式化输出列表
        /usr/bin/env python3 /v/bin/python-formater.py "`echo "$programFind"|tr '\n' '\t'`"
    fi
    exit 0
elif [[ "$1" == "-L" ]] || [[ "$1" == "-F" ]];then
    #列出所有的函数和alias详细内容,并尽可能按合理顺序排序,grep时同时也在alias内容中查找
    #妙用1:programs -L alias.*wget
    #妙用2:programs -L alias.*ssh
    shift
    . ~/.bash_profile >/dev/null
    . ~/.bashrc >/dev/null
    allAlias=$(alias -p|grep -iE '^alias ')
    programs=$(echo -e "$programs"|sed 's/^/function=/g')
    programs=$(echo -e "$programs\n$allAlias"|sort -t '=' -k 2 -d|sed -r '/^[!a-zA-Z]/!d'|sed 's/^function=//')
    if [ $# -eq 0 ];then
        echo "$programs"
    elif [ $# -eq 1 ];then
        echo "$programs"|grep -i $1
    else
        echo "$programs"|grep $@
    fi
    exit 0
##以下情况向grep直接传递参数,直接接收grep原生各项参数
elif [[ "$1" == "-A" ]];then
    ##查询所有,包含aliaswinapp内函数定义和用户alias别名,查找参数必不可少,grep时仅仅在alias名称中查找
    ##注意区分和-a(小写a)分支的区别
    shift
    . ~/.bash_profile >/dev/null
    . ~/.bashrc >/dev/null
    allAlias=$(alias -p|grep -iE '^alias '|awk -F '[ =]' '{print $2}')
    programs=$(echo -e "$programs\n$allAlias"|sort -d)
    echo "$programs"|grep $@
    exit 0
else
    #仅列出/v/bin/aliaswinapp中函数定义,并供grep原生参数查找
    echo "$programs"|grep $@
fi

扫描二维码,在手机上阅读!

bash:rsync自动反复重试脚本,直到执行成功,/v/bin/rsync-retry

#/bin/bash
#rsync自动重试warp;直到成功
SCRIPTPATH=$(realpath $0)
display_usage() {
    echo -e "$SCRIPTPATH\n"
    echo -e "\trsync自动重试脚本,rsync执行失败后重新运行命令,可指定最大重试次数和重试间隔时间;"
    echo -e "\t参数一即失败重试次数,可省略,缺省次数为-1,默认反复执行直到返回成功."
    echo -e "\t参数二即周期延时时间,可省略,缺省参数为20,即间隔20s进行下一次循环调用."
    echo -e "\nUsage:\n\trsync-retry [max-try-times] [delay-seconds-time] rsync~options~~"
    echo -e "Example:\n\trsync-retry 10 20 -rlvvzPD --size-only --bwlimit ./ winhk:/root/files/"
}
# if less than two arguments supplied, display usage
if [  $# -lt 1 -o "$*" == "-h" ]
then
    display_usage
    exit 1
fi

# check whether user had supplied -h or --help . If yes display usage
#if [[ ( $# == "--help") ||  $# == "-h" ]]
if [[ ( $* == "--help") ||  $* == "-h" ]]
then
    display_usage
    echo -e "\n-------------------------------------------------\n"
    #exit 0
fi

#Option:默认重试次数
retry_time=-1

#判断第一个参数是否为纯数字,如果是数字,则认定为命令最大重试次数
expr $1 "+" 10 &> /dev/null  
if [ $? -eq 0 ];then
retry_time=$1
shift
fi

##空格路径文件处理
#IFS=$(echo -en "\n\b")

#Option:默认延时
delay_time=20

#判断第二个参数是否为纯数字,如果是数字,则认定为重复调用命令的间隔时间
expr $1 "+" 10 &> /dev/null  
if [ $? -eq 0 ];then
delay_time=$1
shift
fi

return_val=-1
run_time=0
while [ "$return_val" -ne 0 -a "$retry_time" -eq "-1" ] || [ "$return_val" -ne 0 -a "$run_time" -lt "$retry_time" ]
do
#只有指定有限次的(具体数值)运行次数时,程序才计算命令当前累计调用的次数
if [ "$retry_time" -ne "-1" ];
then 
let run_time+=1
fi
rsync $*
return_val=$?
if [ "$retry_time" -ne "-1" ];
then
echo -e "\t第 ${run_time} 次返回值:${return_val}  (${run_time}/${retry_time})\n"
fi
## 如果是最后一次调用或者此次调用命令返回成功值,则不进行延时
if [ ${run_time} -ne ${retry_time} ] && [ ${return_val} -ne 0 ];then
#重试延时,默认为20s,不需要可以注释掉,最好适当增加延时,哪怕一秒也OK,0延时可能导致Ctrl + C无法中断指令。
sleep ${delay_time}
fi
done

echo -e "\t命令序列执行完毕..."

扫描二维码,在手机上阅读!

【FTP便携文件助手】,bat使用lftp便携上传文件到FTP服务器

@echo off&@title FTP便携上传助手 By Lonelyer ^<hackkey@qq.com^>
pushd "%~dp0..\"
set "OLDPATH=C:\Program Files (x86)\SepanderSoft;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\NVIDIA Corporation\NVIDIA NvDLISR;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn\;C:\Program Files (x86)\Microsoft VS Code\bin;C:\Program Files\dotnet\;H:\Go\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;C:\Users\Administrator\AppData\Local\Programs\Microsoft VS Code\bin"
set "PATH=%~dp0..\deps;%PATH%"
set "HOMEPATH=%~dp0..\"
set HOMEPATH=%HOMEPATH:~0,-1%
REM 兼容汉字文件名:使用了Mintty下面这行就可以不用,否则和.minttyrc冲突,起反作用
REM set LANG="zh_CN.GBK"

if "%1"=="" (echo\
echo 欢迎 %Username%!
echo FTP便携上传助手 By Lonelyer ^<hackkey@qq.com^>
echo\
echo ==============================
echo 使用说明:
echo 请把要上传的HTML文件直接拖拽到本文件上,即可进行上传...
echo\
echo 注意:1.文件完整路径(文件名和文件夹名称)中不要包含空格,否则会导致解析失败;
echo       2.文件名或文件夹名称可以包含中文汉字,不影响使用;
echo ==============================
echo\
ping -n 3 127.0.0.1>nul&color 0A
echo 本次不执行任何操作,按任意键退出本程序或直接关闭本窗口....
pause>nul&&exit
) 

REM 拉取最新密码
set "password="
set "passwordFile=rcfile/password.txt"
wget -O %passwordFile% http://source.xxx.com/nat/password.txt -o rcfile/wget.log

for /f %%n in (%passwordFile%) do (
   set "password=%%n"
)

REM echo =======================
REM echo %*
REM echo =======================
REM echo %*|sed -r "s#[\"]##g;s#[ ]#\\ #g;s#^\\##;s#\\$##"
REM >%~dp0fixfullpath.txt echo %*|sed -r "s#[\"]##g;s#[ ]#\\\ #g;s#^\\##;s#\\$##"
REM set "FixFullPath="
REM for /F "usebackq delims= tokens=*" %%t in (`type %~dp0fixfullpath.txt`) do (
REM set "FixFullPath=%%t"
REM )
REM echo FixFullPath %FixFullPath%
REM echo =======================

set "localFile="
set "FileName="
set "FilePath="
set "localFileExt="
set "FileDrive="
set "FileUnixSuffix="
for %%i in ("%*") do (
set localFile=%%~fi
set FileName=%%~nxi
set FilePath=%%~dpi
set localFileExt=%%~xi
set FileDrive=%%~di
set "FileUnixSuffix=%%~pnxi"
)

set FileDrive=%FileDrive::=%
set "FileUnixSuffix=%FileUnixSuffix:\=/%"
set "FullUnixPath=/cygdrive/%FileDrive%%FileUnixSuffix%"
REM 如果有空格,进行替换,测试无效
REM set "FullUnixPath=%FullUnixPath: =\ %"

REM echo %localFile%
REM echo %FileName%
REM echo %localFileExt%
REM echo %FileDrive%
REM echo 组合后路径:%FullUnixPath%

REM Push 到上传文件所在目录
REM pushd "%FilePath%"

if "%localFileExt%"==".htm" ( call :PutHTMLFile "%localFile%" html&goto endScript )
if "%localFileExt%"==".html" ( call :PutHTMLFile "%localFile%" html&goto endScript )
echo\
echo        你要上传的文件 %FileName% 不是HTML文件,是否确认上传本文件?
echo        输入 y 确认强制上传,或者直接关闭本窗口退出
echo\
set /p forcePut=

if "%forcePut%"=="y" ( call :PutHTMLFile "%localFile%"&goto endScript )
if "%forcePut%"=="Y" ( call :PutHTMLFile "%localFile%"&goto endScript )
exit


:PutHTMLFile
set PutFile=%1
@title 正在执行上传指令,请等待....
REM lftp -d -e "ls -al;!!dir;exit;" --rcfile ./rcfile/.lftprc -u ftp_web,12345678 ftp.xxx.com

echo\
echo    工作路径 %CD%
echo =^> 上传文件 %PutFile%
echo 上传过程中不要关闭窗口
echo\

REM set PutFile=%PutFile:\=\\%
REM echo %PutFile%

if "x%2"=="xhtml" (
sed -i "s#.5pt#1pt#g" %PutFile%
lftp -e "put "'"%FullUnixPath%"'" -o index.html;ls -al;exit;" --rcfile ./rcfile/.lftprc -u ftp_web,%password% ftp.xxx.com
) else (
lftp -e "put "'"%FullUnixPath%"'";ls -al;exit;" --rcfile ./rcfile/.lftprc -u ftp_web,%password% ftp.xxx.com
)
goto :eof


:endScript
echo\&echo 操作命令执行完毕....
REM echo  返回码:%ERRORLEVEL%
if "%ERRORLEVEL%"=="0" (
@title 上传成功!&color 0A
echo\
echo  目标文件("%FileName%")上传成功!
echo  你现在可以关闭本窗口或按任意键退出...
) else (
@title 操作失败,请截图本页面联系技术管理员反馈哦!&color 0C
echo\
echo   哦豁,操作失败
echo   本次任务失败,可能是由于用户名或密码不正确,或者服务器下线所致。
echo   请截图本页面联系管理员进行反馈!
echo   你现在可以关闭本窗口或按任意键退出...
)
pause>nul&&exit
goto :eof

pause

扫描二维码,在手机上阅读!

关于斐讯K2路由器 j.s9w.cc 劫持的问题。

用K2浏览器会发现很多时候浏览器访问网页的时候多了 js.s9w.cc的 js
网上说是斐讯K2在恶意注入,经测试后发现,只不过关掉“系统设置”---》“应用设置”里的“购物比价”功能即可。


扫描二维码,在手机上阅读!
Title - Artist
0:00