Archive

Posts Tagged ‘命令行’

SSH 命令的三种代理功能(-L/-R/-D)

February 25th, 2019 No comments

ssh 命令除了登陆外还有三种代理功能:

正向代理(-L):相当于 iptable 的 port forwarding
反向代理(-R):相当于 frp 或者 ngrok
socks5 代理(-D):相当于 ss/ssr
如要长期高效的服务,应使用对应的专用软件。如没法安装软件,比如当你处在限制环境下想要访问下某个不可达到的目标,或者某个临时需求,那么 ssh 就是你的兜底方案。

正向代理:

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

用法1:远程端口映射到其他机器

HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行:

HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC

这时访问 HostB:PortB 相当于访问 HostC:PortC(和 iptable 的 port-forwarding 类似)。

用法2:本地端口通过跳板映射到其他机器

HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行:

HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC  user@HostB

这时访问 HostA:PortA 相当于访问 HostC:PortC。

两种用法的区别是,第一种用法本地到跳板机 HostB 的数据是明文的,而第二种用法一般本地就是 HostA,访问本地的 PortA,数据被 ssh 加密传输给 HostB 又转发给 HostC:PortC。

反向代理:

所谓“反向代理”就是让远端启动端口,把远端端口数据转发到本地。

HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:

HostA$ ssh -R HostC:PortC:HostB:PortB  user@HostC

那么链接 HostC:PortC 就相当于链接 HostB:PortB。使用时需修改 HostC 的 /etc/ssh/sshd_config,添加:

GatewayPorts yes

相当于内网穿透,比如 HostA 和 HostB 是同一个内网下的两台可以互相访问的机器,HostC是外网跳板机,HostC不能访问 HostA,但是 HostA 可以访问 HostC。

Read more…

Categories: 未分类 Tags:

别让 cd 浪费你的时间

February 8th, 2019 4 comments

终端下工作最烦躁的就是路径切换,没有自动路径切换的帮助,就像在泥里走路,于是有了各种 autojump / z / fasd 等工具来提升路径切换的效率,今天向大家介绍一个更好用的工具:z.lua,用熟练了以后就像终端里溜冰,路劲切换从此指哪打哪。

z.lua 是一个会学习你使用习惯的 cd 命令,它会跟踪你在 shell 下访问过的路径,通过一套称为 Frecent 的机制(源自 Mozilla),经过一段简短的学习之后,z.lua 会帮你跳转到所有匹配正则关键字的路径里 Frecent 值最高的那条路径去。

正则将按顺序进行匹配,”z foo bar” 可以匹配到 /foo/bar ,但是不能匹配 /bar/foo。

特性说明:

  • 性能比 z.sh 快三倍,比 fasd / autojump 快十倍以上。
  • 支持 Posix Shell:bash, zsh, dash, sh, ash, busybox 等等。
  • 支持 Fish Shell,Power Shell 和 Windows cmd。
  • 使用增强匹配算法,更准确的带你去到你想去的地方。
  • 低占用,能够仅在当前路径改变时才更新数据库(将 $_ZL_ADD_ONCE 设成 1)。
  • 交互选择模式,如果有多个匹配结果的话,跳转前允许你进行选择。
  • 交互选择模式,支持使用 fzf 进行可视化结果筛选(可选)。
  • 快速跳转到父目录,或者项目根目录,代替反复 “cd ../../..” 。
  • 为不同的操作系统,不同的 Shell 程序提供统一的使用体验。
  • 兼容 lua 5.1, 5.2 和 5.3 以上版本。
  • 自包含且无额外依赖,单个 z.lua 文件完成所有工作。

软件安装:

将下面对应语句添加到你的 .bashrc / .zshrc / .profile 或者对应 shell 的初始化脚本末尾:

eval "$(lua /path/to/z.lua --init bash enhanced once echo)"    # BASH 初始化
eval "$(lua /path/to/z.lua --init zsh enhanced once echo)"     # ZSH 初始化
eval "$(lua /path/to/z.lua --init posix enhanced once echo)"   # 其他 Posix Shell 初始化
source (lua /path/to/z.lua --init fish enhanced once echo | psub)  # Fish Shell 初始化
iex ($(lua /path/to/z.lua --init powershell enhanced once echo) -join "`n") # Power Shell 初始化

