GNU/Linux Tips

来自Jack's Lab
跳转到: 导航, 搜索

目录

1 XPS 9560


2 Bash

2.1 Notes

$ set -- one two
$ echo $1
one
$ echo ${1}
1
$ eval echo ${1}
one

$ n=2
$ echo ${n}
2
$ echo ${!n}
two
$ eval echo \${$n}
two



2.2 Bash readline

#!/bin/bash 
count=1
cat X1A001.dat | while read line        # 从文本文件 X1A001.dat 一行一行的读 
do 
   echo "$count:$line" 
   count=$(($count + 1))
done
exit 0



2.3 命令行历史

1. 忽略当前这条命令
 $ export HISTCONTROL=ignorespace
 $ [space]echo "this is a top secret"


2. 禁用当前会话的所有历史记录
 $ export HISTSIZE=0


3. 工作结束后清除整个历史
 $ history -cw


4. 只针对你的工作关闭历史记录
 $ [space]set +o history

要重新开启:

 $ [space]set -o history


5. 从历史记录中删除指定的命令
 $ history
 $ history -d 3



3 User Add

$ userdel comcat
$ useradd comcat -m -s /bin/bash -p



4 Network Monitor

4.1 iftop

$ sudo apt-get install iftop
$ sudo iftop -P -i eth1


4.2 ifstat

$ sudo apt-get install ifstat
$ sudo ifstat -t -i wlan0 2
  Time          wlan0       
HH:MM:SS   KB/s in  KB/s out
11:04:42      0.00      0.00
11:04:44      0.02      0.03
11:04:46      0.12      1.29
11:04:48     32.94      9.75
11:04:50     63.31     12.23


refter to: http://www.binarytides.com/linux-commands-monitor-network/



5 Sed

1. 关于 -n 的说明 The default operation of sed is to output every input line. The -n option suppresses the automatic output. When specifying this option, each instruction intended to produce output must contain a print command, p. Look at the following example.


2. debian 下读取指定软件包的所有信息(实质上是读取相邻两个空行之间的所有数据)

   sed -n '/^Package: libc6-udeb/{:next;N;//n$/!b next;p}' Packages

PS: 每 N 一行,缓冲区会加入 /n<newline> ,当读入一空行时,缓冲区的最后一个字符就是 /n


3. 读取所有软件包的名字

   sed -n 's/^Package: \(.*\)/\1/p' Packages

PS: \1 表示保留 pattern 中第一个子模式,即匹配括号中模式的予以保留


4. 提取含有特定信息的数据块(比如获取所有 gnome 用到的包)

   sed '/^Package:/{:next;N;//n$/!b next;/Section: gnome/b;d}' Packages


5. sed 中使用 bash 中定义的变量

   sed -n "/^Package: $file/{:next;N;//n$/! b next;p}" Packages

PS: 注意 sed 的命令部分是用“”括起来的,这样可以引用 bash中定义的变量 file;另外!和 b之间 要留有空格否则bash 会报错,因为在bash中!有特殊用途。



6 Grep

1. 提取文件中所有符合模式的字符串:

 egrep -or "MJD[0-9]{12}" /tmp/alldevid



7 WiFi Config

7.1 wireless tools

$ sudo ip link set wlan0 up
$ sudo iw dev wlan0 scan | less 

$ sudo iw dev wlan0 connect [网络 SSID]
$ sudo iw dev wlan0 connect [网络 SSID] key 0:[WEP 密钥]   # For WEP

$ cat /etc/wpa_supplicant/my.conf
network={
    ssid="[网络 ssid]"
    psk="[密码]"
    priority=1
}

$ sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/my.conf &
$ sudo dhclient wlan0


7.2 nmcli

# list your connections
$ sudo nmcli c

$ sudo nmcli c up uuid <paste essid uuid here>



7.3 Reference



8 Kernel代码格式化

kernel source tree 的 scripts/ 下有一个 Lindent 的脚本:

#!/bin/sh
PARAM="-npro -kr -i8 -ts8 -sob -l80 -ss -ncs -cp1"
RES=`indent --version`
V1=`echo $RES | cut -d' ' -f3 | cut -d'.' -f1`
V2=`echo $RES | cut -d' ' -f3 | cut -d'.' -f2`
V3=`echo $RES | cut -d' ' -f3 | cut -d'.' -f3`
if [ $V1 -gt 2 ]; then
  PARAM="$PARAM -il0"
