<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Ganing&#39;s 部落格</title>
    <link>/tags/Linux/</link>
    <description>Recent content in Linux on Ganing&#39;s 部落格</description>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Wed, 28 Feb 2024 09:56:14 +0800</lastBuildDate><atom:link href="/tags/Linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>常用命令</title>
      <link>/2024/02/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link>
      <pubDate>Wed, 28 Feb 2024 09:56:14 +0800</pubDate>
      
      <guid>/2024/02/%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid>
      <description>AT指令(EC20) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50  1.嵌入式中使用AT指令;必须无校验位 echo -e &amp;#34;AT+CPIN?\r&amp;#34; |busybox microcom -s 115200 /dev/ttyO4 -t 1000 echo -e &amp;#34;AT+CPIN?\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+CSQ\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+COPS?\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+QCFG=?\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 # 显示使用频段 echo -e &amp;#34;AT+QNWINFO\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+CREG?\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+QOPSCFG=\&amp;#34;scancontrol\&amp;#34;,3\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#34;AT+QOPS\r&amp;#34; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo -e &amp;#39;AT+CCID\r&amp;#39; |busybox microcom -s 115200 /dev/ttyUSB2 -t 1000 echo &amp;#34;AT+CSQ&amp;#34; |busybox microcom -s 115200 /dev/ttyO4 -t 1000 echo -e &amp;#34;AT+CPIN?</description>
    </item>
    
    <item>
      <title>NAT 笔记</title>
      <link>/2022/01/NAT-%E7%AC%94%E8%AE%B0/</link>
      <pubDate>Tue, 11 Jan 2022 11:57:35 +0800</pubDate>
      
      <guid>/2022/01/NAT-%E7%AC%94%E8%AE%B0/</guid>
      <description>iptables NAT规则 NAT表需要的三个链：
1.PREROUTING:可以在这里定义进行DNAT的规则，因为路由器进行路由时只检查数据包的目的ip地址，所以为了使数据包得以正确路由，我们必须在路由之前就进行DNAT;
2.POSTROUTING:可以在这里定义进行SNAT的规则，系统在决定了数据包的路由以后在执行该链中的规则。
3.OUTPUT:定义对本地产生的数据包的DNAT规则。
需要用到的几个动作选项：（真实环境中用大写）
   类型 描述     REDIRECT 将数据包重定向到另一台主机的某个端口，通常用实现透明代理和对外开放内网某些服务。   SNAT 源地址转换，改变数据包的源地址   DNAT 目的地址转换，改变数据包的目的地址   MASQUERADE IP伪装，只适用于ADSL等动态拨号上网的IP伪装，如果主机IP是静态分配的，就用SNAT      PRERROUTING:DNAT、REDIRECT （路由之前）只支持-i，不支持-o。在作出路由之前，对目的地址进行修改
  POSTROUTING:SNAT、MASQUERADE （路由之后）只支持-o，不支持-i。在作出路由之后，对源地址进行修改
  OUTPUT:DNAT 、REDIRECT （本机）DNAT和REDIRECT规则用来处理来自NAT主机本身生成的出站数据包.
  一、打开内核的路由功能。
1 2 3  [root@localhost]# cat /etc/sysctl.conf  net.ipv4.ip_forward=1 [root@localhost]# sysctl -p   二、nat不同动作的配置
 MASQUERADE：是动态分配ip时用的IP伪装：在nat表的POSTROUTING链加入一条规则:所有从ppp0口送出的包会被伪装（MASQUERADE）  1  [root@localhost]# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE   SNAT:一般正常共享上网都用的这个。  所有从eth0（外网卡）出来的数据包的源地址改成61.99.28.1（这里指定了一个网段，一般可以不指定）