然后重新登陆,即可使用。

用户评价:

“我喜欢它的原理,我在命令行下面的行为十分有规律,并且我十分懒惰,懒得管理和维护一套书签或者路径别名。“

“总之,z.lua 做到了它所宣称的目标。如果你需要快速的在目录间切换,它可能是最好的选择。“

”我终于可以在自己的树莓派1上使用 autojump 类似的功能了,而不用像以前传统 autojump 那样每次打开终端都要等待 30 秒。”

基本使用:

cd 到一个包含 foo 的目录:

z foo

cd 到一个以 foo 结尾的目录:

z foo$

对长路径使用多个关键字进行匹配:
假设路径历史数据库(~/.zlua)中有两条记录:

10   /home/user/work/inbox
30   /home/user/mail/inbox

“z in”将会跳转到 /home/user/mail/inbox 因为它有更高的权重,同时你可以传递更多参数给 z.lua 来更加精确的指明,如 “z w in” 则会让你跳到 /home/user/work/inbox。

交互选择:

使用 -i 参数进行跳转时, 如果有多个匹配结果,那么 z.lua 会给你显示一个列表:

$ z -i soft
3: 0.25   /home/data/software
2: 3.75   /home/skywind/tmp/comma/software
1: 21     /home/skywind/software
> {光标位置}

然后你按照最前面的序号输入你想要去的地方,比如输入 3 就会进入 /home/data/software。如果你不输入任何东西直接按回车,那么将会直接退出而不进行任何跳转。

PS:交互选择同时支持 “-I” 参数(大写 i),让你可以使用 fzf 在多项结果进行快速选择(如果系统里面安装了的话)。

快速回到父目录:

“-b” 选项可快速回到某一级父目录,避免重复输入 “cd ../../..”,一般把 “z -b” 别名成 “zb” 命令:

  • (没有参数):cd 到项目根目录,即跳转到父目录中包含 (.git/.svn/.hg) 的地方。
  • (单个参数):cd 到最近一级以关键字开头的父目录中。
  • (两个参数):对当前目录进行字符串替换,然后 cd 过去。

使用举例:

# 一直向上退到项目根目录(就是里面有一个 .git 目录的地方)
~/github/lorem/src/public$ zb
  => cd ~/github/lorem

# cd 到第一个以 g 开头的父目录
~/github/vimium/src/public$ zb g
  => cd ~/github

# 快速回到 site 目录
~/github/demo/src/org/main/site/utils/file/reader/whatever$ zb si
  => cd ~/github/demo/src/org/main/site

# 将 jekyll 替换为 ghost
~/github/jekyll/test$ zb jekyll ghost
  => cd ~/github/ghost/test

向后跳转同样也支持环境变量 $_ZL_ECHO(用来显示跳转结果),这样为搭配其他工具提供了可能性(并不需要改变当前工作目录):

# 假设我们位于 ~/github/vim/src/libvterm
# 打开 $_ZL_ECHO 用于在每次跳转后调用一次 pwd 显示当前目录
$ _ZL_ECHO=1

# 看看我项目根目录(有 .git 那个)目录里有什么?
$ ls -l `zb`
  => ls -l ~/github/vim

# 检查 "<项目根目录>/logs" 下面的日志
$ tail -f `zb`/logs/error.log
  => tail -f ~/github/vim/logs/error.log

# 查看一下某一级父目录里有些啥
$ ls -l `zb git`
  => ls -l ~/github

Bonus:“zb ..” 相当于 “cd ..”,“zb …” 相当于 “cd ../..”,而 “zb ….” 相当于 “cd ../../..” 等等。 最后 “zb ..20” 等同于调用 “cd ..” 二十次。

常用技巧:

推荐一些常用别名,放在你的配置文件中:

alias zc='z -c' # 严格匹配当前路径的子路径
alias zz='z -i' # 使用交互式选择模式
alias zf='z -I' # 使用 fzf 对多个结果进行选择
alias zb='z -b' # 快速回到父目录

z.lua 可以方便的导入 z.sh 的数据(他们格式相同):

