Linux wiki
Table of Contents
- 1. DONE 使用percol配置文件管理器。
- 2. 使用pgrep可以更好的找到正在运行的程序
- 3. 配置hostapd共享无线网络 hostapd
- 4. xrandr设置linux分辨率
- 5. ubuntu 安装virtualbox第三方增强
- 6. linux下显示dd命令的进度:
- 7. enca change file encoding enca
- 8. mosh
- 9. ubuntu配置开机启动
- 10. ubuntu配置ssh
- 11. 在一个多网卡机器上确定哪个网卡上面插着网线
- 12. 给ubuntu安装boot loader(grub2)
- 13. ubuntu配置nic名字
- 14. interface设置
- 15. pandoc
- 16. lvm
- 17. sort 来排列ip地址
- 18. sudo不输密码
- 19. 查看cpu个数
- 20. ssh隧道
- 21. iperf测网速
- 22. VirtualBox使用共享文件夹
- 23. date命令
- 24. ps找程序
- 25. sudo不输密码
- 26. asscii font
- 27. wget
- 28. 十六进制表示说明
- 29. 配置vnc4server
- 30. TODO cp命令你真的懂吗?
- 31. TODO
[0/1]
特殊的文件权限 - 32. ubuntu下载一个软件所有依赖的包
- 33. 保存国内ubuntu的源
- 34. 挂载远程目录到本机
- 35. 可以这样查ip的详细信息
- 36. TODO ubuntu manage battery
- 37. unzip解压乱码问题
- 38. grep只输出匹配的内容
- 39. 使用tmux tmux
- 40. 命令行中转换电子书格式
- 41. 命令行转换视频格式
- 42. 命令行网页视频下载工具you-get
- 43. web servers in one line http
- 43.1. Python 2.x
- 43.2. Python 3.x
- 43.3. Twisted (Python)
- 43.4. Ruby
- 43.5. Ruby 1.9.2+
- 43.6. adsf (Ruby)
- 43.7. Sinatra (Ruby)
- 43.8. Perl
- 43.9. Plack (Perl)
- 43.10. Mojolicious (Perl)
- 43.11. http-server (Node.js)
- 43.12. node-static (Node.js)
- 43.13. PHP (>= 5.4)
- 43.14. Erlang
- 43.15. busybox httpd
- 43.16. webfs
- 43.17. IIS Express
- 43.18. Meta
- 44. ruby gem使用国内源
- 45. 修改linux的改键绑定
- 46. 分区设定
- 47. rsync不同步某些文件
- 48. wmctrl来控制窗口
- 49. irony-mode和rtags等等都需要
compile_commands.json
文件 - 50. lunar,ccal命令行下的日历
- 51. 不重启也不使用udev来修改系统中网卡的名字
- 52. 打开coredump选项,debug的时候比较方便
- 53. ssh不用每次都添加到known_hosts
- 54. aria2一个命令行下载工具
1 DONE 使用percol配置文件管理器。
- State "DONE" from "DONE"
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
- 使用ff的时候,如果当前目录内容太多。或者有权限不足的错误的时候,会 出现问题
- percol中不支持正则表达式。暂时没有能力定制。
Solved
- 其实是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; }
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和wpa_passphrase分别是用户名和密码。设置好以后。可以保存该配置在任意文件中,我是保存在/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
保存为p_start_hostapd.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#
再把 lib
和 lib64
目录按照同样方法搞进去,终于可以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
基本的单元是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-vg
和 vg_var
。
root@compute14:/home/compute# ls /dev/compute-vg/ root swap_1 root@compute14:/home/compute#
compute-vg
分为两个LV: root
和 swap_1
。 swap_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
问题 :
[ ]
老是需要启动在: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
一样。
[ ]
有一个问题,对应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*
注意
- 权限提升,安全问题就得重视。
- 由于这是文件的特殊属性,这种特征只能用于二进制文件。脚本这些是不行的。
31.2 TODO st_gid
- State "TODO" from
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
。
写一个脚本可以把远程的目录挂载到编译机上:
#!/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
对应的卸载脚本:
#!/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种方式解决问题:
- 通过unzip行命令解压,指定字符集
unzip -O CP936 xxx.zip (用GBK, GB18030也可以) 有趣的是unzip的manual中并无这个选项的说明, unzip –help对这个参数有一行简单的说明。
- 在环境变量中,指定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 0x31
, C-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
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.
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)
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)
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:
- serve static files using your current directory (or a specified directory) as the server root,
- be able to be run with a single, one line command (dependencies are fine if they're a one-time thing),
- serve basic file types (html, css, js, images) with proper mime types,
- require no configuration (from files or otherwise) beyond the command itself (no framework-specific servers, etc)
- 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不用每次都添加到known_hosts
有时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