config

byobu startup

相信很多人都知道byobu,Ubuntu下很赞的终端管理工具,很方便的管理多个窗口,还支持窗口分屏,也支持多个窗口执行同样的命令(这点和cssh有一比),还可在服务器端保留你的工作状态,可以极大的提高效率。

byobu

让进程在后台运行,注销后而不退出,你或许知道nohup,但这个也是byobu的最基本功能之一,与nohup相比,byobu给人更熟悉的感觉。久而久之,我就喜欢上了,可是如何在VPS上开机/重启后自动执行指定命令呢?

code

配置相关的我看了不少资料,也尝试了不少。最后写了如下shell:

1
2
3
4
5
6
7
#!/usr/bin/env bash
# byobu
cd /root/
byobu new-session -d -n - "your command one"
byobu new-window -n - "your command ..."
byobu new-window -n - "your command ..."
byobu new-window -n - "your command ..."

这个脚本在登录后,执行下,确实能达到预想的效果,但是自动执行却不可以。。。

ssh

最后无奈之下使用了简单粗暴的办法,在/etc/rc.local中添加一行:
ssh -p22222 -i /root/.ssh/id_rsa root@localhost /etc/init.d/gshmu.sh

default shell

如果想ssh登录默认使用byobu,可以修改/etc/passwd中指定的默认shell。注意:默认的shell还有/bin/false/usr/sbin/nologindaemon专用的,禁止登录用的。还有一种/bin/rbash,改天有时间,容我细细道来。

END

程序猿都是有偏执的,预想的事情终于实现了,VPS重启后,登录上去的界面好熟悉。

multi-system

中文名:《我把双系统放入vBox并行》
WIN7HD
双系统同时运行:宿主机Ubuntu,虚拟机DELL9020原装“正版”Win7。

Linux

我用Linux办公,不喜盗版讨厌弹窗等等,不过我觉得用Linux是不需要理由的。领来新机直接U盘装Ubuntu 14.04 x64,看到大家用Windows居多,所以本着有备无患留下了Windows,grub直接引导就变成双系统,硬盘分区如下:

1
2
3
4
5
6
7
8
9
~$ lsblk 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 931.5G 0 disk
├─sda1 8:1 0 100M 0 part
├─sda2 8:2 0 196.7G 0 part
├─sda3 8:3 0 1K 0 part
├─sda5 8:5 0 186.3G 0 part /
└─sda6 8:6 0 279.4G 0 part /home

可恶的Windows占用了两个主分区,一个是所谓的boot。我把Linux装到了逻辑分区,这个无所谓了,grub大叔能叫起床就OK了。(sda3是逻辑分区的标识,Linux我只分了两个,还预留了200G的空白分区,备用)

Win

我不用Windows系统,一直都是Ubuntu一个系统,最多考试什么需要IE的场合用下。然而有一天,小鬼(一个不支持Linux的所谓互联网大公司,不支持也就罢了,源里还有个不能用的软件拉嘲讽)作祟,Web版本也不让用了,开源大神一度辛苦抓包维护的pidgin插件lwqq不能用了。
最不折腾的方案是虚拟机了,然而我一个懒人,懒得下镜像,懒得装盗版系统,懒得下直接下不确定安全的vmdk/vdi文件用,就想用现成的系统。有句话叫:没有做不到,只有想不到。虚拟的磁盘文件都可以,然而我有真的,不用白不用。

折腾

我最不喜欢折腾,Linux下我不会在乎系统多起个服务进程的,但是Windows没用的开机启动,用不着的服务关一个少一个,少一个系统就少一份维护。我真的最不喜欢折腾,软件都是直接装源里的,除非有bug不想忍时才偶尔编译安装新版本。

开工

首先创建一个类似链接文件的虚拟机磁盘文件,命令如下:

1
vboxmanage internalcommands createrawvmdk -filename /path/to/new/vmlink/file/Win7HD.vmdk -rawdisk /dev/sda -partitions 1,2 -mbr /path/to/mbr/win7.mbr -relative

MBR

大家都知道MBR,我就不卖弄了,有真的最好,没有真的弄个假的先凑合下吧。安装完Linux后我的MBR默认引导GRUB,可以导出一份(dd/fdisk/gdisk等等),也可以先搞个假的512bytes 二进制文件。(虚拟机可以有自己的MBR,赞赞)

