Linux wiki

Table of Contents

1 DONE 使用percol配置文件管理器。

  • State "DONE" from "DONE" [2014-11-09 日 17:02]
    percol支持正则表达式还没有结果!!

据说这个是终极文件管理器?刚配置好开始使用。用一段时间再写。

1.0.1 主要讲解在ubuntu 14.04中怎么配置:

这个东西是python写的。我直接在ubuntu上使用:

  sudo apt-get install python-pip

安装了pip之后。pip(install python package)使用:

  pip install percol

安装上了percol。还可以手动安装。具体可以参考这里

然后根据网上的How to do the file navigation efficiently,在.bashrc中加 入这两个函数:

  [ $(uname -s | grep -c CYGWIN) -eq 1 ] && OS_NAME="CYGWIN" || OS_NAME=`uname -s`
  function pclip() {
      if [ $OS_NAME == CYGWIN ]; then
          putclip $@;
      elif [ $OS_NAME == Darwin ]; then
          pbcopy $@;
      else
          if [ -x /usr/bin/xsel ]; then
              xsel -ib $@;
          else
              if [ -x /usr/bin/xclip ]; then
                  xclip -selection c $@;
              else
                  echo "Neither xsel or xclip is installed!"
              fi
          fi
      fi
  }

  function ff()
  {
      local fullpath=$*
      local filename=${fullpath##*/} # remove "/" from the beginning
      filename=${filename##*./} # remove  ".../" from the beginning
      echo file=$filename
      #  only the filename without path is needed
      # filename should be reasonable
      local cli=`find $PWD -not -iwholename '*/target/*' -not -iwholename '*.svn*' -not -iwholename '*.git*' -not -iwholename '*.sass-cache*' -not -iwholename '*.hg*' -type f -iwholename '*'${filename}'*' -print | percol`
      echo ${cli}
      echo -n ${cli} |pclip;
  }

然后就可以在bash中使用ff来查找当前目录下的东西了。可以在.emacs.d中使用 ff el试一下。

其实ff主要还是调用了percol。percol才是真的强。它可以用与管道中接收标准 输入然后给你一个过滤的窗口。也可以直接接文件作为参数。然后过滤其中的 文本。

ff中还调用了自己写的一个pclip函数。目的是每次filter出来的东西就自动加 入到了系统剪切板中了。很方便。这需要使用xsel或者xclip这种工具。在linux 下不成问题。

Question


  1. 使用ff的时候,如果当前目录内容太多。或者有权限不足的错误的时候,会 出现问题
  2. percol中不支持正则表达式。暂时没有能力定制。

Solved


  1. 其实是ff函数中find中的问题。直接在find中把错误输出到/dev/null就行了。
  function ff()
  {
      local fullpath=$*
      local filename=${fullpath##*/} # remove "/" from the beginning
      filename=${filename##*./} # remove  ".../" from the beginning
      echo file=$filename
      #  only the filename without path is needed
      # filename should be reasonable
      local cli=`find $PWD -not -iwholename '*/target/*' -not -iwholename '*.svn*' -not -iwholename '*.git*' -not -iwholename '*.sass-cache*' -not -iwholename '*.hg*' -type f -iwholename '*'${filename}'*' -print 2>/dev/null | percol `
      echo ${cli}
      echo -n ${cli} |pclip;
  }

<2014-11-08 六 21:20>

2 使用pgrep可以更好的找到正在运行的程序

  pgrep -l emacs

3 配置hostapd共享无线网络   hostapd

参考的 这里这里

其中第一篇是使用dhcp的,第二篇是使用dnsmasq。我是使用dnsmasq配置成功的。

必要条件是你的无线网卡一定要能支持AP的功能,使用下面的命令查询一下:

  iw list

输出中有这样的:

          Supported interface modes:
                   * IBSS
                   * managed
                   * AP
                   * AP/VLAN
                   * WDS
                   * monitor
                   * mesh point
          software interface modes (can always be added):
                   * AP/VLAN
                   * monitor
          valid interface combinations:
                   * #{ AP, mesh point } <= 4,
                     total <= 4, #channels <= 1

就是支持AP功能罗。

首先下载:dhcp,dnsmasq,hostapd。

hostapd的配置文件是这样的:

  interface=wlan0
  # driver=nl80211
  ssid=pengpengxp
  hw_mode=g
  channel=6
  macaddr_acl=0
  auth_algs=1
  ignore_broadcast_ssid=0
  wpa=3
  wpa_passphrase=1234567890
  wpa_key_mgmt=WPA-PSK
  wpa_pairwise=TKIP
  rsn_pairwise=CCMP

很明显,ssid和wpapassphrase分别是用户名和密码。设置好以后。可以保存该配置在任意文件中,我是保存在/etc/hostapd/hostapd.conf中的。然后可以使用命令

  hostapd /etc/hostapd/hostapd.conf

这时还不能上网,还需要做一个NAT转换。参考网面的作者写了个脚本:

  #!/bin/bash
  #Initial wifi interface configuration
  ifconfig $1 up 10.0.0.1 netmask 255.255.255.0
  sleep 2

  ###########Start dnsmasq, modify if required##########
  if [ -z "$(ps -e | grep dnsmasq)" ]
  then
      dnsmasq
  fi
  ###########

  #Enable NAT
  iptables --flush
  iptables --table nat --flush
  iptables --delete-chain
  iptables --table nat --delete-chain
  iptables --table nat --append POSTROUTING --out-interface $2 -j MASQUERADE
  iptables --append FORWARD --in-interface $1 -j ACCEPT

  #Thanks to lorenzo
  #Uncomment the line below if facing problems while sharing PPPoE, see lorenzo's comment for more details
  #iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

  sysctl -w net.ipv4.ip_forward=1

  #start hostapd
  hostapd /etc/hostapd/hostapd.conf 1> /dev/null
  # hostapd -B /etc/hostapd/hostapd.conf 
  killall dnsmasq

保存为pstarthostapd.sh。在pppoe拔上号情况下,使用:

  p_start_hostapd.sh wlan0 ppp0

然后就可以使用啦。

3.0.1 出现过的错误

使用第一种方法配置出来不能正常上网。使用第二种方法,网上说不能有太多的设备连接。我本来使用的就不多,这就OK啦。

中途还出现本来hostapd configfile能开启的。突然就不行了。网上发现是NetworkManager开启了以后,它接管了网络管理。hostapd不能对网卡进行配置。我直接kill还不行,总是会重复出现,最后直接删掉了。

会出现一直验证用户名。登录不上的情况。

3.0.2 TODO 使用wpa加密方式用户名验证不能通过

我直接没有要密码了。使用静态IP的方式来上。本来也就是进行一个补充的。最后hostapd的配置如下:

  interface=wlan0
  driver=nl80211
  ssid=pengpengxp
  hw_mode=g
  channel=6
  macaddr_acl=0
  auth_algs=1
  ignore_broadcast_ssid=0

  #wpa=3
  #wpa_passphrase=1234567890
  #wpa_key_mgmt=WPA-PSK
  #wpa_pairwise=TKIP
  #rsn_pairwise=CCMP

就不加密了。但是要手动配置默认的网关。将就用吧。

4 xrandr设置linux分辨率

5 ubuntu 安装virtualbox第三方增强

     sudo apt-get install virtualbox-guest-utils
      xrandr --output VGA-0 --mode 1920x1440

6 linux下显示dd命令的进度:

dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法:

比如:每5秒输出dd的进度

方法一:

watch -n 5 pkill -USR1 ^dd$ 方法二:

watch -n 5 killall -USR1 dd 方法三:

while killall -USR1 dd; do sleep 5; done 方法四:

while (ps auxww |grep " dd " |grep -v grep |awk '{print $2}' |while read pid; do kill -USR1 $pid; done) ; do sleep 5; done 上述四种方法中使用三个命令:pkill、killall、kill向dd命令发送SIGUSR1信息,dd命令进程接收到信号之后就打印出自己当前的进度。

7 enca change file encoding   enca

     # list supported charsets
     enca --list charsets
     # query file charset
     enca -L zh_cn filename
     # convert file to utf-8
     enca -L zh_cn -x utf-8 filename

8 mosh

安装完mosh后,需要配置一下防火墙,允许这些udp端口流量进来:

    sudo iptables -I INPUT 1 -p udp --dport 60000:61000 -j ACCEPT

最坑的是openstack环境这样的云中,是有网络安全组的。需要把安全组中的 端口也开放。

9 ubuntu配置开机启动

这里讲得还可以

这里start-mosh是一个脚本,开头的这些注释是 ubuntu16.04 需要加上的 所谓的 LSB信息 不加没法设置:

    #!/bin/bash
    ### BEGIN INIT INFO
    # Provides:          svnd.sh
    # Required-start:    $local_fs $remote_fs $network $syslog
    # Required-Stop:     $local_fs $remote_fs $network $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: starts the svnd.sh daemon
    # Description:       starts svnd.sh using start-stop-daemon
    ### END INIT INFO

    mosh-server

需要把该脚本放到 /etc/init.d/ 目录下:

设置开机启动:

    update-rc.d start-mosh defaults 90

取消开机启动:

    update-rc.d -f start-mosh remove

更加常见是应该是写一个这样的可以接 start, stop, restart 等参数的脚 本,比如配置开机自启动 vnc4server 时的这修脚本:

    #!/bin/bash

    USER="jenkins"

    case "$1" in
        start)
            echo "Starting vncserver for user '${USER}' on :2"
            su ${USER} -c "/usr/bin/vnc4server :2"
            ;;
        stop)
            echo "Stopping vncserver for user '${USER}' on :2"
            su ${USER} -c "/usr/bin/vnc4server -kill :2"
            ;;
        restart)
            $0 stop
            $0 start
            ;;
    esac
    exit 0

10 ubuntu配置ssh

10.1 允许root登陆

Simply adding a password for root is not enough for Ubuntu 14.04 Server.

You also need to edit /etc/ssh/sshd_config , and comment out the following line:

PermitRootLogin without-password Just below it, add the following line:

     PermitRootLogin yes

Then restart SSH:

service ssh restart

10.2 ssh login慢

有时候ssh登陆server的时候特别慢,要等半天。可能是server的原因,也可 能是client。当然,很多时候是server啦。查了一下 这里 。估计是dns相关 的。可以 add UseDNS no to /etc/ssh/sshd_config

10.3 client端

ssh使用 -p 选项可以指定去连接的server的端口。scp需要使用大写 -P

也可以在自己的 ~/.ssh/config 文件中这样写来指定用户名和端口。如下 就可以直接使用 ssh b 来访问:

     Host b
             Hostname 192.168.56.111
             User root
             Port 20160

10.4 只能使用公钥来登陆

我自己的电脑在局域网里面我只希望通过我的公钥来登陆,禁止通过输入用 户名密码来登陆。

需要把 /etc/ssh/sshd_config 中的这一项配置为no(默认是注释掉的):

     # Change to no to disable tunnelled clear text passwords
     PasswordAuthentication no

11 在一个多网卡机器上确定哪个网卡上面插着网线

现实中有这么一个需求:在台机器有多个网卡,需要配置某个网卡为静态ip。 但是给某个网卡插上网线后,如何知道在ubuntu系统中中对应的是哪个网卡呢?

可以使用 ethtool

    riversec@box:~$ ethtool eth0|grep Link
            Link detected: yes
    riversec@box:~$

为yes就是插着网线的。

在执行下面命令时,需要先把网卡都 up 起来,没有 up 起来的网卡,插 上网线灯都不会亮的。

    cd /sys/class/net
    for i in `ls`;do echo $i;ethtool $i|ip l set up dev $i; done

ubuntu下全部的网卡信息都在 /sys/class/net 下面。所以可以使用这个命 令直接全部查询出来,不过需要root权限哦:

    root@box:/sys/class/net# for i in `ls /sys/class/net/`;do echo $i; ethtool $i|grep Link;done
    eth0
            Link detected: yes
    eth1
            Link detected: yes
    eth2
            Link detected: yes
    lo
            Link detected: yes
    root@box:/sys/class/net#

12 给ubuntu安装boot loader(grub2)

一般都是安装grub2。

可以参考这里来搞

但是我在chroot的时候一直进不去。总是出现这样的错:

    chroot: failed to run command '/bin/bash': No such file or directory

开始以为是在新环境中找不到 /bin/bash ,于是把 /bin/ 目录也mount 到新环境中去:

    mkdir /mnt/bin
    mount --bind /bin /mnt/bin

这样还是不行,原来 /bin/bash 还需要一些动态库,也需要搞进去,可以 使用 ldd /bin/bash 来查看它需要哪些动态库及它们的地址。

    root@box:/tmp# ldd /bin/bash
            linux-vdso.so.1 =>  (0x00007ffd15725000)
            libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fc2057fa000)
            libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc2055f6000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc205230000)
            /lib64/ld-linux-x86-64.so.2 (0x000055abb8b54000)
    root@box:/tmp#

