Browse Category

随笔

Git创建、设置SSH Key登陆及基本操作

初始化设置姓名和邮箱地址

git config --global user.name "Yourname"
git config --blobal user.email "mail@domain.com"

创建SSH Key

ssh-keygen -t rsa -C "yout_email@domain.com"

一路回车后 会生成 id_rsa.pub

将其中内容复制粘贴至 github https://github.com/settings/keys

使用以下命令测试

ssh -T git@git.com

查看Git版本

git version

初始化Git本地代码库

git init

将Git本地代码库与远程代码库绑定

git remote add origin https://myuser@bitbucket.org/myname/myprojects.git

查看Git分支

git branch

 

WINDOWS批处理(bat)检测网络是否连接然后执行下一操作

@ECHO OFF
setlocal enabledelayedexpansion
TITLE 自助机初始化程序
COLOR 0A
CLS
@ECHO OFF
set FTP_HOST=168.254.0.130
set TEST_HOST=168.254.0.130
set TEMP_FLOOR_PATH=C:\temp
set TEST_COUNT=0
:PING_TEST
set /a TEST_COUNT=TEST_COUNT+1
echo.第!TEST_COUNT!次网络探测-HOST:!TEST_HOST!
ping /n 2 !TEST_HOST! | findstr "TTL=" && GOTO UPDATE_FILE || ECHO.网络链接失败。
goto PING_TEST
:UPDATE_FILE
echo.网络链接已经成功。。。。。。。
echo.开始下载新版程序。。。。。。。
::创建临时目录
if not exist !TEMP_FLOOR_PATH! ( mkdir !TEMP_FLOOR_PATH! )
::连接FTP并下载安装文件
set FTP_TEMP=ftp_temp1.txt
echo open !FTP_HOST! >!FTP_TEMP!
Rem auto_soft是账号 123456是密码
echo user auto_soft 123456 >>!FTP_TEMP!
echo cd "/yb" >>!FTP_TEMP!
echo lcd "!TEMP_FLOOR_PATH!" >>!FTP_TEMP!
echo binary >>!FTP_TEMP!
echo get install.bat >>!FTP_TEMP!
echo bye >>!FTP_TEMP!
ftp -n -s:!FTP_TEMP!
del !FTP_TEMP!
call !TEMP_FLOOR_PATH!\install.bat

转:由于可能不会将凭据发送到远程计算机,因此将不会进行连接。若要获得协助,请与您的系统管理员联系。

转自:https://www.cnblogs.com/Wahitler/articles/4788805.html
windows10系统下,在通过VPN连接到堡垒机的时候,出现“由于可能不会将凭据发送到远程计算机,因此将不会进行连接。若要获得协助,请与您的系统管理员联系。”

远程

以下是解决方法:

方法一.组策略

请按照下列步骤操作:

  1. Win +R 键 启动 Gpedit.msc。

 

0

2.   展开“计算机配置”,然后展开“管理模板”。 展开“系统”,然后单击“凭据委派”。

 

1

3.   在“详细信息”窗格中,双击“允许分配默认凭据”。单击“已启用”,然后单击以选中“将 OS 默认值与上述输入连接起来”复选框。

QQ图片20150907141248

4.  单击“显示”,然后验证远程用户的计算机是否包含在列表中。如有必要,请单击“添加”,然后包含远程用户的计算机。

还可以使用通配符。例如,若要选择所有计算机,请添加下列通配符: *

5.  单击“确定”两次。

6.   关闭组策略。

OllyDbg快捷键

Ctrl+F2 - 重启程序,即重新启动被调试程序。如果当前没有调试的程序,OllyDbg会运行历史列表[historylist]中的第一个程序。程序重启后,将会删除所有内存断点和硬件断点。
译者注:从实际使用效果看,硬件断点在程序重启后并没有移除。
Alt+F2 - 关闭,即关闭被调试程序。如果程序仍在运行,会弹出一个提示信息,询问您是否要关闭程序。
 
F3 - 弹出“打开32位.EXE文件”对话框[Open 32-bit .EXE file],您可以选择可执行文件,并可以输入运行参数。
 