chmod

默认/dev/sda*是没有写权限的,so (作为一个懒人,必须搞个自动的: update-rc.d)

1
sudo chmod o+rw /dev/sda1 /dev/sda2

建议用命令,也可以自己写个sh放到对应的/etc/rc?.d/下面(利用rc.d启动级别,密码可以跳过。)

VBox

含有自己mbr的虚拟机磁盘镜像文件建立好了,如下:

1
2
3
$ ll Win7HD*
-rw------- 1 gshmu gshmu 65536 5月 5 2015 Win7HD-pt.vmdk
-rw------- 1 gshmu gshmu 857 1月 11 08:52 Win7HD.vmdk

下来当然创建虚拟机,同时添加磁盘文件(注:仅需要添加Win7HD.vmdk这一个文件就好)

FIX

如果你的mbr是真的,如我在装Ubuntu之前备份了mbr这步可以跳过。修复MBR对大家不是什么难题,最方便的是在虚拟机中挂载个iso镜像文件,启动顺序设置CD优先启动。
我挂载了个PE的iso文件,进入PE直接修复引导…
取消挂载的iso文件,或者改下顺序,然后,重启~ 双系统一起运行,竣工 吼吼!

Other

  • 网络:虚拟机网络建议选择NAT模式,然后给虚拟机分配个IP。起初我的双系统是同样的IP,不会存在冲突,现在只好再申请一个IP分配上,使用NAT方便宿主机和虚拟机通信。
  • 软件:Windows虚拟机下输入法我用小狼毫,通讯软件我用Lite版本。
  • 操作:起初我尝试过用远程登录虚拟机的方式,因为虚拟机快捷键是系统级别的,远程桌面可以降到软件级,方便统一操作,但还是鸡肋。最后修改虚拟机设置“Auto Capture Keyboard”,结合工作空间Workspaces给虚拟机单用一个工作空间。
  • U: 虚拟机可以保存状态,而不需要每次开机,又一次效率提升。

END

本文介绍了借助vbox并行运行双系统的实践,提供了Linux下部分关键命令。我想做一款IM,一款立足Linux的IM,一款和世界共通的IM,然而在“鸡犬之声相闻(lǎo sǐ bù xiāng wǎng lái)”的中国(中:通假字),很难作出这样的IM,有很多做好的却又被不可用。最后的最后给无数开源贡献者点个赞…

wake on lan/wan

我是怎么远程开启我家电脑的WOL:远程登录后只要没有限制,大家都会关机,然而今天我们讨论的话题是远程开机——WakeOnLan…

APP

WOL这款应用是跨平台的,github上有个用perl写的,原先perl写的不支持域名,不过你可以找到我修改后支持域名的那款。
那次分享我使用的手机远程开启我家电脑,之所以选择手机是因为手机方便,选择的应用是:net.mafro.android.wakeonlan (Google Play 的应用id,搜WOL有好几款,我选这个的原因是小,需要权限少)

Let’s GO

在应用界面配上我家路由器的IP(我用DDNS有一个免费域名),Port还有需要开机的MAC,如下图:
WOL APP
填好表单,点击发送,会产生一个“Magic Packet”,并发出…

DDNS

TP-LINK路由器一般默认就有,注册账号,在路由器配置自动登录即可,我家宽带是拨号上网,没有固定IP(但庆幸的是是一个外网IP,电信曾 调整成内网映射IP,我投诉后又恢复成外网IP),DDNS负责登录后将路由器外网地址映射到一个域名上,如我的是xxx.oicp.net,通 过DNS查询就获得了路由器的真实地址,为了保证可用性,我将路由联网模式改成了:总是连接,而不是默认的按需连接(按需连接,只会在内部有网络 访问时才路由器才真正联网,我需要从外部连,所以改成总是)

Magic Packet

具体定义请参考维基百科,一个具有特殊头部的UDP包,主要信息是网卡MAC信息重复三次

UDP转发

发出的“Magic Packet”通过网络到达了路由器,如果你家路由器支持广播,那么恭喜你,你将该条消息直接在路由器内网广播即可,默认端口是9或者7…
如果不支持广播,先是设置端口转发,你家电脑需要设置静态IP,或者通过路由器绑定一个IP,同时你还需要ARP绑定,一切配置 OK,“Magic Packet”可以到达电脑网卡了…