再把 liblib64 目录按照同样方法搞进去,终于可以chroot了。

13 ubuntu配置nic名字

有时候nic的名字不是eth0,可以这样来配置,写一个 /etc/udev/rules.d/70-net.rules 这样的文件:

    compute@compute13:/sys/class/net$ cat /etc/udev/rules.d/70-net.rules
    #
    # NIC mapping
    #
    # @author zhang jian ming
    #

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNELS=="0000:02:00.0", NAME="eth0"
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNELS=="0000:03:00.0", NAME="eth1"

    compute@compute13:/sys/class/net$ udevadm info -qpath /sys/class/net/eth0|grep KERNEL
    compute@compute13:/sys/class/net$ udevadm info -qpath -a /sys/class/net/eth0|grep KERNEL
        KERNEL=="eth0"
        KERNELS=="0000:02:00.0"
        KERNELS=="0000:00:1c.2"
        KERNELS=="pci0000:00"
    compute@compute13:/sys/class/net$ udevadm info -qpath -a /sys/class/net/eth1|grep KERNEL
        KERNEL=="eth1"
        KERNELS=="0000:03:00.0"
        KERNELS=="0000:00:1c.3"
        KERNELS=="pci0000:00"
    compute@compute13:/sys/class/net$

14 interface设置

/etc/network/interface 例子:

    auto eth0
    iface eth0 inet static
            address 192.168.57.100
            netmask 255.255.255.0
            post-up ip route add 0.0.0.0/0 via 192.168.57.1 dev eth0 || true
    auto eth1
    iface eth1 inet dhcp
    auto eth2
    iface eth2 inet static
            address 192.168.56.100
            netmask 255.255.255.0
    auto lo
    iface lo inet loopback

    dns-nameservers 7.7.7.7

