SSH 端口转发

简介

ssh 端口转发是建立了一个 ssh 隧道,原来传输的数据通过这个隧道来传输。先来说说大家最熟悉的动态转发。

动态转发

ssh -D <local port> <SSH server>

这种使用方法应该都很熟悉,(能干嘛?:D),它能动态地将各种数据转发到远程的端口上,相当于在本发建立了一个 sock5 的代理。

本地转发

本地端口转发的命令格式是:

ssh -L <local port>:<remote host>:<remote prot> <SSH server>

使用场景:假设我们现在有一台 smtp 服务器 server,但它被监听在 127.0.0.1:25,也就是说只允许来自自己的请求,所以我们不能在远程访问到它的 25 端口。但是 server 允许远程的 ssh 连接。这个时候在本地执行:

ssh -L 2525:localhost:25 server

这个时候我们就能通过访问 localhost:2525 来访问到 server 中的 25 端口了。

还有一种情况:假设现在 local 不能访问到 ser2 的 23 端口,但 local 能访问到 ser1 的 ssh,而且 ser1 也能访问到 ser2 的 23 端口。

这个时候,我们只需要在本地运行:

ssh -L 2323:ser2:23 ser1

这个时候,我们只要访问 localhost:2323 就能通过 ser1 访问 ser2:23 了。

远程转发

它的命令格式是:

ssh -R <local port>:<remote host>:<remote port> <SSH server>

使用场景:假设现在有一台 web 服务器(srv1)处于局域网中,它不能被广域网访问到,另一台服务器(srv2)处于广域网中。srv1 能 ssh 到 srv2,这个时候想让 srv2 访问到 srv1 的 web 服务。在 srv1 中执行

ssh -R 8088:srv1:80 ser2

这个时候就能在 srv2 中访问 localhost:8088 就能访问到 srv1 中的 web 服务器了。

这个时候 srv2 的 8088 只能监听在 127.0.0.1 的,要想允许外部访问,可改写为 -R *:8088:srv1:80,并确保在服务器的 sshd_config 中打开了 GatewayPorts yes 选项。

X 协议转发

ssh -X <SSH Server>

登录完成后,就可以直接在 shell 里执行远程的 X 应用,这里建立的 X 转发会自动设置 DISPLAY 环境变量,通常会被设置成 localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

常用参数

端口转发常与以下参数配合使用:

选项 说明
-f ssh将在后台运行
-N 不执行命令,仅转发端口
-C 压缩传送的数据
-i 使用指定的密钥登录
-g 创建监听 0.0.0.0 的端口

参考资料

  1. SSH端口转发
  2. 实战 SSH 端口转发

Debian 下安装 NFS 服务器

NFS是网络文件共享系统。在网络中,这个协议的使用非常广泛,也是基于共享,网络才有了今天的发展。下面是 Debian NFS 服务器的一些安装和设置。

Debian下安装NFS服务器

安装Debian NFS服务器端:
# aptitude install nfs-common nfs-kernel-server portmap

在客户端则需要安装:
# aptitude install nfs-common portmap

启动服务: # /etc/init.d/nfs-kernel-server start
停止服务: # /etc/init.d/nfs-kernel-server stop
重启服务: # /etc/init.d/nfs-kernel-server restart

Debian NFS服务器配置:

1、创建共享目录:

# mkdir /home/share
# chown nobody.nogroup /home/share

2、创建或修改/etc/exports配置文件

当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:

[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]

Debian NFS服务器共享的常用参数:

ro                    只读访问 
rw                    读写访问 
sync                  所有数据在请求时写入共享 
async                 NFS在写入数据前可以相应请求 
secure                NFS通过1024以下的安全TCP/IP端口发送 
insecure              NFS通过1024以上的端口发送 
wdelay                如果多个用户要写入NFS目录,则归组写入(默认) 
no_wdelay             如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 
hide                  在NFS共享目录中不共享其子目录 
no_hide               共享NFS目录的子目录 
subtree_check         如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) 
no_subtree_check      和上面相对,不检查父目录权限 
all_squash            共享文件的UID和GID映射匿名用户anonymous,适合公用目录。 
no_all_squash         保留共享文件的UID和GID(默认) 
root_squash           root用户的所有请求映射成如anonymous用户一样的权限(默认) 
no_root_squas         root用户具有根目录的完全管理访问权限 
anonuid=xxx           指定NFS服务器/etc/passwd文件中匿名用户的UID 
anongid=xxx           指定NFS服务器/etc/passwd文件中匿名用户的GID

Debian NFS服务器配置文件/etc/exports内容如下:

$ cat /etc/exports
/home/share 192.168.102.15(rw,sync) *(ro)

配置说明: 对192.168.102.15赋予读写权限,其他机器仅有只读权限。