elif [ $V1 -eq 2 ]; then
  if [ $V2 -gt 2 ]; then
    PARAM="$PARAM -il0";
  elif [ $V2 -eq 2 ]; then
    if [ $V3 -ge 10 ]; then
      PARAM="$PARAM -il0"
    fi
  fi
fi
indent $PARAM "$@"



9 udev

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 002: ID 413c:2003 Dell Computer Corp. Keyboard
Bus 002 Device 003: ID 413c:3016 Dell Computer Corp. Optical 5-Button Wheel Mouse
Bus 002 Device 016: ID 18d1:4e22 Google Inc. Nexus S (debug)

Bus 002 Device 016 就是我的手机,对应的设备节点是 /dev/bus/usb/002/016

如下命令查看设备信息:

$ udevadm info -q all -n /dev/bus/usb/002/016 
P: /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6
N: bus/usb/002/016
E: BUSNUM=002
E: DEVNAME=/dev/bus/usb/002/016
E: DEVNUM=016
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MEDIA_PLAYER=google_nexus-s
E: ID_MODEL=SGH-T959
E: ID_MODEL_ENC=SGH-T959
E: ID_MODEL_ID=4e22
E: ID_REVISION=0231
E: ID_SERIAL=samsung_SGH-T959_32334071DA1D00EC
E: ID_SERIAL_SHORT=32334071DA1D00EC
E: ID_USB_INTERFACES=:080650:ff4201:
E: ID_VENDOR=samsung
E: ID_VENDOR_ENC=samsung
E: ID_VENDOR_ID=18d1
E: MAJOR=189
E: MINOR=143
E: PRODUCT=18d1/4e22/231
E: SUBSYSTEM=usb
E: TAGS=:udev-acl:
E: TYPE=0/0/0
E: UDEV_LOG=3
E: USEC_INITIALIZED=599355697049

或者:

$ udevadm info -q path -n /dev/bus/usb/002/016 
/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6

$ udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/002/016)

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6':
    KERNEL=="2-1.6"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{configuration}==""
    ATTR{bNumInterfaces}==" 2"
    ATTR{bConfigurationValue}=="1"
......
......

根据 http://www.reactivated.net/writing_udev_rules.html#basic 写一个 udev rules 文件 /etc/udev/rules.d/62-android.rules:

# 匹配上设备则将设备节点文件的 mode 改为 0666,建一个 /dev/GalasyS 的符号链接指向它 
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="18d1", ENV{ID_MODEL}=="Galaxy", MODE="0666", SYMLINK+="GalaxyS"
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="18d1", ENV{ID_MODEL_ID}=="4e22", MODE="0666", SYMLINK+="GalaxyS"
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", ATTR{product}=="Galaxy" MODE="0666", SYMLINK+="GalaxyS"

如对某一行 rule 没底,可用如下命令测试这个 rule:

$ udevadm test --action='"usb", ENV{ID_VENDOR_ID}=="18d1", ENV{ID_MODEL}=="Galaxy", MODE="0666", SYMLINK+=
"GalaxyS"' $(udevadm info -q path -n /dev/bus/usb/002/016)
......
udev_node_add: creating device node '/dev/bus/usb/002/016', devnum=189:143, mode=0664, uid=0, gid=0
udev_node_mknod: preserve file '/dev/bus/usb/002/016', because it has correct dev_t
udev_node_mknod: preserve permissions /dev/bus/usb/002/016, 020664, uid=0, gid=0
node_symlink: preserve already existing symlink '/dev/char/189:143' to '../bus/usb/002/016'
......

确定后重启 udev 即可:

 sudo service udev restart





10 VirtualBox

10.1 Mount VDI image

$ od -j344 -N4 -td4 /work/FreeDos.vdi | awk 'NR==1{print $2;}'
8192

$ sudo losetup -f --show -o 8192 /work/FreeDos.vdi
/dev/loop0

$ sudo fdisk  -lu /dev/loop0

Disk /dev/loop0: 113 MB, 113246208 bytes
16 heads, 63 sectors/track, 219 cylinders, total 221184 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *          63     1023119      511528+   6  FAT16

$ sudo mount -o loop,offset=$((512*63)) /dev/loop0 /mnt

$ ls /mnt/
AUTOEXEC.BAT  BOOTSECT.BIN  COMMAND.COM  FDCONFIG.SYS  FDOS  KERNEL.SYS


$ sudo umount /mnt
$ sudo losetup -d /dev/loop0

$ VBoxManage clonehd /work/FreeDos.vdi /work/freedos.vdi --format VDI --variant Fixe