15 pandoc

pandoc可以各种转格式,我主要使用它来转org文件。

从org主件转到markdown,在emacs中本身是支持的。但是转出来以后,在 github上table of content不能跳转。但是使用pandoc来转可以跳。

使用pandoc来实现 org->markdown ,看文档需要加入 --toc 来在生成的 markdown文件中加目录。实际使用还是不行,需要加上 -s -s 选项才行。

    pandoc -s -s -o kk.md --toc kk.org

pandoc还有一个 --reference-docx 选项。可以指定导出docx文件的格式。

注意是修改docx文件的样式而不是直接修改文字内容

这里 有一个使用指导。

15.1 编码问题

pandoc默认输入和输出都是使用utf-8编码,有时候输入不是utf-8编码时, 可以使用 iconv 来转一下:

用法: iconv [选项...] [文件...]
转换给定文件的编码。

 输入/输出格式规范:
  -f, --from-code=名称     原始文本编码
  -t, --to-code=名称       输出编码

 信息:
  -l, --list                 列举所有已知的字符集

 输出控制:
  -c                         从输出中忽略无效的字符
  -o, --output=文件        输出文件
  -s, --silent               关闭警告
      --verbose              打印进度信息

  -?, --help                 给出此帮助列表
      --usage                给出简要的用法信息
  -V, --version              打印程序版本号

长选项的强制或可选参数对对应的短选项也是强制或可选的。

要知道错误报告指令,请参看:
<http://www.debian.org/Bugs/>。
   

16 lvm

https://en.wikipedia.org/wiki/Logical_volume_management

lvm_architecture.png

基本的单元是PE,每个LV都指到许多PE就可以了。文章里面说的LE我没明白是 什么东西。

PV(physical volumes)是一个磁盘或者一个分区,需要使用 pvcreate XXX 来对该磁盘或分区创建一些元数据。这样 pvscan 才能找到它们。只 有 pvscan 扫出来的磁盘才可做lvm磁盘使用。

VG(volume group),可以把多个PV合到一个VG里面来使用。

LV(logical volume),在一个VG中可以分多个LV。每个LV对于OS来说就是一 个可用的分区。可以直接挂载使用。

    root@compute14:/home/compute# pvscan
      PV /dev/sdc1   VG vg_var          lvm2 [15.00 GiB / 0    free]
      PV /dev/sdb5   VG compute-vg      lvm2 [7.52 GiB / 0    free]
      PV /dev/sdb3   VG compute-vg      lvm2 [200.00 GiB / 0    free]
      PV /dev/sdb2   VG compute-vg      lvm2 [350.79 GiB / 0    free]
      Total: 4 [573.30 GiB] / in use: 4 [573.30 GiB] / in no VG: 0 [0   ]
    root@compute14:/home/compute#

一个个的PV就是每个磁盘啦。

    root@compute14:/home/compute# vgdisplay
      --- Volume group ---
      VG Name               vg_var
      System ID
      Format                lvm2
      Metadata Areas        1
      Metadata Sequence No  2
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                1
      Open LV               0
      Max PV                0
      Cur PV                1
      Act PV                1
      VG Size               15.00 GiB
      PE Size               4.00 MiB
      Total PE              3839
      Alloc PE / Size       3839 / 15.00 GiB
      Free  PE / Size       0 / 0
      VG UUID               EAeyML-nefF-Kudc-ciRI-FxIe-46cJ-BHWqef

      --- Volume group ---
      VG Name               compute-vg
      System ID
      Format                lvm2
      Metadata Areas        3
      Metadata Sequence No  7
      VG Access             read/write
      VG Status             resizable
      MAX LV                0
      Cur LV                2
      Open LV               2
      Max PV                0
      Cur PV                3
      Act PV                3
      VG Size               558.31 GiB
      PE Size               4.00 MiB
      Total PE              142927
      Alloc PE / Size       142927 / 558.31 GiB
      Free  PE / Size       0 / 0
      VG UUID               emnTms-wrXR-WZRS-MoW2-qev1-kGEr-Xf0Sll

    root@compute14:/home/compute#

上述例子有两个VG: compute-vgvg_var

    root@compute14:/home/compute# ls /dev/compute-vg/
    root  swap_1
    root@compute14:/home/compute#

compute-vg 分为两个LV: rootswap_1swap_1 是交换空间。 df 可以查出来 root LV是直接被挂载成了根:

    root@compute14:/home/compute# df -lh
    Filesystem            Size  Used Avail Use% Mounted on
    udev                  126G     0  126G   0% /dev
    tmpfs                  26G   35M   26G   1% /run
    /dev/compute-vg/root  546G   87G  437G  17% /
    tmpfs                 126G     0  126G   0% /dev/shm
    tmpfs                 5.0M     0  5.0M   0% /run/lock
    tmpfs                 126G     0  126G   0% /sys/fs/cgroup
    /dev/sdb1             472M  117M  331M  27% /boot
    cgmfs                 100K     0  100K   0% /run/cgmanager/fs
    tmpfs                  26G     0   26G   0% /run/user/1000

17 sort 来排列ip地址

一个网络,就第四个位不同:

    172.16.222.13
    172.16.222.10
    172.16.222.17
    172.16.222.1
    sort -n -t. -k 4

18 sudo不输密码

    echo 'password'|sudo -S command

19 查看cpu个数

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
    # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

    # 查看物理CPU个数
    cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

    # 查看每个物理CPU中core的个数(即核数)
    cat /proc/cpuinfo| grep "cpu cores"| uniq

    # 查看逻辑CPU的个数
    cat /proc/cpuinfo| grep "processor"| wc -l

20 ssh隧道

刚司机:

    如何在只映射了20160端口的情况下,在浏览器中完成配置向导

    启动微软云虚拟机(RAS镜像, 已经将20160端口做了端口映射)
    查看内部IP地址 和 公用虚拟IP(VIP)地址
    打开两个命令行终端
    分别执行命令
    ssh -p 20160 -L 20145:内部IP:20145 riversec@公用虚拟IP
    ssh -p 20160 -L 20146:内部IP:20146 riversec@公用虚拟IP

    例如
    内部IP地址10.0.1.4
    公用虚拟IP(VIP)地址139.219.185.47
    则在两个终端分别执行
    ssh -p 20160 -L 20145:10.0.1.4:20145 riversec@139.219.185.47
    ssh -p 20160 -L 20145:10.0.1.4:20145 riversec@139.219.185.47

    这样就建立了两个ssh隧道,将你本地的20146端口和虚拟机的20146端口映射起
    来,本地的20145端口和虚拟机的20145端口映射起来,

    这样你在浏览器中输入http://127.0.0.1:20146就可以走向导了(走完向导自动
    跳转还是失败的,手动输入https://127.0.0.1:20145可访问web console)

    要断开隧道链接请输入exit退出两个命令行终端即可

