ubuntu和window交叉编译

安装:sudo apt-get install mingw-w64

新建一个c文件test.c

内容:

#include <stdio.h>

int main()
{
        printf("dd");
        return 0;
}

保存退出

运行:x86_64-w64-mingw32-gcc test.c -o test.exe

在window下运行test.exe

ubuntu ssh安全登录方法总结

1.禁止root登录,修改端口,新建用户赋予root权限

第一步、

添加用户 adduser 用户名 接着回车输入密码

接着打开vim /etc/sudoers

添加一行 用户名 ALL=(ALL:ALL) ALL

第二步、修改端口和禁止root登录

vim /etc/ssh/sshd_config

修改Port

把PermitRootLogin no 设置为no

注释掉#PermitRootLogin prohibit-password

重新打开一个ssh界面 就会发现root账号登录不了。

2.密钥登录(推荐,安全比较高)

如果服务器运营商提供了生成密钥服务,就用运营商的。

第一步、

首先在命令行输入ssh-keygen

接着一直回车就可以了,如果需要输入密码可自行输入。

我这里已经申请过了。

我们cd 到.ssh文件里面 这里我是用root账号申请的,就是/root/.ssh 如果是其他账号就是 /账号/.ssh。

接着 cat id_rsa.pub >> authorized_keys

接着就是设置权限 chmod 700 authorized_keys 和 chmod 700 /root/.ssh

最后进去
/etc/ssh/sshd_config 看下 RSAAuthentication yes 和 PubkeyAuthentication yes 是否设置为yes

接着我们把id_rsa 拿到本地去用ssh工具去使用

我这里以xshell为例

点击确定。

ok没问题。

接着我们新开一个窗口
修改 /etc/ssh/sshd_config 里面的PasswordAuthentication no为no 这样就只能通过密钥来登录拉,接着service ssh restart重启。

(这里要特别注意哦,不然就危险了。)

elasticsearch 基本用法。

环境 elasticsearch6.0 kibana-6.0.0

进入
elasticsearch /bin 目录下

下载对应版本的ik分词(我这里是6.0版本)

elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip

运行
kibana 运行默认端口5601 开始代码把!

1.CURD

