双网卡配置路由规则 同时访问内外网

Q:同时连接2个网络(比如内网和外网,内网不能访问外网资源),访问所有网络资源时只会走内网/外网,现在想要默认走外网,而某些IP(内网资源)走内网

A:使用路由(指定某个范围IP走特定的网关(网卡))

route 部分命令: route print -4 : 打印当前的IPV4路由表 route delete:删除一条路由 eg:删除某一条路由:route delete 0.0.0.0 mask 0.0.0.0 192.168.1.1 route add: 增加一条路由, 如果最后加上 –p 选项,表示永久增加静态路由,重启后不会失效 route change: 更改一条路由 eg:route change 0.0.0.0 mask 0.0.0.0 192.168.1.1 metric 35 -p

1 先查看本地路由表:
route print -4

字段解释:

Interface List: 网络卡列表 Active Routes: 活动路由 Network Destination: 目的网段(就是IP地址,与掩码一起构成网段) Netmask: 子网掩码,与 目的网段 共同定义了此条路由适用的网络地址范围 Gateway: 网关,又称下一跳路由器,在发送IP数据包时,网关定义了针对特定的网络目的地址,数据包发送到的下一跳服务器 Interface: 接口,本机对应的IP Metric:可以理解为优先级,从1开始,越高优先级越低。比如上图,目的网段0.0.0.0(表示所有网络请求)配置了2条路由规则,但是172的metric小,表示优先级更高,网络请求优先走172

Persistent Routes : 手动配置的永久性路由规则,上图配置了10.78.115.0网段,掩码是255.255.255.0,优先级为1(最高),表示10.78.115.1/254的IP都走10.77.36.1这个网关

2 增加路由规则
例如:10.78.115.1 到 10.78.115.254 的IP走 10.77.36.1 这个网关(-p 重启后仍然存在):

route add 10.78.115.0 mask 255.255.255.0 10.77.36.1 metric 1 -p

注:需要用管理员权限,如果metric参数报错,可以去掉:route add 10.78.115.0 mask 255.255.255.0 10.77.36.1 -p

3 删除路由规则:
例如: 删除所有 network Destination是127.0.0.1的:route delete 127.0.0.1;

route delete 10.78.115.0
### 访问百度 ERR_SSL_PROTOCOL_ERROR 报错
原文链接:https://blog.csdn.net/qq_35720307/article/details/90298635

cmake 与 动/静态链接库

如果使用gcc进行单个c文件编译的时候,有时候后面会需要添加如-L -l之类的参数,如下

gcc -o test test.c -L/usr/local/lib/ -lopencv

这里-L是制定动态库的位置,-l则是指定打算连接的动态库名字。

那么在进行项目编译的时候就需要通过cmake来通过Cmakelist.txt引导make进行项目编译。

那么就需要在cmakelists.txt文件内添加动态链接库的配置,具体参数如下

1、首先申明动态库的位置

LINK_DIRECTORIES({your_library_path})
例:

LINK_DIRECTORIES(/usr/local/lib)

2、然后制定具体的动态库的名称

target_link_libraries(${PROJECT_NAME} -l{library_name})
例:指定hiredis的动态链接文件 libhiredis.so

target_link_libraries(${PROJECT_NAME} -lhiredis)

注:同名同路径的动态库与静态库,优先链接动态库,找不到动态库再链接静态库

出现 "undefined reference to" 时,可能是找不到库,可使用locate查找系统库路径 新安装的库需要使用 ldconfig 刷新;还有可能是没有指定链接库名(ubuntu系统)

查看程序依赖的动态库

  • $ ldd /path/to/program
  • $ objdump -p /path/to/program | grep NEEDED
  • $ sudo pldd (运行中程序)
  • $ sudo pmap

参考:https://blog.csdn.net/weixin_34984088/article/details/116742781

查看动静态库包含的文件、函数

  1. 查看文件:ar -t *.a
  2. 查看文件、函数、变量:nm *.a
  3. 命令 objdump -tT
  4. readelf

参考:https://blog.csdn.net/ZHI11235813/article/details/98884857

ubuntu 20.04 切换gcc-4.8

1.使用如下命令修改源

    $ sudo vim /etc/apt/sources.list

2.在打开的文件中添加如下源(在最后面加上这两行即可)

deb http://dk.archive.ubuntu.com/ubuntu/ xenial maindeb http://dk.archive.ubuntu.com/ubuntu/ xenial universe

3.使用如下命令更新源

    $ sudo apt update

4.使用命令安装g++4.8、gcc4.8

sudo apt install g++-4.8
sudo apt install gcc-4.8