21 iperf测网速

    # server:首先在 Server 端,我们运行以下命令使 iPerf 监听 5001 端口,每
    # 2 秒输出一次结果。
    iperf -s -p 5001 -t 2
    # client:当终端显示 Server listening on 5001 时,就表示 Server 已经正
    # 常运行,等待测试了。 然后在 Client 端,我们并发 4 个数据流,测试总时
    # 长为 30 秒,每 2 秒输出一次结果。以下为测试所使用的命令。
    iperf  -c 172.16.222.10 -p 5001 -P 4 -t 30 -i 2

22 VirtualBox使用共享文件夹

默认Linux客户机中的用户是没有权限访问共享文件夹 /media/sf_xxx 。需 要加入到vboxsf这个组里。

    sudo usermod -aG vboxsf $(whoami)

可以把这些共享文件夹mount到自己希望的位置:

    sudo mount -t vboxsf New ~/new

23 date命令

常用的需要在脚本中使用date来生成今天的日期:

    date +'%m/%d/%Y'

23.1 使用date命令修改时间

     date -s '2017-06-19 10:30:00'
     hwclock --systohc

date设置的是系统时间,还有一个硬件时间可以用 hwclock 来查。

硬件时间是在启动的时候读入系统的,如果只用 date 设置了系统时间而 没有设置硬件时间,重启后应该时间应该还是原来的硬件时间。可以像上面 一样使用hwclock来根据系统时间刷新一下硬件时间。也可以根据硬件时间来 刷一下系统时间,查下 help 就知道了:

      -s, --hctosys        set the system time from the hardware clock
      -w, --systohc        set the hardware clock from the current system time

24 ps找程序

24.1 根据pid找parrent:

    ps -o ppid= 2072

24.2 TODO 根据pid找child:

25 sudo不输密码

使用 visudo 来编辑,然后在对应地方加入下面这句:

    username ALL=(ALL) NOPASSWD:ALL