cat ~/.z >> ~/.zlua

还可以导入 autojump 的数据:

FN="$HOME/.local/share/autojump/autojump.txt"
awk -F '\t' '{print $2 "|" $1 "|" 0}' $FN >> ~/.zlua

更多内容,参考项目文档:

https://github.com/skywind3000/z.lua

Categories: 随笔 Tags:

Nas 系统的虚拟化方案

January 21st, 2019 1 comment

对搞技术的人来说,Nas 是个理想的玩具,既然是程序员用的 Nas ,自然要专业一点,不能像小白一样买台威联通或者群晖往哪里一放就行,如果这样,就没有必要继续往下读了。

就像有人喜欢买成品车,有人喜欢自己改装车;有人喜欢傻瓜相机,有人喜欢机械相机。如果你喜欢 DIY,想让自己家里的硬件发挥更大用途,让自己的 nas 系统更专业些,那么请继续。

有人说,生命的意义在于奉献;还有人说,生命的意义在于付出;然而对于 Nas 玩家来说,生命的意义只有两个字 — “折腾”。

有人问:“Nas 还能玩出一朵花来?”,答案是:“当然能”,折腾 Nas 第一步就是上虚拟化环境,有这个基础,后面才能更好的搞其他东西。所以今天我们先把 Nas 虚拟化这个纲领性的问题给说清楚说透彻。

Nas 系统为什么要虚拟化?

首先是让一台物理机可以安装多个不同的隔离的操作系统,Nas 很多都是魔改 Linux,一机多用的话,除了可以自由的安装其他主流 Linux 发行版外,你还能装台 Windows 来跑迅雷。

其次,而对于程序员,往往还需要另外一个干净的标准 Linux 发行版作为一个开发/折腾的环境,比如 Ubuntu / Debian / Centos 这些,虚拟化后,你可以自由的折腾你的发行版,通过虚拟机隔离后,你乱折腾自己的开发环境也不会把 Nas 弄挂,把自己的数据弄飞。

最后,资源分配更加灵活,系统/磁盘级别的备份迁移和恢复也可以很方便的实现。

Read more…

Categories: 未分类 Tags:

KVM 虚拟化环境搭建 – WebVirtMgr

December 28th, 2018 1 comment

前文《KVM 虚拟化环境搭建 – ProxmoxVE》已经给大家介绍了开箱即用的 PVE 系统,PVE 是方便,但还是有几点问题:

第一:始终是商用软件,虽然可以免费用,但未来版本还免费么?商用的法律风险呢?

第二:黑箱化的系统,虽然基于 Debian ,但是深度改造,想搞点别的也不敢乱动。

第三:过分自动化,不能让我操作底层 libvirt/qemu 的各项细节配置。

PVE 是傻瓜相机,智能又复杂,对小白很友好;WebVirtMgr 是机械相机,简单而灵活。多一个选择始终是好事,何况我们说完 PVE 之后还介绍 WebVirtMgr,那肯定是有它不可代替的优势的。

不管你是在中小公司研究 IT 解决方案,还是搭建自己的 HomeLab,虚拟化是一个绕不过去的砍,现在的服务都不会直接启动在物理机上,成熟的架构基本都是:

物理机->虚拟化->容器

这样的三层架构,也就是说虚拟化是一切服务的基础。通过下面的步骤,让你拥有一套完全开源免费的,属于你自己的,没有任何版权和法律问题的虚拟化环境。

操作系统选择

发行版选择主要以 Debian/Ubuntu LTS Server 为主,二者我并无偏好,选择你趁手的即可。Debian 每两年一个大版本,Ubuntu LTS Server 也是每两年一个大版本。也就是说每年都有一个最新的,他们的支持周期都是五年以上,去年发布的 Debian 9 ,今年是 Ubuntu 18.04 LTS,明年又是 Debian 10。

安装依赖

新安装操作系统以后,先安装必备的包:

sudo apt-get install libvirt-daemon-system libvirt-clients
sudo apt-get install sasl2-bin libsasl2-modules bridge-utils

将 /etc/default/libvirtd 里面的一行 libvirtd_opts 改为:

libvirtd_opts="-l"

Read more…

Categories: 未分类 Tags:

提高效率从编写 init.sh 开始

November 17th, 2018 No comments

有部分人不太愿意定制自己的终端配置,因为:“服务器太多,怎么可能每台都去定制,所以都用默认配置,习惯了就好”。其实道理很简单,算笔账就清楚了,除非你是 SA 每天管理上千台服务器,程序员的话,每天接触的开发服务器也就五台以内。既然 90% 的利益都在那三五台机器上,还在纠结 10% 的事情,这就叫不明智。

还有人担心这 10% 的时间偶尔到裸环境下不适应了,所以拒绝 90% 的时间使用高级配置。这是我听过最荒谬的理由,我天天自己开车上下班,偶尔骑下自行车我也不会忘记怎么骑车。更不因为偶尔需要时怕不会骑了而把汽车卖了每天都坚持骑单车,或者干脆就拒绝学汽车驾驶,拒绝提高自己的车技。我路由器上连 bash 都没有,只有个 busybox 的残缺 shell ,照着理由我要去迁就路由器么?这种说法要不就是看不清楚自己核心利益在哪里,要不就是没体验过汽车快起来可以比单车快几倍。

何况不管是程序员还是 SA,做好配置的同步工作也就行了。如果可以花固定的时间,让终端工作效率提升一倍以上,这种一次性的投资为何不做呢?所以接下来讨论下终端环境下各种配置应该如何管理,如何同步的。

Read more…

Categories: 未分类 Tags:

KVM 虚拟化环境搭建 – ProxmoxVE

November 11th, 2018 No comments

送大家一套完全开源免费的 VmWare / vSphere 的代替方案,代价是稍微动一下手,收获是你再也不需要任何商用付费的虚拟机软件了。KVM 整套解决方案一般分三层:

  • KVM:内核级别的虚拟化功能,主要模拟指令执行和 I/O
  • QEMU:提供用户操作界面,VNC/SPICE 等远程终端服务
  • Libvirtd:虚拟化服务,运行在 Hypervisor 上提供 TCP 接口用于操作虚拟机的创建和启停

第一个是 Linux 内核自带,后两个是各大发行版自带的标准组件。这里的 qemu 不是原生的 Fabrice 的 qemu,而是定制的 kvm 版本的 qemu 。

你当然可以用 qemu-system-x86 程序写很长的一串参数来启动你的虚拟机,但是这样十分不友好,所以有了 Libvirtd 这个东西,将物理机的所有资源:存储/网络/CPU 管理起来,并且提供统一的服务接口。

那么 KVM + Libvirtd 有几种不同层次的玩法:

  • 初级:在 /etc/libvirtd/qemu 下面用 xml 描述每一台虚拟机的配置,然后用 virsh 在命令行管理虚拟机,最后用 VNC/SPICE 按照配置好的端口链接过去,模拟终端操作。
  • 中级:使用各种 libvirtd 的前端,比如基于桌面 GUI 的 Virt Manager 给你界面上直接编辑和管理虚拟机,桌面版本的 VNC/SPICE 会自动弹出来,像 VmWare 一样操作。
  • 高级:使用基于 Web 的各种 virt manager 进行集群管理,比如轻量级的 WebVirtMgr / Kimchi,适合小白的 Proxmox VE。基本是用 WebVnc/Web
  • 超级:上重量级的 OpenStack,搭配自己基于 libvirt (libvirtd 的客户端库,比如有 python-libvirt 的封装)写的各种自动化脚本。

前两种太弱智了,OpenStack 又基本需要一个 DevOps 团队才玩得转。所以作为个人或者中小团队,买了台硬件过来,想把它变成一套小型的阿里云,腾讯云的系统,可以在 web 上创建/配置虚拟机,装系统,管理硬件资源,进行迁移备份等,基本就是第三套解决方案。

不想折腾的话,最简单的做法是直接下载 ProxmoxVE 社区版的 ISO ,刻录到 U 盘里,按照安装普通操作系统一样的安装到物理机上,立马把你的物理机变成一台 Hypervisor:

Proxmox VE 安装后启动,你可以登陆进去,ProxmoxVE 基于 Debian 9 ,进去可以用 apt-get 进行版本升级。接着按提示打开网页:https://your-ip:8006/ 用系统 root 密码登陆:

ProxmoxVE 可以方便的管理各种硬件资源(计算,存储,网络)和虚拟机系统,你可以方便的新建一台虚拟机并进行硬件配置:

Read more…

Categories: 未分类 Tags:

WSL 服务自动启动的正确方法

October 26th, 2018 No comments

2018年 Windows 10 下的 WSL 已经可以保留后台进程了,从此后,用了十多年的 cygwin 基本失去了存在的价值了。网上有很多 WSL 自动启动服务的方法,但是都有些大大小小的问题,很多又是针对最老的 ubuntu16.04 发行版(输入 bash启动哪个),你如用商店里下载的最新的 WSL 版本 Debian9/Ubuntu18.04 就会出错。

所以正确在 WSL 里自动启动服务的方式有必要记录一下。

创建启动脚本:

进入任意 WSL 发行版中,创建并编辑文件:/etc/init.wsl

#! /bin/sh
/etc/init.d/cron $1
/etc/init.d/ssh $1
/etc/init.d/supervisor $1

里面调用了我们希望启动的三个服务的启动脚本,设置权限为可执行,所有者为 root,这时候可以通过:

sudo /etc/init.wsl [start|stop|restart]

来启停我们需要的服务,接着在 Windows 中,开始-运行,输入:

shell: startup

按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root /etc/init.wsl start", vbhide

这个脚本就会在你登陆的时候自动在名字为 “debian” 的 wsl 发行版中执行 /etc/init.wsl 启动我们的服务了,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide

而如果你不知道自己的 WSL 发行版叫做什么名字,可以用 “wsl -l” 来查看。不管你用最初的 bash (ubuntu 16.04) 还是商店里下载的 debian/ubuntu1804 都能顺利启动服务了。

WSL 中有很多有用的服务,你可以按需删改 /etc/init.wsl ,但没必要塞很多东西进去影响你的启动速度,比如 mysql/mongodb 这些重度服务,可以需要的时候再启动,用完就停了。

我自己用的比较多的服务就三个:sshd(启动了以后支持终端软件登陆wsl,像远程服务器一样操作),supervisord(用于托管其他服务,比如 ssr),crond(crontab,自由定制定时任务),大部分时候,用上面三个足以。

Categories: 未分类 Tags:

为什么说 zsh 是 shell 中的极品?

March 7th, 2018 1 comment

(这是之前我在知乎上回答的一个可能对大家有点用处的答案,关于 zsh 的一些演示)

色彩高亮

并不是传统基于正则表达式的色彩高亮,而是真的会判断你输入的是啥的色彩高亮:

白色代表普通命令或者程序,红色代表错误命令,这个很管用,你再一个个字母的敲命令,前面都是红色的,如果敲对了最后一个字母的话,你会看到整条命令连着前面的都变成了白色,代表你敲对了。以前无高亮的时候敲错了都不知道,还要往上翻着左右检查。下面青色的代表内建命令或者 alias (echo 和 ls ),这些都不是正则判断出来的,是真的去检查的。

细心的人会发现非零的错误码,也会高亮显示在最右边(上一条 data命令错误,返回127)。

命令提示

注意,命令提示和补全是两个完全不同的系统,很多时候提示比补全更有用:

你才输入完 “tar”命令,后面就用灰色给你提示 tar 命令的参数,而且是随着你动态输入完每一个字母不断修正变化:

比如你输入到 – 后,没有跟着它上面的提示,而是输入了一个c字母,它马上明白你是要压缩,不是解压,然后随即给出你压缩对应的命令提示。

这个命令提示是基于你的历史命令数据库进行分析的,随着你输入的命令越来越多,提示将会越来越准确和顺手,某些不常输入的命令特别管用,比如偶尔查看下网卡配置:

刚输入完:cat /etc/n 它后面已经猜出你可能要查看网卡配置了,然后马上给出你提示,用不着你 tab 补全半天,你才敲 gc ,它就猜测出你可能想运行 gcc,然后马上给出完整建议:

Read more…

Categories: 未分类 Tags:
Wordpress Social Share Plugin powered by Ultimatelysocial