5.切换版本

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50

参考:

https://blog.csdn.net/ran337287/article/details/73733476

https://www.codeleading.com/article/10112516638/

protobuf 版本冲突解决方案

1、查看当前protoc版本:protoc --version

# protoc --version
libprotoc 3.19.4

2、查看proto生成的.h文件的编译器版本

#if GOOGLE_PROTOBUF_VERSION < 3001000
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please update
#error your headers.
#endif
#if 3001000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
#error This file was generated by an older version of protoc which is
#error incompatible with your Protocol Buffer headers.  Please
#error regenerate this file with a newer version of protoc.
#endif

3、查看系统包含的protobuf库文件:ldconfig -p | grep libprotobuf.so

# ldconfig -p | grep libprotobuf.so
        libprotobuf.so.30 (libc6,x86-64) => /usr/local/lib/libprotobuf.so.30
        libprotobuf.so.11 (libc6,x86-64) => /root/miniconda3/envs/d2l/lib/python3.7/site-packages/tushare/subs/ht_subs/com/libs/linux/libprotobuf.so.11
        libprotobuf.so (libc6,x86-64) => /usr/local/lib/libprotobuf.so

步骤一二即能确认版本是否兼容,不兼容需要卸载现有protoc,安装生成现有.h 版本的protoc

卸载源码手动安装的 protobuf

# make uninstall
Making uninstall in .
make[1]: Entering directory `/root/app/protobuf-3.19.4'
 ( cd '/usr/local/lib/pkgconfig' && rm -f protobuf.pc protobuf-lite.pc )
make[1]: Leaving directory `/root/app/protobuf-3.19.4'
Making uninstall in src
make[1]: Entering directory `/root/app/protobuf-3.19.4/src'

安装新版本protobuf

$ cd protobuf-3.1.0/
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.

一招轻松解决云服务器SSH自动断连

问题

在通过 SSH 连接云服务器的时候,都会遇到闲置一段时间后就自动断开的情况,非常让人恼火。

网上给的方法都是去修改 sshd 的配置,麻烦不说,有时还没效果。

我在实践中发现,其实只要安装 tmux 就可完美解决这个问题,不但方便有效,还有附加功能。

安装

安装 tmux 非常方便:

# Ubuntu 或 Debian
$ sudo apt-get install tmux
# CentOS 或 Fedora
$ sudo yum install tmux

傻瓜式用法

安装完成后,通过任意ssh客户端登录到服务器之后,键入 tmux 命令,就进入了 Tmux 窗口。

image-20210515162815882.png

在这个 Tmux 窗口中,正常操作即可。

不用做任何操作,包含这个 Tmux 窗口的 SSH 会话不会再自动断开了!

如果想要退出,执行 exit 就可以退回到初始的 ssh 会话。

$ exit

就是这么简单。甚至没有用到 Tmux 的会话保持功能。

会话保持的意义

直接关闭 SSH 窗口,其中的 Tmux 会话也不会断掉,在下次连接时执行 tmux attach 命令再次连上会话。

也就是说,现在不但在闲置的时候不会自动断开连接,SSH 客户端主动断开都没事。换句话说,现在本地的电脑掉电断网正常关机都没关系,云服务器上的任务会继续执行,最大化利用云服务器 24 小时不停机的特点。

这才是 tmux 工具真正的作用。

本文不打算详细介绍 tmux 命令的使用了,有兴趣了解的可以在网上搜索下,教程已经很多了。

总之,和云服务器打交道,tmux 是我第一推荐的必备工具。

tmux是一个终端复用器,它允许你在单个终端窗口中创建多个会话并管理它们。它提供了许多功能,如在后台运行会话、分割窗格、在会话之间切换等。

使用tmux,你可以在一个终端窗口中同时运行多个程序或会话,而无需打开多个终端窗口。这对于同时管理多个任务或会话非常有用,尤其是在远程连接或服务器上工作时。

以下是一些常用的tmux命令:

  • tmux new-session:创建一个新的tmux会话。
  • tmux attach-session -t <会话编号>:附加到指定的tmux会话。
  • tmux switch-client -t <会话编号>:切换到指定的tmux会话。
  • tmux list-sessions:列出所有的tmux会话。
  • tmux split-window:在当前窗格中水平分割一个新窗格。
  • tmux split-window -v:在当前窗格中垂直分割一个新窗格。
  • tmux select-pane -[UDLR]:在窗格之间切换焦点。
  • tmux detach-client:从当前tmux会话中分离。

这只是一小部分tmux命令的示例,tmux还有更多功能和选项,你可以通过查阅tmux的文档来了解更多信息。