26 asscii font

     ~/github/pengpengxp.github.io/ [master] figlet "xiepeng"
          _
    __  _(_) ___ _ __   ___ _ __   __ _
    \ \/ / |/ _ \ '_ \ / _ \ '_ \ / _` |
     >  <| |  __/ |_) |  __/ | | | (_| |
    /_/\_\_|\___| .__/ \___|_| |_|\__, |
                |_|               |___/
     ~/github/pengpengxp.github.io/ [master]

27 wget

    wget -r -p -np -k 

manual:


    -k
    --convert-links

    After the download is complete, convert the links in the document to
    make them suitable for local viewing.  This affects not only the
    visible hyperlinks, but any part of the document that links to
    external content, such as embedded images, links to style sheets,
    hyperlinks to non-HTML content, etc.

    Each link will be changed in one of the two ways:

    1) 

    The links to files that have been downloaded by Wget will be changed
    to refer to the file they point to as a relative link.

    Example: if the downloaded file /foo/doc.html links to /bar/img.gif,
    also downloaded, then the link in doc.html will be modified to point
    to ../bar/img.gif.  This kind of transformation works reliably for
    arbitrary combinations of directories.

    2) 

    The links to files that have not been downloaded by Wget will be
    changed to include host name and absolute path of the location they
    point to.

    Example: if the downloaded file /foo/doc.html links to /bar/img.gif
    (or to ../bar/img.gif), then the link in doc.html will be modified to
    point to http://hostname/bar/img.gif.

    Because of this, local browsing works reliably: if a linked file was
    downloaded, the link will refer to its local name; if it was not
    downloaded, the link will refer to its full Internet address rather
    than presenting a broken link.  The fact that the former links are
    converted to relative links ensures that you can move the downloaded
    hierarchy to another directory.

    Note that only at the end of the download can Wget know which links
    have been downloaded.  Because of that, the work done by -k will be
    performed at the end of all the downloads.

wget这样用很爽,可以直接把网站下载到本地,里面的链接也改为本地的了, 比如下载这样的一个网站:

    wget -r -p -np -k http://vpim.rubyforge.org/

28 十六进制表示说明

0xFF 表示一个字节。gdb中的x打出来的、wireshark中的和tcpdump中输出 的都是这种形式。因为一个十六进制数可以使用四个位表示,两个十六进制数 使用8位也就是一个字节就可以表示了。

29 配置vnc4server

安装:

    sudo apt-get install vnc4server xfce4 -y

直接启动会默认使用 :1 号display。

修改 ~/.vnc/xstartup ,让它最后启动 xfce4

    #!/bin/sh
    [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
    [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
    xsetroot -solid grey
    vncconfig -iconic &
    x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
    #x-window-manager &
    startxfce4 &

这个脚本一定要让它可执行:

chmod a+x ~/.vnc/xstartup  

放一个这样的脚本到 /etc/init.d/vncserver

!/bin/bash
#### BEGIN INIT INFO
# Provides:          pengpengxp
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# X-Stop-After:      kdm gdm3 xdm lightdm
# Default-Start:     2 3 4 5
# Default-Stop:      
### END INIT INFO

USER="pengpengxp"

case "$1" in
    start)
        echo "Starting vncserver for user '${USER}' on :2"
        su ${USER} -c "/usr/bin/vnc4server :2"
        ;;
    stop)
        echo "Stopping vncserver for user '${USER}' on :2"
        su ${USER} -c "/usr/bin/vnc4server -kill :2"
        ;;
    restart)
        $0 stop
        $0 start
        ;;
esac
exit 0

修改为可执行:

    sudo chmod a+x /etc/init.d/vncserver

先需要手动运行一下设置密码:

/usr/bin/vnc4server :2 

然后就可以启动服务:

    sudo service vncserver restart

设置开机启动:

    sudo update-rc.d vncserver defaults

问题

  1. [ ] 老是需要启动在 :2 上才可以, :1 就不行。搞不明白。

30 TODO cp命令你真的懂吗?

30.1 -a 选项

相关的东西都在这里:

    -a, --archive
           same as -dR --preserve=all
    -d     same as --no-dereference --preserve=links
    -P, --no-dereference
           never follow symbolic links in SOURCE
    --preserve[=ATTR_LIST]
           preserve the specified attributes (default: mode,ownership,timestamps), if possible additional attributes: context, links, xattr, all
    -R, -r, --recursive
           copy directories recursively

-a 选项什么属性都会保留,比如所属用户等。 例子:

    riversec@rcs:/tmp$ ll main.py
    -rw-rw-r-- 1 riversec riversec 52 Jun 12 14:35 main.py
    riversec@rcs:/tmp$ sudo cp main.py main.py_1
    riversec@rcs:/tmp$ sudo cp -a main.py main.py_2
    riversec@rcs:/tmp$ ll main.py*
    -rw-rw-r-- 1 riversec riversec 52 Jun 12 14:35 main.py
    -rw-r--r-- 1 root     root     52 Jun 13 16:06 main.py_1
    -rw-rw-r-- 1 riversec riversec 52 Jun 12 14:35 main.py_2
    riversec@rcs:/tmp$

可以看到,没有加 -a 参数,使用root来copy, main.py_1 的文件属生 和修改时间这些都改变了。而加上 -a 参数后, main.py_2 文件的属性 和原文件看起来是一样的。

另外, -a 还可以拷贝目录,和 -r 一样。

  1. [ ] 有一个问题,对应manual所说的 symbolic links ,我测试出来都 会复制。

30.2 -f 选项

如果目标有同样的文件,直接覆盖它。

30.3 -n 选项

不要覆盖已存在的文件。

31 TODO [0/1] 特殊的文件权限

31.1 st_uid

可以这样设置文件的 st_uid

   riversec@rcs:/tmp$ ll a.out
   -rwsr-xr-x 1 root root 8816 Jun 19 17:11 a.out*
   riversec@rcs:/tmp$

其作用在于:当执行此文件时,将进程的有效用户ID设置为文件所有者的用户 id。

举例:若文件的所有者是超级用户,而且设置了该文件的“设置用户ID位”, 然后当该程序由一个进程执行时,则该程序具有超级权限。这个最常见的例子 其实是 passwd 程序:每个用户都可以修改自己的密码,但是它又需要修改 /etc/passwd 这个属于root的文件。所以它需要使用“设置用户ID”的特征。

   riversec@rcs:/tmp$ ll /usr/bin/passwd
   -rwsr-xr-x 1 root root 54256 May 17 07:37 /usr/bin/passwd*

注意

  1. 权限提升,安全问题就得重视。
  2. 由于这是文件的特殊属性,这种特征只能用于二进制文件。脚本这些是不行的。

31.2 TODO st_gid

  • State "TODO" from [2017-06-19 一 17:14]

32 ubuntu下载一个软件所有依赖的包

这里 讲了如何下载到所有的安装包到一个目录:

一种解法是这样:

    # aptitude clean
    # aptitude --download-only install <your_package_here>
    # cp /var/cache/apt/archives/*.deb <your_directory_here>

但是如果你的机器是一台已经使用过很久的机器了。需要它可能已经安装了好 多软件了。这样可能下载不到最完的依赖,因为很多软件已经安装了就不会再 下载了。

需要先安装 apt-rdepends

    sudo apt-get install apt-rdepends
    apt-get download $(apt-rdepends <package>|grep -v "^ ")

这样会有些报错。可能有些包没有对应的下载的地方。

这里 有人写了这样的脚本来忽略这些下载不到的包:

    #!/bin/bash
    export MAXPARAMETERS=255

    function array_contains_find_index() {
        local n=$#
        local i=0
        local value=${!n}

        for (( i=1; i < n; i++ )) { 
            if [ "${!i}" == "${value}" ]; then
                echo "REMOVING $i: ${!i} = ${value}"
                return $i
            fi
        }
        return $MAXPARAMETERS
    }

    function Pause() { 
        if [[ -z $1 ]]; then
                read -n1 -r -p "continue..." 
        else
                read -n1 -r -p "$1" 
        fi
    }

    export IFS=$'\n'
    # Store all reverse dependencies in an indexed array and output them to STDOUT & a log file 
    # for easy checking later
    LIST=( $( apt-rdepends $1 | grep -v "^ " ) )
    echo ${LIST[*]}
    echo ${LIST[*]} > getdepends.log.results
    Pause "... Packages that will be downloaded (Continue or CTRL+C) ..."

    # Try to download the dependencies
    RESULTS=( $( apt-get download ${LIST[*]} |& cut -d' ' -f 8 ) ) 

    # If RESULTS contains any items that means we have packages that are
    # problematic that need to be removed from LIST. (note: `|&` is shortform for `2>&1 |`)

    LISTLEN=${#LIST[@]}                                     #Array elements aren't removed so the size is constant

    while [ ${#RESULTS[@]} -gt 0 ]; do
        for (( i=0; i < $LISTLEN; i++ )); do
                array_contains_find_index ${RESULTS[@]} ${LIST[$i]}
                ret=$?

                if (( $ret != $MAXPARAMETERS )); then
                    unset LIST[$i]
                fi
        done

        FULLRESULTS=$( apt-get download ${LIST[*]} 2>&1  )
        RESULTS=( $( echo $FULLRESULTS |& cut -d' ' -f 11 | sed -r "s/'(.*?):(.*$)/\1/g" ) )

        echo ${LIST[*]} > getdepends.list                                   #Log of downloaded packages
        echo ${FULLRESULTS[*]} >> getdepends.fullresults    #Verbose log of skipped packages
        echo ${RESULTS[*]} >> getdepends.results                    #Just the name of skipped packages
    done 

    apt-get download ${LIST[*]}

33 保存国内ubuntu的源

/etc/apt/sources.list

14.04 163:

    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

16.04 阿里:

    # deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
    deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
    deb http://archive.canonical.com/ubuntu xenial partner
    deb-src http://archive.canonical.com/ubuntu xenial partner
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse

34 挂载远程目录到本机

需要安装 sshfs

  1. 写一个脚本可以把远程的目录挂载到编译机上:

           #!/bin/bash
    
           mkdir -p remote-asp
    
           if [ ! $# -eq 3 ]
           then
           echo "usage: ./mount.sh username ip path-to-mount"
           echo "for example: "
           echo "./mount.sh pengpengxp 172.16.23.215 /Users/pengpengxp/src/asp"
           fi
    
           sshfs $1@$2:$3 /home/openstack/remote-asp/
    
           exit 0
    
  2. 对应的卸载脚本:

           #!/bin/bash
           fusermount -u remote-asp
    

35 可以这样查ip的详细信息

    curl ipinfo.io/json

36 TODO ubuntu manage battery

37 unzip解压乱码问题

在windows上压缩的文件,是以系统默认编码中文来压缩文件。由于zip文件中 没有声明其编码,所以linux上的unzip一般以默认编码解压,中文文件名会出 现乱码。虽然2005年就有人把这报告为bug, 但是info-zip的官方网站没有把 自动识别编码列入计划,可能他们不认为这是个问题。Sun对java中存在N年的 zip编码问题,采用了同样的处理方式。

有2种方式解决问题:

  1. 通过unzip行命令解压,指定字符集

unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明, unzip –help对这个参数有一行简单的说明。

  1. 在环境变量中,指定unzip参数:

我是在 ~/.bashrc 这些shell启动会以加载的文件中设置下面的两个环境变 量,则shell中解压可以不再乱码:

    export UNZIP="-O CP936"
    export ZIPINFO="-O CP936"

在emacs中这样设置:

    ;; for unzip chinese charactor file which are ziped on windows
    (setenv "UNZIP" "-O CP936")
    (setenv "ZIPINFO" "-O CP936")

总是以指定的字符集显示和解压文件 /etc/environment 中加入2行

    UNZIP="-O CP936"
    ZIPINFO="-O CP936"

这样Gnome桌面的归档文件管理器(file-roller)可以正常使用unzip解压中文, 但是file-roller本身并不能设置编码传递给unzip。

38 grep只输出匹配的内容

就是 -o 选项:

     ~/ echo 'xiepeng'|grep peng
    xiepeng
     ~/ echo 'xiepeng'|grep -o peng
    peng

39 使用tmux   tmux

tmux启动后是一个damon,如果不小心iterm2退出了或对应的标签页半闭了。 可以使用 tmux attach attach到原来的daemon上。注意,异常关闭后,默 认会有一个tmux还在attach。需要把原来的tmux attach的干掉。但是别把 tmux进程干掉了,具体的说,就是干掉下面的第一个,别干掉第二个:

    pengpengxp        2108   0.0  0.0  2458016    744 s000  S+   10:43下午   0:00.01 tmux attach
    pengpengxp        1480   0.0  0.0  2498212   4712   ??  Ss   10:43下午   0:04.60 tmux new-session -d -s 0 -n demo-openstack -x204 -y59

然后再 tmux attach 就ok了。

重启呢?网上下载了一个 tmux-session 脚本,如下:

    #!/usr/bin/env bash
    # Save and restore the state of tmux sessions and windows.
    # TODO: persist and restore the state & position of panes.
    set -e

    dump() {
      local d=$'\t'
      tmux list-windows -a -F "#S${d}#W${d}#{pane_current_path}"
    }

    save() {
      dump > ~/.tmux-session
    }

    terminal_size() {
      stty size 2>/dev/null | awk '{ printf "-x%d -y%d", $2, $1 }'
    }

    session_exists() {
      tmux has-session -t "$1" 2>/dev/null
    }

    add_window() {
      tmux new-window -d -t "$1:" -n "$2" -c "$3"
    }

    new_session() {
      cd "$3" &&
      tmux new-session -d -s "$1" -n "$2" $4
    }

    restore() {
      tmux start-server
      local count=0
      local dimensions="$(terminal_size)"

      while IFS=$'\t' read session_name window_name dir; do
        if [[ -d "$dir" && $window_name != "log" && $window_name != "man" ]]; then
          if session_exists "$session_name"; then
            add_window "$session_name" "$window_name" "$dir"
          else
            new_session "$session_name" "$window_name" "$dir" "$dimensions"
            count=$(( count + 1 ))
          fi
        fi
      done < ~/.tmux-session

      echo "restored $count sessions"
    }

    case "$1" in
    save | restore )
      $1
      ;;
    * )
      echo "valid commands: save, restore" >&2
      exit 1
    esac

  • 重启前: tmux-session save
  • 重启后: tmux-session restore
  • 然后就可以 attach 了。

tmux的配置在 ~/.tmux.conf

    ################################################################
    #### original setting
    ################################################################
    # #设置前缀为Ctrl + a
    # set -g prefix C-a
    # # 与此同时,取消默认的前缀按键:
    # #解除Ctrl+b 与前缀的对应关系
    # unbind C-b

    ################################################################
    #### copy from others
    ################################################################
    #use UTF8
    #set -g utf8
    #set-window-option -g utf8 on


    bind C-e command-prompt -p "session?,message?" "run-shell \"tmux list-windows -t %1 \| cut -d: -f1\|xargs -I\{\} tmux send-keys -t %1:\{\} %2\""


    # make tmux display things in 256 colors
    set -g default-terminal "screen-256color"

    # set scrollback history to 10000 (10k)
    set -g history-limit 10000

    # set Ctrl-a as the default prefix key combination
    # and unbind C-b to free it up
    # set -g prefix C-a
    set -g prefix `
    unbind C-b

    # use send-prefix to pass C-a through to application
    # bind C-a send-prefix
    bind ` send-prefix

    # shorten command delay
    set -sg escape-time 1

    # set window and pane index to 1 (0 by default)
    set-option -g base-index 1
    setw -g pane-base-index 1

    # reload ~/.tmux.conf using PREFIX r
    bind r source-file ~/.tmux.conf \; display "Reloaded!"

    # use PREFIX | to split window horizontally and PREFIX - to split vertically
    bind | split-window -h
    bind - split-window -v

    # set default windows name
    bind c new-window -n 'Main'

    # Make the current window the first window
    bind T swap-window -t 1

    bind-key ( swap-window -t -1
    bind-key ) swap-window -t +1

    bind-key -n S-Left select-window -t :-
    bind-key -n S-Right select-window -t :+
    bind-key -n C-S-Left swap-window -t -1
    bind-key -n C-S-Right swap-window -t +1

    # switch to last-window, I bind M-S to send hex code 0x60 0x53
    bind-key S last-window
    bind-key -n C-s  last-window
    # switch to last-window, I bind M-s to send hex code 0x60 0x73
    bind-key s last-pane
    bind-key X kill-pane

    bind-key -n m-s last-pane

    # map Vi movement keys as pane movement keys
    bind h select-pane -L
    bind j select-pane -D
    bind k select-pane -U
    bind l select-pane -R

    # bind tab choose-window
    bind tab display-panes

    unbind p
    bind p previous-window

    # set display time to 5 seconds
    set -g display-panes-time 5000


    # and use C-h and C-l to cycle thru panes
    bind -r C-h select-window -t :-
    bind -r C-l select-window -t :+


    # 在iterm2中设置'Ctrl+1'为send hexcode 0x60 0x31就相当于调用 '前缀`+1'
    # (`的hexcode就是 0x60)
    bind 1 select-window -t 1
    bind 2 select-window -t 2
    bind 3 select-window -t 3
    bind 4 select-window -t 4
    bind 5 select-window -t 5
    bind 6 select-window -t 6
    bind 7 select-window -t 7
    bind 8 select-window -t 8
    bind 9 select-window -t 9
    bind 0 select-window -t 10
    # -n 不需要加前缀就可以使用
    bind -n F1 select-window -t 1
    bind -n F2 select-window -t 2
    bind -n F3 select-window -t 3
    bind -n F4 select-window -t 4
    bind -n F5 select-window -t 5
    bind -n F6 select-window -t 6
    bind -n F7 select-window -t 7
    bind -n F8 select-window -t 8
    bind -n F9 select-window -t 9

    bind -n PPage copy-mode -u

    # bind 0 select-window -t 10
    # bind 1 select-window -t 11
    # bind 2 select-window -t 12
    # bind 3 select-window -t 13
    # bind 4 select-window -t 14
    # bind 5 select-window -t 15
    # bind 6 select-window -t 16
    # bind 7 select-window -t 17
    # bind 8 select-window -t 18

    # resize panes using PREFIX H, J, K, L
    bind H resize-pane -L 5
    bind J resize-pane -D 5
    bind K resize-pane -U 5
    bind L resize-pane -R 5


    # bind S set synchronize-panes on
    # bind s set synchronize-panes off

    # for mouse support, 这个模式开启后,iterm2中需要按option才能像原来一
    # 样选中,所以现在先禁止
    # set -g mouse on

    # The panes {

    set -g pane-border-bg colour235
    set -g pane-border-fg colour238
    set -g pane-active-border-bg colour236
    set -g pane-active-border-fg colour51

    # }
    # The statusbar {

    set -g status-position bottom
    set -g status-bg colour234
    set -g status-fg colour137
    set -g status-attr dim
    set -g status-left ''
    set -g status-right '#[fg=colour233,bg=colour241,bold] %d/%m #[fg=colour233,bg=colour245,bold] %H:%M:%S '
    set -g status-right-length 50
    set -g status-left-length 20

    setw -g window-status-current-fg colour81
    setw -g window-status-current-bg colour238
    setw -g window-status-current-attr bold
    setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F '

    setw -g window-status-fg colour138
    setw -g window-status-bg colour235
    setw -g window-status-attr none
    setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '

    setw -g window-status-bell-attr bold
    setw -g window-status-bell-fg colour255
    setw -g window-status-bell-bg colour1

    # }

    # The messages {

    set -g message-attr bold
    set -g message-fg colour232
    set -g message-bg colour166

    # }

    # set copy mode to use vi-like moving, space begin selete and Enter
    # copy
    set-window-option -g mode-keys vi