11 Mount a disk image

$ sudo losetup -fv ./rasper-pi.img 
Loop device is /dev/loop0

$ sudo kpartx -av /dev/loop0
add map loop0p1 (252:0): 0 114688 linear /dev/loop0 8192
add map loop0p2 (252:1): 0 7917568 linear /dev/loop0 122880

$ sudo mount /dev/mapper/loop0p2 /mnt

$ ls /mnt/
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var



12 GDB Tips

1. 查看寄存器

(gdb) i r
(gdb) i r a                     # 查看所有寄存器(包括浮点、多媒体)
(gdb) i r esp
(gdb) i r pc


2. 查看内存

(gdb) x /wx 0x80040000    # 以16进制显示指定地址处的数据
(gdb) x /8x $esp
(gdb) x /16x $esp+12
(gdb) x /16s 0x86468700   # 以字符串形式显示指定地址处的数据
(gdb) x /24i 0x8048a51      # 以指令形式显示指定地址处的数据(24条)


3. 修改寄存器的值

(gdb) set $v0 = 0x004000000
(gdb) set $epc = 0xbfc00000


4. 修改内存的值

(gdb) set {unsigned int}0x8048a51=0x0
(gdb) set *(unsigned int*)0x8048a54=0x55aa55aa


5. 内存搜索

Usage: find <start> <end> <count> <value>

(gdb) define find                            
set $ptr = $arg0
set $cnt = 0
while ( ($ptr<=$arg1) && ($cnt<$arg2) )
    if ( *(unsigned int *)$ptr == $arg3 )
        x /wx $ptr
        set $cnt = $cnt + 1
    end
    set $ptr = $ptr + 4
end
end


6. 断点、监测点

(gdb) b *0x80400000
(gdb) watch *(unsigned int *)0xbffff400==0x90909090



13 Strace Tips

1. strace 是一个诊断调试工具,其借助内核 ptrace 机制,跟踪目标进程所执行的系统调用和收到的信号。

2. 常用选项

-o filename: 将输出信息写到文件filename中,默出输出到标准错误(stderr)
-c: 统计输出,包括每个系统调用的执行时间、被调用次数等
-tt: 每行前加上相对时间戳
-e trace=open,close: 只跟踪open, close
-e trace=file: 只跟踪以文件名为参数的的调用,等价于 -e trace=open,stat,chmod,unlink...
-e trace=process: 进程管理相关
-e trace=network: 网络相关
-e trace=ipc: 进程间通信相关
-e trace=signal: 信号相关
-e verbose=close,open: vebose模式输出(结构体成员都输出)
-e abbrev=open: 默认情况下所有调用的显示都是abbreviate,只要给这个选项,就只有open为abbrev
-e raw=open: open 调用以16进制形式输出参数
-e read=3,5: 显示文件描述符3、5的读取数据
-e write=3,5
-p pid: 绑定到pid对应的正在运行的进程。此参数常用来调试后台进程
-f: 除了跟踪当前进程外,还跟踪其子进程
-ff: 当跟踪多个进程且输出到文件时,使用该选项则将各个进程的跟踪信息写入各个filename.pid中



14 Git

git diff的时候忽略换行符的差异:

 git config --global core.whitespace cr-at-eol


http proxy:

 git config --global http.proxy 'socks5://127.0.0.1:8080'


git server:

$ apt-get install git-daemon-sysvinit
$ cat /etc/default/git-daemon
GIT_DAEMON_ENABLE=true
GIT_DAEMON_USER=gitdaemon

GIT_DAEMON_DIRECTORY=/var/data/git
GIT_DAEMON_BASE_PATH=/var/data/git

GIT_DAEMON_OPTIONS="--export-all --enable=upload-pack --enable=upload-archive --enable=receive-pack --informative-errors"


修改.git/config添加如下代码:

[receive]
    denyCurrentBranch = ignore


在初始化远程仓库时最好使用 git --bare init 而不要使用 git init

