Linux下获取网卡信息

#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAX_INTERFACE 64

int main(int argc, char const *argv[])
{
  printf("hello world!\n");
  showifs();
  return 0;
}

int showifs()
{
    int i;
    int rc;
    int sock;
    int ifnum;
    struct ifreq ifr[MAX_INTERFACE];
//    struct arpreq arp;
    struct ifconf ifc;

    sock = socket ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
    if ( sock == -1 )
    {
        return -1;
    }

    ifc.ifc_len = sizeof( ifr );
    ifc.ifc_buf = ( caddr_t ) ifr;
    rc = ioctl ( sock, SIOCGIFCONF, &ifc );
    if ( rc == -1 )
    {
        close( sock );
        return -1;
    }

    ifnum = ifc.ifc_len / sizeof ( struct ifreq );
    fprintf( stdout, "ifnum=[%d]\n======================================\n", ifnum );
    for ( i = 0; i < ifnum; i ++ )
    {
        fprintf( stdout, "ifname%d [%s]\n", i, ifr[i].ifr_name );

        //ip
        rc = ioctl ( sock, SIOCGIFADDR, ifr + i );
        if ( rc != -1 )
        {
            fprintf( stdout, "IP=%s\n", inet_ntoa( ( ( struct sockaddr_in* )( &ifr[i].ifr_addr ) )->sin_addr ) );
        }

        //netmask
        rc = ioctl ( sock, SIOCGIFNETMASK, ifr + i );
        if ( rc != -1 )
        {
            fprintf( stdout, "NETMASK=%s\n", inet_ntoa( ( ( struct sockaddr_in* )( &ifr[i].ifr_netmask  ) )->sin_addr ) );
        }

        //broadcast
        rc = ioctl ( sock, SIOCGIFBRDADDR, ifr + i );
        if ( rc != -1 )
        {
            fprintf( stdout, "BROADCAST=%s\n", inet_ntoa( ( ( struct sockaddr_in* )( &ifr[i].ifr_broadaddr ) )->sin_addr ) );
        }

        //mac
        rc = ioctl ( sock, SIOCGIFHWADDR, ifr + i );
        if ( rc != -1 )
        {
            fprintf( stdout, "%02x:%02x:%02x:%02x:%02x:%02x\n",
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[0],
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[1],
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[2],
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[3],
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[4],
                     ( unsigned char )ifr[i].ifr_hwaddr.sa_data[5] );
        }
    }

    close( sock );
    return 0;
}

 

让mysql支持emoji

emoji表情是通用的unicode字符串,不需要第三方工具支持,就可以显示丰富的表情图标,emoji表情由4个字节组成,mysql的utf8是3个字符,因此当emoji表情存入mysql数据库时会报错,通过一些设置可以让mysql支持emoji表情。

1.utf8mb4的最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本。
查看mysql版本的方法有:
在终端下:mysql -V
在mysql中:mysql> status;
使用mysql的函数:select version();
2.修改database、table和column字符集。参考以下语句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
可以根据需要,在数据库层、表层或者字段层设置utf8mb4
3.修改mysql配置文件my.cnf(windows为my.ini)
my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=’SET NAMES utf8mb4′

修改参数后需要重启mysql,重启后,在mysql命令行中输入:SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’;

检查是否如下:

+————————–+——————–+
| Variable_name            | Value              |
+————————–+——————–+
| character_set_client    | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database  | utf8mb4            |
| character_set_filesystem | binary            |
| character_set_results    | utf8mb4            |
| character_set_server    | utf8mb4            |
| character_set_system    | utf8              |
| collation_connection    | utf8mb4_unicode_ci |
| collation_database      | utf8mb4_unicode_ci |
| collation_server        | utf8mb4_unicode_ci |
+————————–+——————–+
rows in set (0.00 sec)

特别说明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,没有关系。但必须保证character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server为utf8mb4。

5.如果你用的是java服务器,升级或确保你的mysql connector版本高于5.1.13,否则仍然无法使用utf8mb4
mysql连接字符串可参考:jdbc:mysql://localhost/dbname?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
6.如果不打算重启mysql数据库,可以在数据库连接池中设置,建立连接后执行
SET NAMES utf8mb4,如DruidDataSource:

<property name="connectionInitSqls">
  <list>
    <value>set names utf8mb4</value>
  </list>
</property>

使用Navicat等客户端,如果查询出来的数据是乱码,也可先执行SET NAMES utf8mb4,然后再进行查询。

阿里云上面的mysql数据库,可以参考阿里云的官方文档:https://help.aliyun.com/knowledge_detail/5990076.html
emoji的表情列表,可参考:http://getemoji.com/

mysql jdbcURL的autoReconnect

mysql JDBC URL格式如下:

jdbc:mysql://[host:port],[host:port]…/[database][?参数名1][=参数值1][&参数名2][=参数值2]…

现只列举几个重要的参数,如下表所示:

参数名称 参数说明 缺省值 最低版本要求
user 数据库用户名(用于连接数据库)
所有版本
password 用户密码(用于连接数据库)
所有版本
useUnicode 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true false 1.1g
characterEncoding 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk false 1.1g
autoReconnect 当数据库连接异常中断时,是否自动重新连接? false 1.1
autoReconnectForPools 是否使用针对数据库连接池的重连策略 false 3.1.3
failOverReadOnly 自动重连成功后,连接是否设置为只读? true 3.0.12
maxReconnects autoReconnect设置为true时,重试连接的次数 3 1.1
initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 2 1.1
connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 0 3.0.1
socketTimeout socket操作(读写)超时,单位:毫秒。 0表示永不超时 0 3.0.1

对应中文环境,通常mysql连接URL可以设置为:

jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false

在使用数据库连接池的情况下,最好设置如下两个参数:

autoReconnect=true&failOverReadOnly=false

需要注意的是,在xml配置文件中,url中的&符号需要转义成&。比如在tomcat的server.xml中配置数据库连接池时,mysql jdbc url样例如下:

jdbc:mysql://localhost:3306/test?user=root&amp;password=&amp;useUnicode=true&amp;characterEncoding=gbk

&amp;autoReconnect=true&amp;failOverReadOnly=false

完整参数可参考官方文档:http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

详细解析Linux scp命令的应用

Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程、从远程复制到本地是两种使用方式。这里有具体举例:

==================

Linux scp 命令

==================

scp 可以在 2个 linux 主机间复制文件;

命令基本格式:

scp [可选参数] file_source file_target

======

从 本地 复制到 远程

======

* 复制文件:

* 命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者

scp local_file remote_username@remote_ip:remote_file

或者

scp local_file remote_ip:remote_folder

或者

scp local_file remote_ip:remote_file

第1,2个指定了用户名,命令执行后需要再输入密码,第1个仅指定了远程的目录,文件名字不变,第2个指定了文件名;

第3,4个没有指定用户名,命令执行后需要输入用户名和密码,第3个仅指定了远程的目录,文件名字不变,第4个指定了文件名;

* 例子:

scp -P 22222 /home/space/music/1.mp3 [email protected]:/home/root/others/music

scp /home/space/music/1.mp3 [email protected]:/home/root/others/music/001.mp3

scp /home/space/music/1.mp3 www.cumt.edu.cn:/home/root/others/music

scp /home/space/music/1.mp3 www.cumt.edu.cn:/home/root/others/music/001.mp3

* 复制目录:

* 命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者

scp -r local_folder remote_ip:remote_folder

第1个指定了用户名,命令执行后需要再输入密码;

第2个没有指定用户名,命令执行后需要输入用户名和密码;

* 例子:

scp -r /home/space/music/ [email protected]:/home/root/others/

scp -r /home/space/music/ www.cumt.edu.cn:/home/root/others/

上面 命令 将 本地 music 目录 复制 到 远程 others 目录下,即复制后有 远程 有 ../others/music/ 目录

======

从 远程 复制到 本地

======

从 远程 复制到 本地,只要将 从 本地 复制到 远程 的命令 的 后2个参数 调换顺序 即可;

例如:

scp [email protected]:/home/root/others/music /home/space/music/1.mp3

scp -r www.cumt.edu.cn:/home/root/others/ /home/space/music/

最简单的应用如下 :

scp 本地用户名 @IP 地址 : 文件名 1 远程用户名 @IP 地址 : 文件名 2

[ 本地用户名 @IP 地址 :] 可以不输入 , 可能需要输入远程用户名所对应的密码 .

可能有用的几个参数 :

-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .

-C 使能压缩选项 .

-P 选择端口 . 注意 -p 已经被 rcp 使用 .

-4 强行使用 IPV4 地址 .

-6 强行使用 IPV6 地址 .

Linux scp命令的使用方法应该可以满足大家对Linux文件和目录的复制使用了。

linux下查看文件被哪个进程读写

一台服务器被写入了一个ddos木马,会在/root下生成一个conf.n的文件,删除后很快又会自动生成,用lsof没办法查出来谁在读写这个文件。此时可以使用stap来监控。
1、df
/dev/xvda1      20509308 10556432   8888020  55% /
找到对应目录挂载的磁盘
2、ls -al /dev/xvda1
brw-rw—- 1 root disk 2021 Dec 20 15:33 /dev/xvda1
找到磁盘在系统中对应的序号
3、stat -c '%i'  conf.n
920087
找到要监视的文件对应的系文件系统ID
4、wget https://raw.githubusercontent.com/soarpenguin/systemtap-script/master/inodewatch.stp
下载需要用到的脚本
5、stap inodewatch.stp 202 1 920087
开始监控指定文件
测试:cat conf.n
cat(25149) vfs_read 0xca00001/920087
cat(25149) vfs_read 0xca00001/920087
可以看到哪个命令、进程号访问了指定的文件

执行stap时,如果报错,错误内容为找不到系统debug库之类的,需要安装debuginfo库:

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse
" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
apt-get updateapt-get install linux-image-$(uname -r)-dbgsym
centos下:
yum install systemtap kernel-devel debuginfo-install kernel