39.1 Mac中的配置

在iterm2中,可以使用 Control-number 来切换windows。iterm2可以设置 C-number 来发送hex code。上面我把tmux的prefix设置为 ` 。切换 windows默认使用 ` nubmers 。可以设置 C-numbers 发送对应的hex code达到目的。比如 C-1 发送 0x60 0x31C-2 发送 =0x60 0x32=。

配置里还使用了 reattach-to-user-namespace 这个应该是修复一个os x 上tmux中不用使用系统open系统打开文件的bug。据说这个bug几年了都没人 修。

39.2 tmux中的session

一个session可以看做是多个窗口的集合。可以不同的session来干不同的事 情:

     # 查询当前所有session
     tmux list-sessions
     # attach到对庆的session,这里的<session>就是上面查出来的第一列
     tmux attach -t <session>

需要注意的是tmux多次attach同一个session可能会导致卡死。需要退出来把 所有attach到对应session的tmux进程都干掉重新attach才行。

一些快捷键:

操作 快捷键
查看/切换session prefix s
离开Session prefix d
重命名当前Session prefix $

39.3 多个pane中实现同时输入

可以这样:

     Have you tried following in tmux window with multiple panes

     <prefix> :

     setw synchronize-panes on

     clear history

39.4 copy-mode

referenced here

     i m assuming that the tmux prefix is Control+b and that you have emacs style key bindings on

     1) enter copy mode using Control+b [
     2) navigate to beginning of text, you want to select and hit Control+Space
     3) move around using arrow keys to select region
     4) when you reach end of region simply hit Alt+w to copy the region
     5) now Control+b ] will paste the selection

     you can navigate the text using the emacs style navigation key
     Control+p, Control+n, Control+f, Control+b etc.

     Dan in the comments informs me that if you have vi style key bindings on then the following applies:

     1) enter copy mode using Control+b [
     2) navigate to beginning of text, you want to select and hit Space
     3) move around using arrow keys to select region
     4) when you reach end of region simply hit Enter to copy the region
     5) now Control+b ] will paste the selection

     To enable vi like cursor movement in copy mode put the following in your ~/.tmux.conf:

     set-window-option -g mode-keys vi

     more over what ever you copy, you may dump that out in your terminal using

     tmux show-buffer

     and even save to a file(say, foo.txt) using

     tmux save-buffer foo.txt

     To see all the paste buffers try Control + b #. To dump out the varios buffers on to the terminal or file you may use

     tmux list-buffers
     tmux show-buffer -b n
     tmux save-buffer -b n foo.txt

     where n is the index of the paste buffer.