如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(不在push分支,没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容,必须得使用git reset --hard才能看到push后的内容



14.1 Tag

列显已有的标签:

$ git tag
v0.1
v1.3
$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3


创建 Tag:

$ git tag -a v1.4 -m 'my version 1.4'
$ git tag v1.4-lw
$ git tag -s v1.5 -m 'my signed 1.5 tag'


后期加注标签:

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing

$ git tag -a v1.2 0d52aaab


本地 Tag 推送到远程:

$ git push --tags


获取远程 Tag:

$ git fetch origin tag <tagname>


删除远程 Tag:

$ git push origin --delete tag <tagname>



14.2 submodule

关联:
$ git submodule add git://github.com/icamgo/xtensa-toolchain.git tools/xtensa-toolchain
$ git status
	new file:   .gitmodules
	new file:   tools/xtensa-toolchain

$ cat .gitmodules 
[submodule "tools/xtensa-toolchain"]
	path = tools/xtensa-toolchain
	url = git://github.com/icamgo/xtensa-toolchain.git

$ git commit -a -m "add the xtensa-toolchain as submodule"
$ git push


使用
$ git submodule init
$ git submodule update



14.3 Remove

First, remove the commit on your local repository:

$ git reset --soft HEAD^

Then, force push to GitHub by using:

$ git push origin +master



14.4 Remove from upstream

using https://rtyley.github.io/bfg-repo-cleaner/

$ bfg --strip-blobs-bigger-than 50M
# Git history will be cleaned - files in your latest commit will *not* be touched



14.5 Branch

14.5.1 push

  $ git push origin local_branch



14.5.2 delete

  $ git push origin :remote_branch



14.6 Merge

14.6.1 git cherry-pick

55e0513c is at branch devel, we merge it into master:

$ git checkout master
$ git cherry-pick 55e0513c



14.7 Patch

export all the 19 commits:

$ git format-patch  -s -p --stat -19 -o /tmp/



14.8 Bitbucket

Get started with an existing project:

$ cd /path/ to/your/repo
$ git remotee add origin ssh://git@bitbucket.org/YOUR_UNAME/repo.git
$ git push -u origin master


Get started from scratch:

$ git clone git@bitbucket.org:YOUR_UNAME/repo.git
$ cd repo
$ echo '# README' >> README.md
$ git add README.md
$ git commit -m "Initial commit"
$ git push -u origin master



14.9 ssh agent

# start the ssh-agent in the background
$ eval "$(ssh-agent -s)"
Agent pid 59566

$ ssh-add ~/.ssh/id_rsa



15 Fonts

Google 思源黑体被称为 Noto Sans CJK

Google-noto-font.jpg

comcat@jackslab:/$ sudo apt-cache search "Noto Sans CJK"
fonts-noto-cjk - "No Tofu" font families with large Unicode coverage (CJK)
comcat@jackslab:/$ sudo apt-get install fonts-noto-cjk


16 Markdown

$ sudo apt-get install pandoc
$ sudo apt-get install texlive-xetex texlive-latex-recommended texlive-latex-extra
$ sudo apt-get install ttf-arphic-gbsn00lp ttf-arphic-ukai # from arphic
$ sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei     # from WenQuanYi
$
$ git clone git://github.com/tinyclub/markdown-lab.git
$ cd markdown-lab/article/
$ make 



17 Gitbook



18 tshark

抓包 HTTP 协议分析:

$ tshark tcp port 80 or tcp port 443 -V -R "http.request || http.response" -i eth1 |
 sed -rn '/Hypertext Transfer Protocol/{:a;N;/    \\r\\n:?/{/.*/p;d};ba}'


只显示 GET 类请求的头:

 $ tshark 'tcp port 80' -R 'http.request.method == "GET" || http.request.method == "HEAD"' -i eth1



19 ATA Secure Erase

https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase



20 Port Scan

# TCP Connect scanning
# nmap -v -sT localhost
# nmap -v -sT 192.168.31.0/24

# nmap TCP SYN (half-open) scanning
# nmap -v -sS localhost

# nmap TCP FIN scanning
# nmap -v -sF localhost

# nmap TCP Xmas tree scanning
# nmap -v -sX localhost

# nmap TCP Null scanning
# nmap -v -sN localhost

nmap TCP RPC scanning
# nmap -v -sR localhost

nmap UDP scanning
# nmap -v -O localhost

nmap remote software version scanning
# nmap -v -sV localhost



21 netcat

21.1 简单web服务器

web 查看系统状态 (TOP):

#!/bin/bash
top -b -n 1 > /tmp/top.txt
app = "nc -l 996"
count=1;

while [ count>0 ]
do
        pn = `ps -wef|grep "${app}" |grep -v grep |grep " 1 "|wc -l`
        echo $pn
        if  test $pn -lt 1
        then
                top -b -n 1 >/tmp/top.txt
                nc -l 996   </tmp/top.txt
        fi
done    



21.2 传送文件

server: nc -v -l -p 1234 > 1.txt

client: nc -v -n 192.168.0.1 1234 < 1.txt
server: $ cat backup.iso | nc -l 3333

client: $ nc 192.168.0.1 3333 > backup.iso


Show the progress of the data transfer:

server: $ cat backup.iso | pv -b | nc -l 3333

client: $ nc 192.168.0.1 3333 | pv -b o> backup.iso



21.3 Other

S: $ dd if=/dev/hdb5 | gzip -9 | nc -l 3333
C: $ nc 192.168.0.1 3333 | pv -b > myhdb5partition.img.gz

S: $ tar -czf - /etc/ | nc -l 3333
C: $ nc 192.168.0.1 3333 | pv -b > mybackup.tar.gz



22 nginx/php

$ sudo apt-get install nginx
$ sudo apt-get install php7-fpm

$ sudo /etc/init.d/nginx start
$ sudo /etc/init.d/php7-fpm start



23 crontab

crontab的格式:

 分 时 日 月 星期 要运行的命令

第1列分钟 1~59

第2列小时 1~23(0表示子夜)

第3列日 1~31

第4列月 1~12

第5列星期 0~6(0表示星期天)

第6列要运行的命令


例子:

30 21 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示每晚的21:30重启apache。

45 4 1,10,22 * * /usr/local/apache/bin/apachectl restart
上面的例子表示每月1、10、22日的4 : 45重启apache。

10 1 * * 6,0 /usr/local/apache/bin/apachectl restart
上面的例子表示每周六、周日的1 : 10重启apache。

0,30 18-23 * * * /usr/local/apache/bin/apachectl restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。

0 23 * * 6 /usr/local/apache/bin/apachectl restart
上面的例子表示每星期六的11 : 00 pm重启apache。

* */1 * * * /usr/local/apache/bin/apachectl restart
每一小时重启apache

* 23-7/1 * * * /usr/local/apache/bin/apachectl restart
晚上11点到早上7点之间,每隔一小时重启apache

0 11 4 * mon-wed /usr/local/apache/bin/apachectl restart
每月的4号与每周一到周三的11点重启apache

0 4 1 jan * /usr/local/apache/bin/apachectl restart
一月一号的4点重启apache



24 dns server

root@srv:~#  apt-get install bind9

配置文件的路径在/etc/bind路径下面

vim /etc/bind/named.conf.local 
添加如下:

zone "jk.com"  { type master; file "/etc/bind/db.jk.com"; };

修改db的配置文件
root@srv:/etc/bind# cp db.local db.jk.com
root@srv:/etc/bind# vim db.jk.com
$TTL    604800
@       IN      SOA     jk.com. root.localhost. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      localhost.
@       IN      A       127.0.0.1
@       IN      AAAA    ::1
test       IN      A       192.168.0.11
test       IN      A       192.168.0.12
test       IN      A       192.168.0.13

修改/etc/bind/named.conf.option 配置文件,在 named.conf 中可以设置 bind 的 round-robin 的给出结果的顺序:

rrset-order { order cyclic; };

rrset-order 支持三个参数:fixed, random, cyclic 。
fixed 会将多个A记录按配置文件的顺序固定给出
random 会随机给出
cyclic 会循环给出



25 vsftp

快速搭建简易 ftp 服务: VSFTP Quick Start


26 Samba

Quick Start: Samba Tips


27 WIKI

Quick Start: WIKI Tips


28 mysql

Quick Start: MYSQL Tips


29 sqllite

Quick Start: SQLITE Tips


30 mongodb

Quick Start: MongoDB Quick Start


31 InfluxDB

Quick Start: InfluxDB Quick Start


32 Grafana

Quick Start: Grafana Quick Start


33 ubifs

# size of created mtd is 256.0 MiB
modprobe nandsim first_id_byte=0x2c second_id_byte=0xda third_id_byte=0x90 fourth_id_byte=0x95
flash_erase /dev/mtd0 0 0
ubiformat /dev/mtd0 -s 2048 -O 2048
modprobe ubi
ubiattach -m 0 -d 0 -O 2048
# set $(SIZE) to value more than size of the ubifs filesystem
ubimkvol /dev/ubi0 -N volname -s $(SIZE)
ubiupdatevol /dev/ubi0_0 $(UBIFS)
mount /dev/ubi0_0 /mnt



34 graphviz

Graphviz Notes


35 ffmpeg

Quick Start: FFMPEG Tips


36 mplayer

Quick Start: MPlayer Tips






















个人工具
名字空间

变换
操作
导航
工具箱