1  [root@localhost]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1   DNAT:目的nat 做智能DNS时会用到  智能DNS：就是客户端在dns项里无论输入任何ip，都会给他定向到服务器指定的一个dnsip上去。
在路由之前所有从eth0（内网卡）进入的目的端口为53的数据包，都发送到1.2.3.4这台服务器解析。
1  [root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53   REDIRECT：重定向，这个在透明代理时肯定要用到它  所有从eth1进入的请求80和82端口的数据，被转发到80端口，由squid处理。
1  [root@localhost]# iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80   三、保存配置规则</description>
    </item>
    
    <item>
      <title>修改Linux进程名称</title>
      <link>/2018/04/%E4%BF%AE%E6%94%B9Linux%E8%BF%9B%E7%A8%8B%E5%90%8D%E7%A7%B0/</link>
      <pubDate>Thu, 26 Apr 2018 23:13:58 +0000</pubDate>
      
      <guid>/2018/04/%E4%BF%AE%E6%94%B9Linux%E8%BF%9B%E7%A8%8B%E5%90%8D%E7%A7%B0/</guid>
      <description>先说说需求，原来的业务程序使用单进程多线程结构，守护使用的shell脚本，工作起来倒是没有什么大的问题。直到某处远程升级后出现小小的配置问题，进程运行就死掉，看门狗没人喂，守护脚本又判断不了出了什么问题，只是傻傻的重启。我只好想象着它一遍遍的重启，然后驱车300KM，到现场1分钟解决问题，白白花费了大半日功夫，一路风吹日晒。为了满足自己宅在办公室就能操控世界的伟大理想，我决定想个办法解决一下。最简单的就是自己fork来监控进程状态啦，为了保存旧的兼容性，脚本只允许一个同名进程，只好牺牲下自己，改个名欢快地跑起来。
网上传的最多的就是：
法一：
1  int prctl(PR_SET_NAME, name);   通过这个函数可以将当前进程的名称修改为 name 的内容。高高兴兴的改完，ps一下，名字还是一样的呢&amp;hellip;&amp;hellip;经过一番搜索，/proc/$pid/stat等几个文件里面名字确实变了。某文章看到只有使用 ps -L 才能看到，达不到想要的效果。
法二：
父子进程管理，nginx一直做的很棒，它家的进程名字都自带小尾巴。代码中有名为set_proctitle函数用来修改进程名。一搜果然出来一些分析博文，linux的ps命令实际是以argv[0]处的值来作为进程的title的，因此只需要修改argv[0]处的值即可。原理如下图，一图胜千言。
 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45  #include &amp;lt;stdarg.h&amp;gt;#include &amp;lt;sys/prctl.h&amp;gt;#define MAXLINE 2048 extern char **environ; static char **g_main_argv = NULL; /* pointer to argument vector */ static char *g_main_last_argv = NULL; /* end of argv */ //备份原始变量，以免修改argv[0]的时候覆盖了environ变量 void setproctitle_init(int argc, char **argv, char **envp) { int i; //计算环境变量链表长度，重新申请空间，然后把变量字符串也拷贝过去  for(i = 0; envp[i] != NULL; i++) // calc envp num  continue; environ = (char **) malloc(sizeof(char *) * (i + 1)); // malloc envp pointer  for(i = 0; envp[i] != NULL; i++) { environ[i] = (char*)malloc(sizeof(char) * strlen(envp[i])); strcpy(environ[i], envp[i]); } environ[i] = NULL; g_main_argv = argv; if(i &amp;gt; 0) g_main_last_argv = envp[i - 1] + strlen(envp[i - 1]); else g_main_last_argv = argv[argc - 1] + strlen(argv[argc - 1]); } void setproctitle(const char *fmt, .</description>
    </item>
    
    <item>
      <title>Linux多个私钥匹配</title>
      <link>/2015/06/Linux%E5%A4%9A%E4%B8%AA%E7%A7%81%E9%92%A5%E5%8C%B9%E9%85%8D/</link>
      <pubDate>Mon, 15 Jun 2015 11:23:41 +0000</pubDate>
      
      <guid>/2015/06/Linux%E5%A4%9A%E4%B8%AA%E7%A7%81%E9%92%A5%E5%8C%B9%E9%85%8D/</guid>
      <description>添加永久有效的SSH KEY 虽然ssh-add 命令可以添加key，但是只能保存在当前会话中，如果重启会话，要使用这个可以，就需要重新添加了。我不吐槽这个设计，因为可能有人是会用到的。比如如果key添加多了，又不限定匹配对象，会每一个key都试一下，大大的降低效率。 一个简单的方法就是：配置~/.ssh/config，参考默认配置/etc/ssh/ssh_config
Host github HostName github.com Port 22 User git IdentityFile ~/.ssh/githubKey 如此就能够保存了。要是所有用户都生效就修改/etc/ssh/ssh_config</description>
    </item>
    
  </channel>
</rss>