39.5 开启了mouse mode后如何使用鼠标选择区域来copy

使用 set mouse on 开启鼠标输入后可以方便很多,但是选择区域就需要 按住 shift 后再使用鼠标选择了。

40 命令行中转换电子书格式

epub to mobi

    ebook-convert program-think.epub program-think.mobi

epub to azw3

    ebook-convert program-think.epub program-think.azw3

我想转info文件到kindle上看,试了一下这个流程:

texinfo -> HTML -> ebook-convert -> mobi

texi2html org.texi
ebook-convert org.html org.mobi

41 命令行转换视频格式

    HandBrakeCLI -i xxx.avi -o xxx.mp4

42 命令行网页视频下载工具you-get

http://www.appinn.com/you-get/

    you-get https://www.bilibili.com/video/av14185130

https://rg3.github.io/youtube-dl/

sudo pip install --upgrade youtube_dl 来安装。

43 web servers in one line   http

Each of these commands will run an ad hoc http static server in your current (or specified) directory, available at http://localhost:8000. Use this power wisely.

Discussion on reddit.

43.1 Python 2.x

       $ python -m SimpleHTTPServer 8000

43.2 Python 3.x

       $ python -m http.server 8000

43.3 Twisted (Python)

       $ twistd -n web -p 8000 --path .

Or:

       $ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Depends on Twisted.

43.4 Ruby

       $ ruby -rwebrick -e'WEBrick::HTTPServer.new(:Port => 8000, :DocumentRoot => Dir.pwd).start'

Credit: Barking Iguana

43.5 Ruby 1.9.2+

       $ ruby -run -ehttpd . -p8000

Credit: nobu

43.6 adsf (Ruby)

       $ gem install adsf   # install dependency
       $ adsf -p 8000

Credit: twome

No directory listings.

43.7 Sinatra (Ruby)

       $ gem install sinatra   # install dependency
       $ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

No directory listings.

43.8 Perl

       $ cpan HTTP::Server::Brick   # install dependency
       $ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Credit: Anonymous Monk

43.9 Plack (Perl)

       $ cpan Plack   # install dependency
       $ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

Credit: miyagawa

43.10 Mojolicious (Perl)

       $ cpan Mojolicious::Lite   # install dependency
       $ perl -MMojolicious::Lite -MCwd -e 'app->static->paths->[0]=getcwd; app->start' daemon -l http://*:8000

No directory listings.

43.11 http-server (Node.js)

       $ npm install -g http-server   # install dependency
       $ http-server -p 8000

/Note: This server does funky things with relative paths. For example, if you have a file /tests/index.html, it will load index.html if you go to /test, but will treat relative paths as if they were coming from /./

43.12 node-static (Node.js)

       $ npm install -g node-static   # install dependency
       $ static -p 8000

No directory listings.

43.13 PHP (>= 5.4)

       $ php -S 127.0.0.1:8000

Credit: /u/prawnsalad and MattLicense

No directory listings.

43.14 Erlang

       $ erl -s inets -eval 'inets:start(httpd,[{server_name,"NAME"},{document_root, "."},{server_root, "."},{port, 8000},{mime_types,[{"html","text/html"},{"htm","text/html"},{"js","text/javascript"},{"css","text/css"},{"gif","image/gif"},{"jpg","image/jpeg"},{"jpeg","image/jpeg"},{"png","image/png"}]}]).'

Credit: nivertech (with the addition of some basic mime types)

No directory listings.

43.15 busybox httpd

       $ busybox httpd -f -p 8000

Credit: lvm

43.16 webfs

       $ webfsd -F -p 8000

Depends on webfs.

43.17 IIS Express

       C:\> "C:\Program Files (x86)\IIS Express\iisexpress.exe" /path:C:\MyWeb /port:8000

Depends on IIS Express.

Credit: /u/fjantomen

No directory listings. /path must be an absolute path.

43.18 Meta