#1.新建数据库(索引)
#number_of_shards 分片的数量 默认5(一旦创建完成不能改)
#number_of_replicas 副本的数量 默认1
PUT blog
{
  "settings":{
    "index":{
      "number_of_shards":5,
      "number_of_replicas":1
    }    
  }
}
#2.获取索引消息
GET _all
GET blog
#3.添加表和数据
POST blog/article
{
  "title":"我是博客",
  "msg":{
    "author":"admin",
    "position":"程序员"
  },
  "desc":"i like you",
  "create_time":"2019-07-12",
  "look":50,
  "like":100
}
#4.获取数据(这里先简写后面详细讲解)
GET blog/article/_search
#5.修改数据
PUT blog/article/0PkS5msBS7MmrBYMH0SR
{
  "title":"我是程序员",
  "msg":{
    "author":"admin",
    "position":"程序员"
  },
  "desc":"i like you",
  "create_time":"2019-07-12",
  "look":50,
  "like":100
}
#5.1 修改数据
POST blog/article/0PkS5msBS7MmrBYMH0SR/_update
{
  "doc":{
    "title":"i like work ( fuck you ) "
  }
}
#6.delete (无法删除表,可以删除索引)
DELETE blog/article/0PkS5msBS7MmrBYMH0SR
DELETE blog
#7. 批量操作(同时执行增删改查)
(
格式 添加 {"index":{"_index":"索引名称","_type":"表名称","_id":"id(可不传入)"}}
接着下面填写数据
修改 {"update":{"_id":"id","_type":"表名称","_index":"索引名称"}}
接着下面修改数据
删除 {"delete":{"_id":"id","_type":"表名称","_index":"索引名称"}}
)
POST _bulk
{"index":{"_index":"blog","_type":"article","_id":1}}
{"title":"我是程序员","msg":{"author":"admin","position":"程序员"},"desc":"i like you","create_time":"2019-07-12","like":100}
{"index":{"_index":"blog","_type":"article","_id":2}}
{"title":"我是程序员","msg":{"author":"admin","position":"程序员"},"desc":"i like you","create_time":"2019-07-12","like":100}
{"update":{"_id":2,"_type":"article","_index":"blog"}}
{"doc":{"like":101}}
{"delete":{"_id":1,"_type":"article","_index":"blog"}}
#8.设置插入类型
( text字符串类型 keyword字符串类型(不分词) properties一个对象 date日期 format日期显示格式 integer数字 analyzer选择分词 )
PUT blog
{
  "mappings": {
    "article": {
      "properties": {
        "title":{
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "msg":{
          "properties": {
            "author":{
              "type":"keyword"
            },
            "position":{
              "type":"keyword"
            }
          }
        },
        "desc":{
          "type": "text"
        },
        "create_time":{
          "type": "date",
          "format": "yyyy-MM-dd"
        },
        "like":{
          "type": "integer"
        }
      }
    }
  }
}

执行GET blog 效果如下:
{
  "blog": {
    "aliases": {},
    "mappings": {
      "article": {
        "properties": {
          "create_time": {
            "type": "date",
            "format": "yyyy-MM-dd"
          },
          "desc": {
            "type": "text"
          },
          "like": {
            "type": "integer"
          },
          "msg": {
            "properties": {
              "author": {
                "type": "keyword"
              },
              "position": {
                "type": "keyword"
              }
            }
          },
          "title": {
            "type": "text",
            "analyzer": "ik_max_word"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1562935455291",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "IQ0B-zsNSmeV26mNjb8i_w",
        "version": {
          "created": "6000099"
        },
        "provided_name": "blog"
      }
    }
  }
}
#1.match查询 (根据分词查询对应数据)
GET blog/article/_search
{
  "query":{
    "match":{
      "title":"python"
    }
  }
}
#2.term查询 (不会对搜索解析)
GET blog/article/_search
{
  "query": {
    "term":{
      "title":"python"
    }
  }
}
#3.terms查询 (数组内有一个满足就查询出来)
GET blog/article/_search
{
  "query": {
    "terms": {
      "title": [
        "php",
        "网站"
      ]
    }
  }
}
#4.分页查询
GET blog/article/_search
{
  "query":{
    "match":{
      "title":"python"
    }
  },
  "from": 0,
  "size": 1
}
#5.全部查询
GET blog/article/_search
{
  "query": {
    "match_all": {}
  }
}
#6.多字段查询 multi_match
GET blog/article/_search
{
  "query": {
    "multi_match": {
      "query": "程序员",
      "fields": ["title","msg.position"]
    }
  }  
}
#7.指定返回字段 (要在设置类型时设置 "store": true)
GET blog/article/_search
{
  "stored_fields":["title","desc"],
  "query": {
    "match": {
      "title": "php"
    }
  }
}
#8.sort排序 
GET blog/article/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "like": {
        "order": "desc"
      }
    }
  ]
}
#9. 查询范围  
GET blog/article/_search
{
  "query": {
    "range": {
      "like": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

组合查询

#1. filter查询
#select * from article where like=50;
GET blog/article/_search
{
  "query": {
    "bool": {
      "must": {"match_all": {}},
      "filter": {
        "term": {
          "like": "50"
        }
      }
    }
  }
}
#should 或者 must必须 must_not取反 exists是否存在
GET blog/article/_search
{
  "query": {
    "bool": {
      "should": [
        {"term":{"title":"python"}}
      ],
      "must": [
        {"term":{"like":50}}
      ]
    }
  }
}

C语言编写 执行mysql脚本,禁止delete操作

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct sqlConfig
{
        char *db_name;//数据库名称
        char *db_sql;//sql语句
} Config;

int main(int argc,char *argv[])
{

        if(argc!=3)
        {
                printf("第一个参数为数据库名,第二个数据库名为sql语句。\n");
                printf("例如:./a.out mysql 'select * from user;'\n");
                return 0;
        }


        char *shell_cmd = "/xxx/xxx/bin/mysql -h127.0.0.1 -Pxxxx -u xxxx -pxxxx -S /xxx/xxxx/mysql.sock";

        //初始化 结构体
        Config config = {*(argv+1),*(argv+2)};


        /*****  判断是否为delete语句  ******/
        char del_char[6] = {100,101,108,101,116,101};//delete 这个单词的ascii 码
        int is_bool = 0;//如果全部 ascii相同赋值为1
        for(int i=0;i<6;i++)
        {
                if(config.db_sql[i]==del_char[i])
                {
                        is_bool=1;
                }else{
                        is_bool=0;
                        break;
                }
        }
        if(is_bool==1)
        {
                printf("%s\n","危险操作!");
                return 0;
        }

        //动态分配字符变量,用来拼接sql语句
        char *return_text = (char *) malloc(strlen(shell_cmd)+strlen(config.db_name)+strlen(config.db_sql)+10);
        sprintf(return_text,"%s%s%s%s%s%s%s",shell_cmd," -D ",config.db_name," -e ","\"",config.db_sql,"\"");
        printf("%s\n",return_text);
        //执行sql语句
        system(return_text);
        //释放动态变量
        free(return_text);
}

运行:gcc test.c -o my_mysql

接着运行delete操作

./my_mysql bilbil “delete from bilbil_user;”

危险操作

运行 其他操作

./my_mysql bilbil “select * from bilbil_user_info;”
+—-+———+———–+———–+———-+————+———–+———————+———————+
| id | user_id | user_icon | user_name | user_uid | user_birth | user_desc | update_time | create_time |
+—-+———+———–+———–+———-+————+———–+———————+———————+
| 17 | 35 | NULL | NULL | NULL | NULL | | 2019-06-06 14:54:45 | 2019-06-06 14:54:45 |
+—-+———+———–+———–+———-+————+———–+———————+———————+