Alt+F5 -
让OllyDbg总在最前面。如果被调试程序在某个断点处发生中断,而这时调试程序弹出一个总在最前面的窗口(一般为模式消息或模式对话框[modal messageor dialog]),它可能会遮住OllyDbg的一部分,但是我们又不能移动最小化这个窗口。激活OllyDbg(比如按任务栏上的标签)并按
Alt+F5,OllyDbg将设置成总在最前面,会反过来遮住刚才那个窗口。如果您再按一下Alt+F5,OllyDbg会恢复到正常状态。
OllyDbg是否处于总在最前面状态,将会保存,在下一次调试时依然有效。当前是否处于总在最前面状态,会显示在状态栏中。
F7 -
单步步入到下一条命令,如果当前命令是一个函数[Call],则会停在这个函数体的第一条命令上。如果当前命令是是含有REP前缀,则只执行一次重复操作。
Shift+F7 -
与F7相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步入被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
Ctrl+F7 -
自动步入,在所有的函数调用中一条一条地执行命令(就像您按住F7键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步入过程都会停止。每次单步步入,OllyDbg都会更新所有的窗口。所以为了提高自动步入的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步入。
 
F8 -
单步步过到下一条命令。如果当前命令是一个函数,则一次执行完这个函数(除非这个函数内部包含断点,或发生了异常)。如果当前命令是含有REP前缀,则会执行完重复操作,并停在下一条命令上。
 
Shift+F8 -
与F8相同,但是如果被调试程序发生异常而中止,调试器会首先尝试步过被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
 
Ctrl+F8 -
自动步过,一条一条的执行命令,但并不进入函数调用内部(就像您按住F8键不放一样,只是更快一些)。当您执行其他一些单步命令,或者程序到达断点,或者发生异常时,自动步过过程都会停止。每次单步步过,OllyDbg都会更新所有的窗口。所以为了提高自动步过的速度,请您关闭不必要成窗口,对于保留的窗口最好尽量的小。按Esc键,可以停止自动步过。
 
F9 - 让程序继续执行。
Shift+F9 -
与F9相同,但是如果被调试程序发生异常而中止,调试器会首先尝试执行被调试程序指定的异常处理(请参考忽略Kernel32中的内存非法访问)。
 
Ctrl+F9 -
执行直到返回,跟踪程序直到遇到返回,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条命令执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
 
Alt+F9 -
执行直到返回到用户代码段,跟踪程序直到指令所属于的模块不在系统目录中,在此期间不进入子函数也不更新CPU数据。因为程序是一条一条执行的,所以速度可能会慢一些。按Esc键,可以停止跟踪。
 
Ctrl+F11 
-Run跟踪步入,一条一条执行命令,进入每个子函数调用,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
 
F12 
- 停止程序执行,同时暂停被调试程序的所有线程。请不要手动恢复线程运行,最好使用继续执行快捷键或菜单选项(像 F9)。
 
Ctrl+F12 
-Run跟踪步过,一条一条执行命令,但是不进入子函数调用,,并把寄存器的信息加入到Run跟踪的存储数据中。Run跟踪不会同步更新CPU窗口。
 
Esc - 如果当前处于自动运行或跟踪状态,则停止自动运行或跟踪;如果CPU显示的是跟踪数据,则显示真实数据。
 
Alt+B - 显示断点窗口。在这个窗口中,您可以编辑、删除、或跟进到断点处。
Alt+C - 显示CPU窗口。
Alt+E - 显示模块列表[list of modules]。
Alt+K - 显示调用栈[Call stack]窗口。
Alt+L - 显示日志窗口。
Alt+M - 显示内存窗口。
Alt+O - 显示选项对话框[Options dialog]
Ctrl+P - 显示补丁窗口。
Ctrl+T - 打开 暂停 Run跟踪 对话框
Alt+X - 关闭 OllyDbg。
 
大多数窗口都支持以下的键盘命令:
Alt+F3 - 关闭当前窗口。
Ctrl+F4 - 关闭当前窗口。
F5 - 最大化当前窗口或将当前窗口大小改为正常化。
F6 - 切换到下一个窗口。
Shift+F6 - 切换到前一个窗口。
F10 - 打开与当前窗口或面板相关的快捷菜单。
左方向键 - 显示窗口左方一个字节宽度的内容。
Ctrl+左方向键 - 显示窗口左方一栏的内容。
右方向键 - 显示窗口右方一个字节宽度的内容
Ctrl+右方向键 - 显示窗口右方一栏的内容
 
反汇编窗口中的快捷键[Disassembler shortcuts]
当CPU窗口中的反汇编面板[Disassembler pane]处于激活状态时,您可以使用以下快捷键:
 
回车键 - 将选中的命令添加到命令历史[command history]中,如果当前命令是一个跳转、函数或者是转换表的一个部分,则进入到目的地址。
退格键 - 移除选中部分的自动分析信息。如果分析器将代码误识别为数据,这个快捷键就非常有用。请参考解码提示[decoding hints]. 
Alt+退格键 - 撤消所选部分的修改,以备份数据的相应内容替换所选部分。仅当备份数据存在且与所选部分不同时可用。
Ctrl+F1 -如果API帮助文件已经选择,将打开与首个选择行内的符号名相关联的帮助主题。
F2 -在首个选择的命令上开关INT3 断点[Breakpoint],也可以双击该行第二列。
Shift+F2 -在首个选择命令设置条件断点,参见忽略Kernel32中内存访问异常[Ignore memory access violations in Kernel32]。
F4 -执行到所选行,在首个选择的命令上设置一次性断点,然后继续执行调试程序,直到OllyDbg捕获到异常或者停止在该断点上。在程序执行到该命令之前,该一次性断点一直有效。如有必要,可在断点窗口[Breakpoints window]中删除它。
 
Shift+F4 -设置记录断点(一种条件断点,当条件满足时一些表达式的值会记录下来), 详情参见断点[Breakpoint]。
 
Ctrl+F5 -打开与首个选择的命令相对应的源文件。
 
Alt+F7 -转到上一个找到的参考。
 
Alt+F8 -转到下一个找到参考。
 
Ctrl+A -分析当前模块的代码段。
Ctrl+B - 开始二进制搜索。
 
Ctrl+C -复制所选内容到剪贴板。复制时会简单地按列宽截断不可见内容,如果希望排除不需要的列,可把这些列的宽度调整到最小。
 
Ctrl+E -以二进制(十六进制)格式编辑所选内容。
 
Ctrl+F -开始命令搜索。
 
Ctrl+G -转到某地址。该命令将弹出输入地址或表达式的窗口。该命令不会修改 EIP。
Ctrl+J -列出所有的涉及到该位置的调用和跳转,在您用这个功能之前,您必须使用分析代码功能。
Ctrl+K - 查看与当前函数相关的调用树[Call tree]。在您用这个功能之前,您必须使用分析代码功能。
Ctrl+L - 搜索下一个,重复上一次的搜索内容。
 
Ctrl+N - 打开当前模块的名称(标签)列表。
Ctrl+O -
扫描object文件。扫描Object文件。该命令会显示扫描Object文件对话框,您可以在该对话框中选择Object文件或者lib文件,并扫描这个文件,试图找到在实际代码段中用到的目标模块。
 
Ctrl+R
-搜索所选命令的参考。该命令扫描激活模块的全部可执行代码,以找到涉及到首个选中的命令的全部相关参考(包括:常量、跳转及调用),您可以在参考中使用快捷键
Alt+F7 和 Alt+F8来浏览这些参考。为便于您使用,被参考的命令也包含在该列表中。
Ctrl+S -命令搜索。该命令显示命令查找[Find command]对话框供您输入汇编命令,并从当前命令开始搜索。
 
星号[Asterisk](*) -转到原始位置(激活线程的EIP处)。
Ctrl+星号(*) - 指定新的起始位置,设置当前所选线程的EIP为首个选择字节的地址。您可以在选择EIP并撤消该操作。
加号[Plus](+) -如果run跟踪[run trace] 没有激活,则根据命令历史[command
history]跳到下一条运行过命令的地方;否则跳到Run跟踪的下一个记录。
 
Ctrl+加号 - 跳到前一个函数开始处。(注意只是跳到,并不执行)
减号[Minus](-) - 如果run跟踪[run trace] 没有激活,则根据命令历史[command
history]跳到前一条运行过命令的地方;否则跳到Run跟踪的前一个记录。
Ctrl+减号 - 跳到下一个函数开始处。(注意只是跳到,并不执行)
 
空格[Space] -
修改命令。您可在显示对话框中以汇编语言修改实际指令或输入新指令,这些指令将替换实际代码,您也可以在想要修改的指令处双击鼠标。
 
冒号[Colon]( - 添加标签。显示添加标签窗口[Add label]或修改标签窗口[Change
label],您可在此输入与首个选择的命令中的第一个字节相关联的标签(符号名)。注意,在多种编程语言中,冒号可以是标签的一部分。
分号[Semicolon](;) - 添加注释[comment]。显示添加注释窗口[Add label]或修改注释窗口[Change
label],您可在此输入与首条所选命令的第一个字节相关联的注释(注释串会显示在最后一列中)。注意,多种汇编语言使用分号作为注释开始。您也可以在注释列双击需要注释的命令行。
 
命令行插件支持的命令
 
CALC
判断表达式
 
WATCH
添加监视表达式
AT
在指定地址进行反汇编
FOLLOW
跟随命令
ORIG
反汇编于 EIP
 
DUMP
在指定地址进行转存
DA
转存为反汇编代码
 
DB
使用十六进制字节格式转存
 
DC
使用 ASCII 格式转存
DD
转存在堆栈格式
 
DU
转存在 UNICODE 格式
DW
使用十六进制字词格式转存
 
STK
 
AS
(AS + 地址 + 字符串)
在指定地址进行汇编
 
BP
进行条件中断(有条件的断点)
BPX
中断在全部调用 (Call)
BPD
清除全部调用中的断点
 
BC
清除断点
 
MR
内存断点于访问时
 
MW
内存断点于写入时
 
MD
清除内存断点
 
HR
访问时进行硬件中断
 
HW
写入时进行硬件中断
HE
执行时进行硬件中断
 
HD
清除硬件断点
 
STOP
停止运行程序调试
PAUSE
暂停执行程序调试
 
RUN
运行程序进行调试
 
GE
运行和通过例外
SI
单步进入 Call 中
SO
步过 Call
TI
跟踪进入直到地址
 
TO
跟踪步过直到地址
TC
跟踪进入直到满足条件
TOC
跟踪步过直到满足条件
 
TR
运行直到返回
 
TU
运行直到用户代码
 
LOG
查看记录窗口
 
MOD
查看模块窗口
MEM
查看内存窗口
CPU
查看 CPU 窗口
CS
查看 Call 堆栈
 
BRK
查看断点窗口
OPT
打开选项设置窗口
 
EXIT
退出 OllyDbg
 
QUIT
退出 OllyDbg
 
OPEN
打开一个可执行文件
 
CLOSE
关闭可执行文件
 
RST
重新运行当前程序
 
HELP
查看 API 函数的帮助

 

PHP生成GUID算法

/**
 * 创建GUID
 *
 * @return string
 */
function get_guid(){
    $tmp = md5(uniqid(md5(microtime(true)),true));
    $units = substr($tmp,0,8) . '-' . substr($tmp,8,4) . '-' . substr($tmp,12,4) . '-' . substr($tmp,16,4) . '-' . substr($tmp,20,12);
    return $units;
}

PHP计算时间日期差并检验日期格式是否正确(月龄计算)

/**
 * 校验日期格式是否正确
 * 
 * @param string $date 日期
 * @param string $formats 需要检验的格式数组
 * @return boolean
 */
function checkDateIsValid($date, $formats = array("Ymd","Y-m-d", "Y/m/d")) {
    $unixTime = strtotime($date);
    if (!$unixTime) { //strtotime转换不对,日期格式显然不对。
        return false;
    }
    //校验日期的有效性,只要满足其中一个格式就OK
    foreach ($formats as $format) {
        if (date($format, $unixTime) == $date) {
            return true;
        }
    }
    return false;
}
/**
 * 计算日期时间差
 * 
 * @param string $date_befor 日期1
 * @param string $date_after 日期2
 * @param string $diff_type 返回类型 YMDHIS
 * @return boolean | int 相差结果 失败返回false
 */
function calcDateDiff($date_befor,$date_after,$diff_type = 'm'){
    if( checkDateIsValid($date_befor) && checkDateIsValid($date_after) ){
        $date_befor = strtotime($date_befor);
        $date_after = strtotime($date_after);
        switch(strtoupper($diff_type)){
            case 'Y':
                $c['B']['Y'] = date('Y',$date_befor);
                $c['B']['M'] = date('m',$date_befor);
                $c['B']['D'] = date('d',$date_befor);
                $c['A']['Y'] = date('Y',$date_after);
                $c['A']['M'] = date('m',$date_after);
                $c['A']['D'] = date('d',$date_after);
                $c['C']['Y'] = ($c['A']['Y'] - $c['B']['Y']) * 12;
                $c['C']['M'] = ($c['A']['M'] - $c['B']['M']) * 1;
                $c['C']['D'] = ($c['A']['D'] - $c['B']['D']) >= 0 ? 0 : -1 ;
                return floor(($c['C']['Y'] + $c['C']['M'] + $c['C']['D'] )/12) ;
                break;
            case 'M':
                $c['B']['Y'] = date('Y',$date_befor);
                $c['B']['M'] = date('m',$date_befor);
                $c['B']['D'] = date('d',$date_befor);
                $c['A']['Y'] = date('Y',$date_after);
                $c['A']['M'] = date('m',$date_after);
                $c['A']['D'] = date('d',$date_after);
                $c['C']['Y'] = ($c['A']['Y'] - $c['B']['Y']) * 12;
                $c['C']['M'] = ($c['A']['M'] - $c['B']['M']) * 1;
                $c['C']['D'] = ($c['A']['D'] - $c['B']['D']) >= 0 ? 0 : -1 ;
                return $c['C']['Y'] + $c['C']['M'] + $c['C']['D'] ;
                break;
            case 'D':
                return floor(($date_after - $date_befor)/86400);
                break;
            case 'H':
                return floor(($date_after - $date_befor)/3600);
                break;
            case 'I':
                return floor(($date_after - $date_befor)/60);
                break;
            case 'S':
                return $date_after - $date_befor;
                break;
            default:
                return $date_after - $date_befor;
                break;
        }
        return true;
    }
    return false;
}

 

PHP四大排序算法

抄自:董鑫

BUBBLE 冒泡排序

代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

SELECT 选择排序

代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //该层循环控制 需要冒泡的轮数
  for($i=1;$i<$len;$i++)
  { //该层循环用来控制每轮 冒出一个数 需要比较的次数
    for($k=0;$k<$len-$i;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

INSERT 插入排序

function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}

MERGE 归并排序

<?php  
$arrStoreList = array(3,2,4,1,5);  
$sort = new Merge_sort();  
$sort->stableSort($arrStoreList, function ($a, $b) {    // function ($a, $b)匿名函数  
            return $a < $b;  
});  
//静态调用方式也行  
/*Merge_sort:: stableSort($arrStoreList, function ($a, $b) { 
            return $a < $b; 
});*/  
print_r($arrStoreList);  

class Merge_sort{  

 public static function stableSort(&$array, $cmp_function = 'strcmp') {  
        //使用合并排序  
        self::mergeSort($array, $cmp_function);  
        return;  
    }  
 public static function mergeSort(&$array, $cmp_function = 'strcmp') {  
        // Arrays of size < 2 require no action.  
        if (count($array) < 2) {  
            return;  
        }  
        // Split the array in half  
        $halfway = count($array) / 2;  
        $array1 = array_slice($array, 0, $halfway);  
        $array2 = array_slice($array, $halfway);  
        // Recurse to sort the two halves  
        self::mergeSort($array1, $cmp_function);  
        self::mergeSort($array2, $cmp_function);  
        // If all of $array1 is <= all of $array2, just append them.  
//array1 与 array2 各自有序;要整体有序,需要比较array1的最后一个元素和array2的第一个元素大小  
        if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {    
            $array = array_merge($array1, $array2);  

            return;  
        }  
        // 将两个有序数组合并为一个有序数组:Merge the two sorted arrays into a single sorted array  
        $array = array();  
        $ptr1 = $ptr2 = 0;  
        while ($ptr1 < count($array1) && $ptr2 < count($array2)) {  
            if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {  
                $array[] = $array1[$ptr1++];  
            } else {  
                $array[] = $array2[$ptr2++];  
            }  
        }  
        // Merge the remainder  
        while ($ptr1 < count($array1)) {  
            $array[] = $array1[$ptr1++];  
        }  
        while ($ptr2 < count($array2)) {  
            $array[] = $array2[$ptr2++];  
        }  
        return;  
    }  
}  
?>
  • 1
  • 2