Wake

问题成功从Wake On Wan 转化成 Wake On Lan,进入电脑BIOS设置下,允许网卡唤醒(只要你家的电脑不是古董,这个功能应该都有,还有就是网卡也需要支持),如图:
BIOS SETTING
注:Windows 可能需要进系统,网卡设置允许“Magic Package”魔包唤醒,如下图:
Windows SETTING

安全&应用

Lan是相对安全的,路由器可以通过MAC过滤,不要泄漏你的MAC等信息。这个仅能开机和关机,对于几乎不会关机的服务器来说,开机没什么不安 全的。(确保你的PC像服务器那样安全)
最佳应用是用在托管机房的远程开机,我们机房的测试机等也可以采用……

总结

本文从手机发出UDP包,简述了远程开机原理及实现,如果你需要配置远程开机,可能需要将整个过程倒过来,先在局域网内广播唤醒,最后用手机数据 流量或其他电脑远程唤醒(开机或从待机欢迎)。

a cup of vps

习惯了谷歌搜索,还真的离不开了… (注:本文更新过)

Buy VPS

购买个VPS吧,选了款便宜点的,bandwagon 19.9$/Y(支持支付宝付款),这个我是新来的,就不搬门弄斧了…
购买成功后,操作系统选Ubuntu16.04,和我现在用的一样,主要是方便,首次密码登录添加公钥,安卓可以使用JuiceSSH客户端。。。

shadowsocks

先装个服务吧,本着不折腾的折腾原则。

server

先启动个服务吧,脚本奉上:

1
apt-get update && apt-get -y install python-pip && pip install -U pip && pip install shadowsocks

安装完毕,可以直接用命令ssserver启动服务,推荐写个json,参数不懂问man老师,或者帮助,官网文档都可以。

1
2
3
4
5
6
7
8
9
10
11
echo '{
"server":"0.0.0.0",
"server_port":88,
"password":"yourpassword",
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}
' > /etc/shadowsocks.json

ssserver -c /etc/shadowsocks.json

至此服务端启动OK,其中端口和密码自己设置。

client

安装方式一样,只是启动的时候用sslocal命令,可以直接指定参数启动,也可以写个配置文件。
推荐火狐浏览器,因为火狐浏览器有单独的网络配置,而chrome等用的系统代理配置。

nginx

大家对nginx和gunicorn(uwsgi的一种)一定不陌生,其中有个名词叫反向代理,我的理解nginx反向代理是,自己有的(像js,css之类的)直接给你,没有的,去找gunicorn取来后给你。

Apply

“Nginx, Show me google homepage…” 没有取了来给我,哈哈哈 :)
不要想太复杂,Github上有现成的(我不喜欢编译,但偶尔编译下还是可以滴),注有个组建我更新了下,然后configure命令修改后是下面这样的:(前两个版本号稍有更新)

1
2
3
4
5
6
7
8
9
10
11
apt-get -y install build-essential git gcc g++ make && mkdir wen.lu && cd wen.lu && git clone https://github.com/cuber/ngx_http_google_filter_module && git clone https://github.com/yaoweibin/ngx_http_substitutions_filter_module && wget "http://nginx.org/download/nginx-1.10.2.tar.gz" && tar xzvf nginx-1.10.2.tar.gz && wget "ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz" && tar xzvf pcre-8.39.tar.gz && wget "http://zlib.net/zlib-1.2.8.tar.gz" && tar xzvf zlib-1.2.8.tar.gz &&  wget "https://www.openssl.org/source/openssl-1.1.0c.tar.gz" && tar xzvf openssl-1.1.0c.tar.gz && cd nginx-1.10.2 && \
./configure \
--prefix=/opt/nginx-1.10.2 \
--with-pcre=../pcre-8.39 \
--with-openssl=../openssl-1.1.0c \
--with-zlib=../zlib-1.2.8 \
--with-http_ssl_module \
--add-module=../ngx_http_google_filter_module \
--add-module=../ngx_http_substitutions_filter_module && \
make && \
make install

下来修改下配置,修改的地方如下:

1
2
3
4
5
resolver 8.8.8.8;
location / {
google on;
google_language "ca";
}