重启服务器: # /etc/init.d/nfs-kernel-server restart

3、在客户机上查看NFS服务器的资源共享情况:# showmount -e 192.168.102.47

4、在客户端使用mount命令挂载共享目录:# mount 192.168.102.47:/home/share /mnt

是不是我们每次修改了配置文件都需要重启Debian NFS服务器服务呢? 这个时候我们就可以用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效。

比如:

# exportfs -au #卸载所有共享目录
# exportfs -rv #重新共享所有目录并输出详细信息

exportfs 命令有软件包 nfs-kernel-server 提供,详细的 exportfs 命令说明请查看:

# man exportfs

参考:http://wiki.debian.org.hk/w/Share_files_with_NFS

用rsync+ssh进行备份

利用 rsync + ssh 可以很快速地对网站进行异地备份。步骤也很简单:

1、先用ssh-keygen生成一对keygen,可以免密码进行访问,可选。

2、确认本机与过程机都有安装 rsync,因为 ssh session 会自己执行 rsync –server 以便两端算签章。

3、使用如下命令进行备份

指令1 – 远端 备份回 本端:

rsync -avl --delete -e ssh server_hostname:/var/lib/mysql/ /backup/

指令2 – 本端 传送到 远端:

rsync -avl --delete -e ssh /var/lib/mysql server_hostname:/backup/

如果 ssh 端口非默认的 22,则可以

rsync -avl --delete -e 'ssh -o port=PROT' /var/lib/mysql server_hostname:/backup/

继续阅读用rsync+ssh进行备份

Shell 快捷键(二)

Shell 快捷键 中,对 Linux Shell 下 Emacs 分割的快捷键组合进行
了整理和总结,为了方便对比记忆,这里重新根据功能进行归类。

光标移动

命令 说明
Alt + b 后移一个单词
Alt + f 前移一个单词
Ctrl + b 后移一个字符
Ctrl + f 前移一个字符
Ctrl + a 把光标移到行首
Ctrl + e 把光标移到行尾
ctrl + ← 光标移动到前一个单词开头
ctrl + → 光标移动到后一个单词结尾
Ctrl + x Ctrl + x 在 EOL 和当前位置移动光标

输入编辑

命令 说明
Ctrl + h 删除前一字符
Ctrl + d 删除当前字符
Ctrl + k 删除当前字符到行末
Ctrl + u 删除行首到当前字符
Ctrl + w 删除单词到当前字符
Alt + d 从当前位置向后删除单词
Alt + ← 从当前位置向前删除单词
—————- —————————————————————
Esc + t 互换相邻两个单词
Alt + t 互换相邻两个单词
Ctrl + t 互换相邻两个字符
—————- —————————————————————
ctrl + ? 撤消前一次输入
Alt + r 撤消前一次动作
—————- —————————————————————
Alt + l 小写当前单词
Alt + u 大写当前单词
Alt + c 首字母大写当前单词
—————- —————————————————————
^oldstr^newstr 替换前一次命令中字符串

终端管理

命令 说明
Ctrl + s 锁住终端
Ctrl + q 解锁终端
Ctrl + l 清除终端
Ctrl + d 退出终端
————– —————————————————————–
Ctrl + c 中止命令
Ctrl + z 挂起命令
ctrl + o 重复执行命令

命令历史

命令 说明
Ctrl + r 向后查询历史,增量地
Ctrl + s 向前查询历史,增量地
Alt + p 向后查询历史,非增量地
Alt + n 向前查询历史,非增量地
————— —————————————————————-
Ctrl + p / ↑ 显示上一条命令
Ctrl + n / ↓ 显示下一条命令
Alt + < 移动到历史的首行
Alt + > 移动到历史的末行
————— —————————————————————-
Alt + . 插入最后一个参数
Alt + _ 插入最后一个参数
Esc + . 插入最后一个参数
Esc + _ 插入最后一个参数
————— —————————————————————-
Ctrl + y 粘贴刚才所删除的字符
Ctrl + Alt + y 插入上条命令的第一个参数

自动完成

命令 说明
Alt + / 尝试自动完成文件名
Alt + ? 显示当前自动完成列表
Alt + * 插入所有可能自动完成

其他

命令 说明
Ctrl + i 同 Tab
Ctrl + j 同 Enter
Ctrl + v CHAR 输入特殊字符
Ctrl + x @ 显示所有的可用的主机名自动完成
Ctrl + x Ctrl + e 使用 vim 写入 script 一次执行
2T 命令行补全
(string)2T 命令行补全
$2T 列出系统变量
=2T 列出当前目录
/2T 显示整个目录结构,包括隐藏文件
./2T 只显示子目录,包括隐藏目录
*2T 只显示子目录,不包括隐藏目录
@2T “/etc/hosts” 文件的条目
~2T “/etc/passwd” 文件中系统所有的当前用户

