Showing posts with label shell. Show all posts
Showing posts with label shell. Show all posts

Sunday, June 21, 2009

神奇的 ssh 端口转发

ssh 端口转发。

作用:
1 不同的内网之间互联;
    假设有 2 台在不同网段之间的机器需要连接,那么在 A 网段用一台机器 ssh 到公网 abc.com 上,绑定一个 abc.com 的端口 x 到 A 网的任意 ip:port,
    然后在任意地方访问 abc.com:x 就等于访问之前绑定的 A 网段的 ip:port,这样,几乎任何服务都可以传递过来,包括远程连接,打印机等

2 发布本地服务到外网;
   跟上面类似,只要将远程主机的端口绑定到本地机器即可。

3 欺骗程序(比如 RDC 的 mac 版本不能指定端口,如果服务器设置了非默认端口,则可以通过 ssh 在本机转发一下);
   这个纯粹的是做端口转发,本机就可以搞定。

4 用作代理服务器。
   用到 -D 参数,配合 pac 文件很好用。



参考:
理解这个得到 agentzh 的大力帮助。
这篇文章也比较好。

Monday, March 9, 2009

gnu coreutils 之 tar

windows 下我们用 winRAR 来压缩、打包文件,相当爽。
不过,不知大家发现没有,其实用 winRAR 压缩时选择 zip 格式通常会快很多(代价是会比 rar 格式大一些,不过差不多少)。
在 unix 类系统下面,打包压缩通常就是 tar 了。曾经经过相当长时间的折磨,现在来总结一些 tar 的用法。那是相当的简单。
tar cf abc.tar f1.txt f2.txt
命令 [tar] + 压缩命令 [c] + 指定文件命令 [f] + 指定的文件名 [abc.tar] + 要压缩的文件列表 [f1.txt f2.txt]
以上就把 f1 和 f2 两个 txt 文件打包到 abc.tar 里了。这里比较怪异的是 abc.tar 跟 f1.txt 加上 f2.txt 一样大,没有压缩。是不是很逊?还好,继续。
tar zcf abc.tar.gz f1.txt f2.txt
在刚才的命令中加一个 [z],把文件名改一下,那么这个打出来的包就是压缩过的了。 为啥来,因为 [z] 的意思是打包的同时给压缩一下,压缩成 gzip 格式。
tar 内置支持的格式还有一个,比较厉害 bzip2。
tar jcf abc.tar.bz2 f1.txt f2.txt
把上面命令里的 [z] 换成 [j] 即可。
通常,这样压缩出来比 gzip 要小一点(当然,更加耗时),喜好哪种格式看各位吧。
要压缩的文件列表也可以加文件夹进去,那么这个文件夹就可以打包了。
然后看如何解压缩。
tar xf abc.tar
命令 [tar] + 解压命令 [x] + 指定文件命令 [f] + 指定的文件名 [abc.tar]
这个命令就会把包里文件释放出来了。
如果我之前压缩成 gzip 了怎么解压呢?
tar zxf abc.tar.gz
告诉 tar 这个文件是 gzip 格式就行,就是加一个 [z] 参数。
同理
tar jxf abc.tar.bz2
OK,
基本上都搞定了。
还是比较简单的。吧?
再说一些吧,
打包的时候尽量打包目录,这样别人解压缩的时候就不会解压出一堆文件,看的眼花缭乱。
上面各个示例命令的参数里面可以再加一个 v,
可以显示 tar 工作的详细内容,否则他就悄悄的干活,干完了就跑了,你也不知道他都干了些啥。
tar vjxf abc.tar.bz2
应该挺简单的吧。
我学习的时候最先看到的就是最长的 4 个参数一起,根本搞不清都啥跟啥,只能每次用的时候现查。
希望这些文字可以帮助你快一点掌握 tar 的用法。
:)

Wednesday, February 18, 2009

[译] 使用 ssh 执行远程命令

原文:Run Remote Commands with SSH

ssh 是一个神奇的工具。

你可以使用它连接2台电脑,或者在不登录到终端的情况下在远程机器上执行一段命令。

下面演示如何查看系统磁盘使用情况:

root@admin:~ # ssh root@www 'df -h'
Filesystem Size Used Avail Use% Mounted on
/dev/ubda 3.5G 2.1G 1.4G 61% /
tmpfs 96M 4.0K 96M 1% /dev/shm

是不是很神奇,但好像不是非常有用。 如果你在多台服务器上配置好 public/private key pairs,然后就可以肆意在那些机器上。具体情况,下回分解。

现在呢,你可以通过已有的知识来做很多事情,比如查询服务器上 web服务 的进程数,而不用登录到服务器上然后敲入那些命令。 你要做的只是将要执行的命令用引号引起来然后放到 ssh 命令后面,就行了。 下面给出一个例子:用 root 帐号登录到服务器并查询服务器上的所有进程,将结果通过 pipes 传给本地,通过 grep apache 获得所有 apache 进程,然后通过 grep -v grep 过滤掉 grep apache 命令本身,这样就只剩下 apache 进程了,然后通过 wc -l 就能得到所有的 apache 进程数了。

root@admin:~ # ssh root@www 'ps -ef | grep apache | grep -v grep | wc -l'
11

或者看看如何显示系统的资源使用情况和最占用 CPU 的进程:

root@www:~ # ssh root@www 'top -b -n 1 | head -n 8'
top - 11:01:04 up 20 days, 6:47, 1 user, load average: 0.44, 0.21, 0.09
Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.7% user, 1.5% system, 0.0% nice, 96.8% idle
Mem: 195620k total, 186276k used, 9344k free, 16380k buffers
Swap: 525304k total, 516k used, 524788k free, 26912k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
 7399 root 19 0 936 936 740 R 9.2 0.5 0:00.20 top

或者只是看看都谁登录呢:

root@www:~ # ssh root@www 'who'
brock pts/0 Oct 21 10:31 (75.72.194.149)
jim pts/1 Oct 25 06:25 (128.101.163.128)

如果你想知道怎么样才能在执行上面命令的时候不用输入密码,你可以看看这一篇 设置 SSH keys ,下次登录就不用输入密码了

[译] 设置 SSH keys ,下次登录就不用输入密码了

原文:Setting up SSH keys for access without a password