<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Shell on Eason Yang&#39;s Blog</title>
    <link>https://easonyang.com/tags/shell/</link>
    <description>Recent content in Shell on Eason Yang&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 18 Sep 2016 08:55:26 +0000</lastBuildDate>
    <atom:link href="https://easonyang.com/tags/shell/atom.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>自动安装与升级chacha20(libsodium)</title>
      <link>https://easonyang.com/2016/09/18/automatically-install-or-update-libsodium-for-chacha20/</link>
      <pubDate>Sun, 18 Sep 2016 08:55:26 +0000</pubDate>
      <guid>https://easonyang.com/2016/09/18/automatically-install-or-update-libsodium-for-chacha20/</guid>
      <description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;由于我经常要用到 chacha20 这种加密方式，而目前稳定版本的 openssl 等都不自带这个包，所以每次配置新的服务器都要手动装一遍，实在是浪费人生。索性直接写个小脚本来自动安装与升级。&lt;/p&gt;&#xA;&lt;h2 id=&#34;使用&#34;&gt;使用&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;git clone https://github.com/MrEasonYang/shell-boy&lt;/code&gt; 后，cd 到 shell/auto-chacha20 目录中，&lt;code&gt;chmod +x auto-chacha20.sh&lt;/code&gt; ，然后 &lt;code&gt;./auto-chacha20.sh&lt;/code&gt; 运行即可。由于默认配置下，不用做 Nginx 安装脚本中那样备份等操作，所以更新时实际上仍然是运行 &lt;code&gt;./auto-chacha20.sh&lt;/code&gt; ，加入 crontab 中就可以实现定期自动更新了，如加入 &lt;code&gt;0 2 * * 3 /home/user/auto-chacha20 2&amp;gt;&amp;amp;1 | tee -a /home/user/auto-chacha20/log&lt;/code&gt; ，即可实现每周三的凌晨两点检查更新。&lt;/p&gt;&#xA;&lt;h2 id=&#34;兼容性&#34;&gt;兼容性&lt;/h2&gt;&#xA;&lt;p&gt;在 CentOS 7.2 、Ubuntu 14.04 、Ubuntu 16.04 中测试正常。&lt;/p&gt;&#xA;&lt;h2 id=&#34;获取最新版本版本号&#34;&gt;获取最新版本版本号&lt;/h2&gt;&#xA;&lt;p&gt;chacha20 的安装实际上就是编译安装 libsodium ，所以我们要设法获取到最新版本的版本号。在官网的 &lt;a href=&#34;https://download.libsodium.org/libsodium/releases/&#34;&gt;下载页面&lt;/a&gt; 观察一下就可以发现，这个列表与我之前在 &lt;a href=&#34;https://easonyang.com/2016/07/22/automatically-install-or-update-nginx-with-customed-compile-options/&#34;&gt;以自定义参数自动编译安装或升级Nginx脚本&lt;/a&gt; 中分析 Nginx 官网下载页面的形式是完全一样所以直接借鉴 Nginx自动安装脚本代码来获取最新版本的版本号。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用 Shell Script 将程序添加到 Linux Service 并设置为开机启动</title>
      <link>https://easonyang.com/2016/07/23/set-a-program-as-service-and-put-it-on-startup-in-linux/</link>
      <pubDate>Sat, 23 Jul 2016 13:17:37 +0000</pubDate>
      <guid>https://easonyang.com/2016/07/23/set-a-program-as-service-and-put-it-on-startup-in-linux/</guid>
      <description>&lt;h2 id=&#34;创建一个简单的测试脚本&#34;&gt;创建一个简单的测试脚本&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#! /bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;date&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;tee -a /program_log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; in&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    start&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /program_log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    stop&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;stop&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /program_log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    *&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Wrong command&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /program_log&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;esac&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;保存到 /program 然后 &lt;code&gt;chmod +x /program&lt;/code&gt; ，并在根目录创建 program_log。这个程序会将当前时间追加到 /program_log 中，同时输出执行程序时输入的命令参数。执行 &lt;code&gt;/program start&lt;/code&gt; 后可以看到 /program_log 中出现了时间和命令参数。&lt;/p&gt;</description>
    </item>
    <item>
      <title>判断 Linux 发行版版本</title>
      <link>https://easonyang.com/2016/07/23/get-linux-distribution-in-shell-script/</link>
      <pubDate>Sat, 23 Jul 2016 13:03:19 +0000</pubDate>
      <guid>https://easonyang.com/2016/07/23/get-linux-distribution-in-shell-script/</guid>
      <description>&lt;p&gt;关于这个问题，有许多解决方案，首先可以使用&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat /etc/issue&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;结果类似于这样：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CentOS release 6.6 (Final)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Kernel \r on an \m&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然而我在 CentOS 7 中使用时只显示&lt;/p&gt;</description>
    </item>
    <item>
      <title>以自定义参数自动编译安装或升级Nginx脚本</title>
      <link>https://easonyang.com/2016/07/22/automatically-install-or-update-nginx-with-customed-compile-options/</link>
      <pubDate>Fri, 22 Jul 2016 22:12:25 +0000</pubDate>
      <guid>https://easonyang.com/2016/07/22/automatically-install-or-update-nginx-with-customed-compile-options/</guid>
      <description>&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;&#xA;&lt;p&gt;之前偷懒直接在 VPS 上改了 repo 参数后用yum安装与更新 nginx，导致后期希望添加自选模块时遇到了困难。虽然可以采用 &lt;a href=&#34;http://anyof.me/articles/236&#34;&gt;为 yum 安装的 Nginx 添加模块&lt;/a&gt; 这里的方法为 yum 或者 apt 等方法成功安装的 Nginx 添加新的模块，但是在 yum 自动更新 nginx 后，又会回到二进制 nginx 安装包的默认编译参数，丢失之前新添加的模块选项。综上所述，目前只能通过再次编译安装的方式来升级 nginx 才能保证能正常使用自选模块。以下脚本将自动化该操作。&lt;/p&gt;&#xA;&lt;h1 id=&#34;兼容性&#34;&gt;兼容性&lt;/h1&gt;&#xA;&lt;p&gt;在 CentOS 7.2 、Ubuntu 14.04 、Ubuntu 16.04 中测试正常。&lt;/p&gt;&#xA;&lt;h1 id=&#34;配置&#34;&gt;配置&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;git clone https://github.com/MrEasonYang/shell-boy&lt;/code&gt; 后，cd 到 auto-nginx 目录中，执行&lt;code&gt;chmod +x auto-nginx&lt;/code&gt;即可完成初始化。随后在配置文件 config 中按需自行配置。配置文件以英文分号 ; 分隔，每个选项和值之间用无空格英文冒号分隔 。&lt;/p&gt;&#xA;&lt;p&gt;配置选项包括：&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用PowerShell及Shell实现将子目录中的所有指定类型文件批量复制到其他目录</title>
      <link>https://easonyang.com/2016/07/03/automatically-copy-files-from-various-subdirectory-with-shell-and-powershell/</link>
      <pubDate>Sun, 03 Jul 2016 14:36:50 +0000</pubDate>
      <guid>https://easonyang.com/2016/07/03/automatically-copy-files-from-various-subdirectory-with-shell-and-powershell/</guid>
      <description>&lt;p&gt;最近有个小需求，需要在 windows 系统下，把 mobi 格式的电子书文件从不同子目录里拷贝到同一目录中，由于微软的 Bash for windows 还没出正式版，所以这里先用 PowerShell 解决。&lt;/p&gt;&#xA;&lt;p&gt;首先用 Dir 命令遍历所有子目录获取 mobi 文件：&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;$data = Dir C:\data -filter *.mobi -recurse&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;-recurse 参数会递归地遍历 C:\data 下的子目录，寻找 -filter 所定义的所有以 mobi 为后缀的文件，将结果存入变量 data 中。&lt;/p&gt;</description>
    </item>
    <item>
      <title>批量踢出离线Linux用户脚本</title>
      <link>https://easonyang.com/2016/06/17/remove-offline-user-shell/</link>
      <pubDate>Fri, 17 Jun 2016 16:50:08 +0000</pubDate>
      <guid>https://easonyang.com/2016/06/17/remove-offline-user-shell/</guid>
      <description>&lt;p&gt;今天折腾VPS的时候发现有一台装着CentOS 7的VPS使用uptime命令时竟然提示已登录了90多个用户。w命令查看一下发现都是我一直使用的账户，登录IP也与本机的相符，前几个已登陆用户的空闲时间已经好几十天了，猜测可能是断开SSH的时候没有正常退出造成的。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