然后启动ngins,访问[My VPS HIDE],久违的谷歌出现了。
http支持了,https如今也已经支持,使用Let’s encrypt证书,使用证书需要域名,免费域名申请的较晚,所以https及证书支持较晚。

the End

all in one last. 感谢阅读,我本地代理默认监听0.0.0.0,局域网的小伙伴有福了哈。

mailcap

Tencent === Trash,微云下载的文件总是用gedit打开,firefox如是说。有谁能想到,腾讯微云下载的文件有着一样错误的Content-Type: "application/octet-stream"

The Way to fix it

Ubuntu 下,命令行执行:

1
echo 'application/octet-stream; nautilus --no-default-window --no-desktop %s; test=test -n "$DISPLAY"' >> ~/.mailcap

其实就是向家目录下.mailcap文件追加上述命令单引号内中的内容。(文件不存在则新建)

reason

微云下载文件时,HTTP Response headers,中使用了不是Trash不可能使用的Content-Type: "application/octet-stream",这是什么鬼文件,系统说他不认识,你试试gedit吧。

上面的解决方法是,application/octet-stream类型的文件用nautilus打开(在文件夹中显示),之所以没有定义到确定的应用,因为我常用的有zip和pdf两种,只好折中使用nautilus了。

总结

firefox中下载的文件总是用gedit打开,我气愤不止一次了。我用Linux,为什么用QQ,因为有人用QQ,为什么是微云,因为有用QQ发的文件,我只好借用微云,然后浏览器下载下来。

感谢IRC: Cork

bash

my bash

声明

本文不是介绍bash的,当然也不含有bash历史,本文写的很随意,如果你不喜欢这些,请移步。
有高见,欢迎来IRC: /join #zh-cn

PS1

整一个个性的提示符PS1,我的提示符:
^_^:~$

export PS1=”[\e[00;37m]\n[\e[0m][\e[00;34m]^_^[\e[0m][\e[01;31m]:[\e[0m][\e[00;36m]\w[\e[0m][\e[01;33m]\$[\e[0m][\e[00;37m] [\e[0m]“

点击上面的提示符 or bashrcgenerator,定制一个属于自己的提示符吧。
使用该提示符,将生成的代码复制粘贴到~/.bashrc文件即可。(其实是export一个常量PS1,所以有必要放在PS1赋值的后边,以便生效。)

唤醒历史命令补全

将下述代码复制粘贴到~/.bashrc文件,然后输入部分命令再使用上下键试试。

bind ‘“\e[A”: history-search-backward’

bind ‘“\e[B”: history-search-forward’

控制命令$?

  • ;: 组合多个命令,按循序执行。
  • &: 使命令开启一个子Shelll并在后台执行。
  • &&: 前面命令成功后,执行后边命令。
  • ||: 前面命令执行失败后,执行后边的命令。

重定向

  • >: 重定向输出。(新建,会覆盖)
  • >>: 重定向追加输出。(追加,会新建)
  • <: 重定向输入,一般从文件读入等。
  • <<: << "str",重定向输入,遇到str自动结束。
  • |: 管道,不解释了。*****五星级。

  • 标准输入(stdin):代码为0,0< or 0<<
  • 标准输出(stdout):代码为1,1> or 1>>
  • 错误输出(stderr):代码为2,2> or 2>>
  • eg: COMMAND &>/dev/null & or COMMAND 1>/dev/null 2>&1 & # 重定向输入,并后台运行。

.bashrc at Ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alias ga='git add'
alias gb='git branch'
alias gc='git commit'
alias gd='git diff'
alias gf='git fetch'
alias gl='git log'
alias gs='git status'
alias go='git checkout'

export PS1="\[\e[00;37m\]\n\[\e[0m\]\[\e[00;34m\]^_^\[\e[0m\]\[\e[01;31m\]:\[\e[0m\]\[\e[00;36m\]\w\[\e[0m\]\[\e[01;33m\]\\$\[\e[0m\]\[\e[00;37m\] \[\e[0m\]"

. /usr/share/bash-completion/completions/git # about my git completions
__git_complete ga _git_add
__git_complete gb _git_branch
__git_complete gc _git_commit
__git_complete gd _git_diff
__git_complete gf _git_fetch
__git_complete gl _git_log
__git_complete go _git_checkout

经过一番折腾,激活了git的自动完成,有自动完成的别名才有意义。