Shell 快捷键

在使用 Shell 进行 Linux 操作时,经常需要编辑大段的代码,如果仅仅使用键盘的
Delete 和 Backspace 键,那是一件非常折磨人的事情。我们以 Linux 默认的 Bash
Shell 为例,他可以设定为多种 Mode,使其操作习惯类似于一些熟悉的编辑器,比如
emacs 或 vi。

  • 列出所有 Mode

    set -o

  • 使用 vi 操作习惯來操作 Bash Shell

    set -o vi

  • 使用 emacs 的操作习惯来操作 Bash Shell,默认即为此 Mode

    set -o emacs

下面总结以下 Bash Shell 采用默认 emacs Mode 时可用的一些快捷键,能够极大提高
Shell 的操作效率。

继续阅读Shell 快捷键

sshfs的配置

上个月新买了一个本本电脑,所以女人的旧电脑就算淘汰下来了。但我还得用我那07年的老爷机,在做开发上还是有些吃力,因此决定把原来共存于同一个系统的桌面环境和服务器环境分开,将服务器环境转移到淘汰下来的老爷机上,所以在上面装了个FreeBSD,以方便维护。但也因此出现一个问题,服务器的数据应该放在哪里,桌面机上还是服务器机器上。由于淘汰下来的机器可能会被我用来折腾,如挨个装发得版,或测试其它东西,所以我想把数据还是放在桌面机上;问题又来了,服务器如何能快速有效地访问这些数据,而不影响服务器的正常运作呢。

首先,想到的是用netbeans的远程站点功能。随后,又想到了利用 ssh 挂载远程文件系统的功能,把 Desktop 上的文件系统通过 sshfs 挂载到 Server 上。由于第一种方案需要依赖netbeans,所以我打算用第二种方案。

一、安装配置 SSHFS

安装 sshfs ,这个在 Arch 下用 pacman 安装即可,其它发行版应该都有相应的包管理器可以解决。在安装好 sshfs 之后,可以使用 # sshfs [USER]@[HOST]:[DIR] [MOUNTPOINT] [OPTIONS] 挂载远程的文件系统,使用 # fusermount -u [MOUNTPOINT] 进行卸载。当然,前提是远程系统上有 ssh daemon 运行。另外一个比较有用的参数是 -o allow_other,否则挂载的文件系统只有当前用户可用,其他用户无法访问。这样,就可以像操作本地文件一样来操作远程文件了。

继续阅读sshfs的配置

如何在Linux下挂载带分区的镜像文件

之前一直有折腾ChromeOS,一位叫hexxeh的朋友一直有提供nightly build的镜像,所以免去了自己编译的烦恼。下载下来后,我打算修改一些东西后,再写入到U盘上,因为ChromeOS的映像文件是带有GPT分区的镜像,所以不能直接mount,需要在mount的时候的提供offset参数,即提供需要挂载的这个分区是从哪里开始的。像这样:

# sudo mount -o offset=xxx xxx.img /MOUNT/TO/DIR/

那么,如何得到这个offset的参数呢?我们可以用fdisk等工具来列出相关信息得到。不过,还有一个更NB的工具叫parted,一般可以在源里面找到。
继续阅读如何在Linux下挂载带分区的镜像文件

Linux下查看某进程的详细状态

Linux下用”ps”命令可以查看进程列表中某一个进程的内存及CPU占用信息,那么,如果想查看某一进程详细的状态信息应该如何去做呢。
其实Linux下进程的详细信息会被记录在/proc/PID/status文件中,其中PID为某个进程的Process ID。现在假设有个程序ID为788,那么我们只要

cat /proc/788/status

就可以看到788这个进程的详细信息了。至于如何得到PID,可以用”ps aux | grep ‘进程名'” 找到pid。
或者干脆用一行流:

cat /proc/`ps ax | grep mysql | awk '{print $1}' | head -1`/status

diff的使用及制作patch

VPS上的LANMP都是自己编译出来的,因为个人比较追求新的发布,所以一有新的版本发布,就会上down下来编译更新。之前都会对源码做些个人化的修改后再编译,就经常要对新的发布版本做一样的修改。经常性地这样手动更改很麻烦,所以就想到了制作patch补丁。

diff工具的使用

diff [OPTION]... FILES

FILES 表示多个文件或目录
说明:该命令告诉使用者,为了使文件,如FILES一致,需要修改它们的哪些行。如果用 “-“表示 FILES,则表示标准输入。如果 FILES 是目录,那么 diff 将使用该目录中的同名文件进行比较。
继续阅读diff的使用及制作patch