If you have any suggestions, drop them in the comments below or on the reddit discussion. To get on this list, a solution must:

  1. serve static files using your current directory (or a specified directory) as the server root,
  2. be able to be run with a single, one line command (dependencies are fine if they're a one-time thing),
  3. serve basic file types (html, css, js, images) with proper mime types,
  4. require no configuration (from files or otherwise) beyond the command itself (no framework-specific servers, etc)
  5. must run, or have a mode where it can run, in the foreground (i.e. no daemons)

44 ruby gem使用国内源

    $ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
    $ gem sources -l
    https://gems.ruby-china.org
    # 确保只有 gems.ruby-china.org

45 修改linux的改键绑定

  • console下,用showkeys查看键值,用dumpkey来查看当前的绑定(可以直接重 定向到一个文件peng.kmap),然后一定保留peng.kmap的第一行。其他都可以 删除。按照dumpkey的输出来定制自己的键位就可以。最后用loadkey来加载自 己的peng.kmap就好。例子:
keymaps 0-2,4-6,8-9,12
keycode  56 = Alt             
keycode 100 = Alt
keycode  58 = Control
keycode 104 = Caps_Lock

用loadkey加载一下就OK。

  • X-windows下:用xev来查看键值和对应的名字。用xmodmap来查看当前和修改 所有。(在fedora在用xev成功,ubuntu下没测)。有两个层次。需要都修改。 例子:

      clear lock
      remove mod1 = Alt_L
      remove mod4 = Super_R
       
      add control = Alt_L
      add control = Super_R
      add control = Menu
      add control = Caps_Lock
      add lock = Insert
       
       
      keycode 64 = Control_L
      keycode 134 = Control_L
      keycode 135 = Control_L
      keycode 66 = Control_L
      keycode 118 = Control_L
    

    用xmodmap加载。

46 分区设定

46.1 给新分区设置label

ext4:

mkfs.ext4 -L label /dev/xxx  

fat:

fatlabel device [label]

46.2 格式化为 fat32

sudo mkfs.vfat -F 32 /dev/sdXn

command line - Why the "v" in mkfs.vfat? - Unix & Linux Stack Exchange

FAT is a family of filesystems, comprising at least, in chronological order:

    FAT12, a filesystem used on floppies since the late 1980s, in particular by MS-DOS;
    FAT16, a small modification of FAT12 supporting larger media, introduced to support hard disks;
    vFAT, which is backward compatible with FAT, but allows files to have longer names which only vFAT-aware applications running on vFAT-aware operating systems can see;
    FAT32, another modification of FAT16 designed to support larger disk sizes. In practice FAT32 is almost always used with vFAT long file name support, but technically 16/32 and long-file-names-yes/no are independent.

Because those filesystems are very similar, they're usually handled by the same drivers and tools. mkfs.vfat and mkfs.fat are the same tool; an empty FAT16 filesystem and an empty vFAT filesystem look exactly the same, so mkfs doesn't need to distinguish between them. (You can think of FAT16 and vFAT as two different ways of seeing the same filesystem rather than two separate filesystem formats.)

46.3 change ntfs label

ntfslabel

46.4 TODO change ext label

47 rsync不同步某些文件

有些编译出来的 .o 文件等我不想同步。可以使用rsync的 --exclude 选 项。如果有多个或多种文件不想同步,可以使用rsync的 --exclude-from 选项来指定一个文件。在该文件指定不想同步的内容即可。

rsync -avz --exclude "*.o" from to  
rsync -avz --exclude-from "exclude-list-file.txt" from to  

exclude-list-file.txt 可以长这样:

  *.o
  *.so
  *.la

最后找到这种办法:

You can use git ls-files to build the list of files excluded by the repository's .gitignore files. https://git-scm.com/docs/git-ls-files

Options:

    --exclude-standard Consider all .gitignore files.
    -o Don't ignore unstaged changes.
    -i Only output ignored files.
    --directory Only output the directory path if the entire directory is ignored.

The only thing I left to ignore was .git.

# 这一条命令其实是有问题的
rsync -azP --exclude=.git --exclude=`git -C <SRC> ls-files --exclude-standard -oi

# 下面这条命令才可以
this doesn't work. it excludes the first file from the git subcommand and then treats the rest as part of the SRC list. this works: rsync -azP --exclude-from="$(git -C SRC ls-files --exclude-standard -oi --directory > /tmp/excludes; echo /tmp/excludes)" SRC DEST

于是我参考了它写了我的脚本:

#!/bin/bash

SRC="/home/pengpengxp/src/fhos/"
DES="cdyq-pc-p:/home/pengpengxp/fhos/"
TEMPFILE="/tmp/pengrsynctemp"

rsync -azP --exclude=.git --exclude-from=$(git -C ${SRC} ls-files --exclude-standard -oi --directory > ${TEMPFILE};echo ${TEMPFILE}) ${SRC} ${DES}

48 wmctrl来控制窗口

ubuntu 16.04中可以直接使用apt来安装:

    sudo apt-get install wmctrl

打开了emacs后,可以直接使用下面的命令来激活emacs,firefox,terminal:

    wmctrl -a emacs
    wmctrl -a firefox
    wmctrl -a terminal

然后在对应的键盘设置中把对应的shell-command绑定到按键上就可以了。

49 irony-mode和rtags等等都需要 compile_commands.json 文件

使用 bear make 就可以了。有时只需要得到这个文件,可以忽略所有的 warning。加入 -w 选项就可以了。

bear make  CFLAGS+=-w

cmake也可以生成 compile_commands.json 文件,如下做就可以啦:

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 /path/to/src

50 lunar,ccal命令行下的日历

查一天的详情: lunar 2018 2 15

ccal可能更好用一点:

ccal

更好地显示中文:

ccal -b -u

查2018年

ccal -b -u 2018

查2018年2月

ccal -b -u 2 2018

51 不重启也不使用udev来修改系统中网卡的名字

ifconfig peth0 down  
ip link set peth0 name eth0  
ifconfig eth0 up  

52 打开coredump选项,debug的时候比较方便

这样就会产生coredump文件啦:

ulimit -c unlimited  

可以这样查询一下配置成功没有:

ulimit -a  

53 ssh不用每次都添加到knownhosts

有时debug,有些设置一直都在重启,不需要每次都加进去。这样写ssh的配置:

Host switch-free
        Hostname 10.0.0.69
        UserKnownHostsFile /dev/null
        StrictHostKeyChecking no
        User root
        Port 22

UserKnownHostsFile 是不加入 ~/.ssh/known_hosts 文件, StrictHostKeyChecking 是不用每次都输 yes or no

54 aria2一个命令行下载工具

Download from WEB:

$ aria2c http://example.org/mylinux.iso

Download from 2 sources:

$ aria2c http://a/f.iso ftp://b/f.iso

Download using 2 connections per host:

$ aria2c -x2 http://a/f.iso

BitTorrent:

$ aria2c http://example.org/mylinux.torrent

BitTorrent Magnet URI:

$ aria2c 'magnet:?xt=urn:btih:248D0A1CD08284299DE78D5C1ED359BB46717D8C'

Metalink:

$ aria2c http://example.org/mylinux.metalink

Download URIs found in text file:

$ aria2c -i uris.txt

55 one line ftp server

twistd -n ftp ./

Author: pengpengxp

Created: 2019-04-11 四 11:53