2010年11月23日火曜日

SSH Tunnel

範例1:
在公司,透過外面的電腦當proxy,連到外面。
ssh -NfD 8888 remote_ip
-N : 不執行任何命令
-f : 在背景執行
-D : 建socks5 的proxy
這時候,瀏覽器和msn在socks 5 proxy設定的欄位填上localhost:8888 。
連出去的連驗就是加密,並且是穿過remot_ip的連線。
ssh -N -v -D 9999 tcm@203.152.206.211

範例2:
在公司,透過外面的電腦連BBS。
ssh -NfL 2323:bbs.gamer.com.tw:23 remote_ip
-L : 將local port 轉向
telnet localhost 2323 就可以連到巴哈,而且是加密的。
也可用PCManx連localhost 2323也是一樣的意思。
ssh -NfL 8080:192.168.20.125:80 tcm@203.152.206.211

範例3:
有時候假日,想要連回公司加個班。
但是公司是NAT,所以沒辦法這樣作。
可以運用TCP雙向傳輸的特性來辦到這件事。
ssh -NfR 2222:localhost:22 remote_ip
-R : 將remote port轉向
這時候,只要跑到remote_ip的機器上面
ssh localhost -p 2222
就會跑到在NAT後面,公司的機器。
簡單說就是開後門啦!

Reverse SSH Tunnel 反向打洞實錄

近來經手了幾個案子,其目標都是設計一台做特定用途的系統,但往往這台機器都會被鎖在防火牆後面,甚至不會連上網際網路,是完全封閉的環境。每當接近結案,將系統交到客戶手中以做最後的壓力測試時,便是痛苦的開始。怎麼說呢?因為當面對最後的大量測試,各種大大小小的臭蟲(Bugs)就會原形畢露,一一浮上臺面。而每次問題發生,便要千里迢迢趕到客戶那了解情況、解決問題。如果問題不大倒還好,一旦問題嚴重,被客戶關到三更半夜也是常有的事,更誇張的還必須每天都去報到。所以,為避免車程來回的時間和人力浪費,是否有可以遠端連線做處理呢?便思考起這問題。

雖然這些機器通常都不會有真實 IP,客戶也不會為了我們特別請 MIS 去開啟 NAT 或防火牆,但還好 SSH 提供了反向(Reverse)的機制讓我們可以連進去。其做法就是讓在客戶那的系統,透過 SSH 先連回我們自家有真實 IP 的主機,然後建立反向的通道即可。如此,我們便可從自家的主機,從 SSH 連回放在客戶那的系統。

實際的操作步驟:
# 首先,在客戶那理的機器下指令連回我們自己的 Server,並設定自己 Server 上的 12345 port 會對應到幾器上的 SSH port
ssh -NfR 12345:localhost:22 fred@myhost.com

# 然後在 myhost 的機器上連自己的 12345 port,就可以連回在客戶那的機器
ssh localhost -p 12345



ssh tunnel

隧道(ssh tunnel)
Q:隧道是什么?
A:简单点儿说,就是在A和B之间建立一个通道,这个通道里传输的数据都是加密的,就像是一条A地到B地的地下隧道,地面上的人是看不到隧道里有什么的

Q:隧道能用来做什么?
A:太多了,只要是网络传输,基本上都可以通过建立隧道来加密,比如用来躲避某些公司在局域网出口进行的网页浏览记录,或者在一个不安全的网络(比如机场的WIFI)收发邮件等等。

隧道一般是单一端口的,类似A地到B地的地下隧道。还有一种叫做 动态端口隧道,类似A地到任何地方的一个地下隧道网,使用起来更灵活。

这里只介绍动态端口隧道
还是那个Terminal

输入:
ssh -N -v -D 1080 username@server_ip_address

如果你拥有一个支持ssh登录的主机,按提示输入密码后,就可以使用上面的命令来建立一条动态端口的隧道了(用实际的账号替换username,用实际的服务器IP或域名替换server_ip_address)。

那么,这条隧道在哪里呢?
隧道的起点在本机的1080端口,另一端呢?在远程主机上。也就是说,所有从本机1080端口发出的数据,在到达远程主机之前,都是加密的。

另外,你可以把这个隧道看作是一个运行在本机上的支持多种网络协议的SOCKS代理

代理服务器的地址: 127.0.0.1
代理服务器端口:1080

OpenSSH SSH 客户端


NAME

ssh - OpenSSH SSH 客户端 (远程登录程序)

总览 (SYNOPSIS)

ssh [-login_name ] hostname | user@hostname [command ]
ssh -words [-afgknqstvxACNTX1246 ] [-bind_address ] [-cipher_spec ] [-escape_char ] [-identity_file ] [-login_name ] [-mac_spec ] [-option ] [-port ] [-configfile ] [-port host hostport ] -words [-port host hostport ] [-port ] hostname | user@hostname [command ]

描述 (DESCRIPTION)

(SSH 客户端) 用于登录远程主机, 并且在远程主机上执行命令. 它的目的是替换 rlogin 和 rsh, 同时在不安全的网络之上, 两个互不信任的主机之间, 提供加密的, 安全的通信连接. X11 连接和任意 TCP/IP 端口均可以通过此安全通道转发(forward).
当用户通过 连接并登录主机 hostname 后, 根据所用的协议版本, 用户必须通过下述方法之一向远程主机证明他/她的身份:

SSH 协议第一版

第一, 如果发出登录命令的本地主机已经列在远程主机的 /etc/hosts.equiv 或 /etc/ssh/shosts.equiv 文件中, 并且两端的用户名相同, 则立即允许该用户登录. 第二, 如果远程主机的用户根目录 (home 目录) 下存在 .rhosts 或 .shosts 并且其中有一行包含了客户机的名字和客户机上的用户名, 则允许该用户登录. 一般来说, 服务器不允许单独使用这种认证方式, 因为它不安全.
第二种认证方法是 rhosts 或 hosts.equiv 文件结合基于 RSA 的主机认证. 这意味着如果 $HOME/.rhosts $HOME/.shosts /etc/hosts.equiv 或 /etc/ssh/shosts.equiv 允许登录, 并且如果服务器能够验证客户的主机密钥(host key) (参见 Sx 文件(FILE) 节的 /etc/ssh/ssh_known_hosts 和 $HOME/.ssh/known_hosts ), 主机才允许客户登录. 这个认证方法关闭了因 IP 欺骗, DNS 欺骗和路由欺骗造成的安全漏洞. [系统管理员注意: 一般说来 /etc/hosts.equiv $HOME/.rhosts 和 rlogin/rsh 协议的本质是不可靠地, 要安全就应该关掉它们.]
作为第三种认证方式, 支持基于 RSA 的认证. 这种方案依托于公开密钥算法: 密码系统的加密和解密通过不同的密钥完成, 无法通过加密密钥推导出解密密钥. RSA 就是这种密码系统. 每个用户创建一对公开/私密钥匙用于认证. 服务器知道用户的公钥, 只有用户知道他自己的私钥. $HOME/.ssh/authorized_keys 文件列出允许登录的(用户的)公钥. 当用户开始登录, 程序告诉服务器它准备使用哪对钥匙(公钥)做认证. 服务器检查这只密钥(公钥)是否获得许可, 如果许可, 服务器向用户 (实际上是用户面前运行的 程序) 发出测试, 用用户的公钥加密一个随机数. 这个随机数只能用正确的私钥解密. 随后用户的客户程序用私钥解出测试数字, 即可证明他/她掌握私钥, 而又无需(把私钥)暴露给服务器.
能够自动执行 RSA 认证协议. 用户通过运行 ssh-keygen1 创建他/她的 RSA 密钥对. 私钥存放在用户根目录下的 $HOME/.ssh/identity 中, 而公钥存放在 $HOME/.ssh/identity.pub 中. 随后, 用户应该把 identity.pub 复制到远程服务器中, 作为 $HOME/.ssh/authorized_keys 存放到他/她的用户根目录下 ( authorized_keys 对应传统的 $HOME/.rhosts 文件, 每一行只有一只密钥, 尽管一行可以很长). 用户无须密码就可以直接登录. RSA 认证远比 rhosts 认证安全.
RAS 认证最便捷的用法大概就是使用认证代理(authentication agent) 了. 详见 ssh-agent1 手册页.
如果这些认证方式都失败了, 就提示用户输入口令(password), 然后把口令送到服务器做验证. 由于整个通信过程是加密的, 因此别人不可能通过侦听网络获得这个口令.

SSH 协议第二版

当用户以协议第二版连接时, 类似的认证方法一样有效. 如果使用了 PreferredAuthentications 的默认内容, 客户端首先试着用基于主机的认证方法进行连接; 如果这个方法失败了就用公开密钥方法作认证; 最后, 如果它也失败了, 就进入键盘操作, 试试用户口令认证.
这个公开密钥方法类似于上一节描述的 RAS 认证, 并且允许使用 RAS 或 DSA 算法: 客户端用他的私钥 ( $HOME/.ssh/id_dsa 或 $HOME/.ssh/id_rsa ) 对会话标识符(session identifier)签名, 然后把结果送到服务器. 服务器检查 $HOME/.ssh/authorized_keys 中是否有匹配的公钥, 如果密钥和签名都正确, 访问就可以继续进行. 会话标识符来自共享的 Diffie-Hellman 值, 只有客户端和服务器端才知道这个值.
如果公钥认证失败或无效, 用户口令将会加密后送到远端主机来证明用户的身份.
另外, 支持基于主机或测试应答的认证方式.
协议第二版提供附加机制增强保密性 (数据流用 3DES, Blowfish, CAST128 或 Arcfour 加密) 和完整性 (hmac-md5, hmac-sha1). 注意, 协议第一版缺少强有力的机制确保连接的完整性.

登录会话和远程执行

服务器接受用户身份后, 服务器即可以执行给定的命令, 也可以让用户登录并给他一个正常的 shell. 所有和远端命令或 shell 的通信被自动加密.
如果分配了伪终端(pseudo-terminal)(普通的登录会话), 用户可以使用后面将提到的 escape 字符.
如果没有分配伪终端, 则会话是透明的(transparent), 能够可靠的传送二进制数据. 大多数系统上, 即使分配了终端, 把 escape 字符设为 ``none'' 也可以让会话透明.
当远程主机上的命令或 shell 退出时, 会话即结束, 并关闭所有 X11 和 TCP/IP 连接. 远端程序的返回码做为 的返回码返回.

Escape 字符

如果启用了伪终端, 能够通过 escape 字符支持一组功能.
单独的波浪符可以用 ~~ 送出去, 只要后面不跟下面列举的字符, 也可以把它直接送出去. escape 字符必须接在换行(newline)后面, 这样才具有特别含义. 在配置文件中可以用 EscapeChar 命令更改 escape 字符, 在命令行上可以用 -e 选项更改.
已支持的 escape 命令 (假设是默认的 `~' ) 有:
~.
断开连接
~^Z
把 ssh 送到后台
~#
列出转发的连接 (forwarded connection)
~&
当等待转发的连接/X11会话结束时, ssh 在后台退出登录
~?
显示 escape 字符的列表
~C
打开命令行 (仅用于 -L 和 -R 选项增加端口转发)
~R
请求连接的重建(rekeying) (仅用于SSH协议第二版, 且对方支持)

X11 和 TCP 转发 (forwarding)

如果 ForwardX11 变量设为 ``yes'' (或参见后面对 -X 和 -x 选项的描述), 并且用户正在使用 X11 (设置了 DISPLAY 环境变量), 和 X11 显示器的连接将自动以这种形式转发到远端: 任何用 shell 或命令启动的 X11 程序将穿过加密的通道, 从本地机器连接真正的 X 服务器. 用户不应该手动设置 DISPLAY 可以在命令行上, 也可以在配置文件中设置 X11 连接的转发.
设置的 DISPLAY 值将指向服务器, 但是显示器号大于零. 这很自然, 因为 在服务器上创建了一个 ``proxy'' X 服务器, 把连接通过加密通道转发出去.
将自动在服务器上设置 Xauthority 数据. 目的是这样的: SSH 生成一个随机的授权 cookie, 存放在服务器的 Xauthority 中. SSH 检查并确保转发的连接携带了这个 cookie, 打开连接后, 把它替换为真正的 cookie. 真正的认证 cookie 绝不会送往服务器 (也不会有任何明文传送的 cookie).
如果 ForwardAgent 变量设为 ``yes'' (或参见后面对 -A 和 -a 选项的描述), 并且用户正在使用认证代理(authentication agent), 则和代理的连接将自动转发到远程主机.
既可以在命令行上, 也可以在配置文件中指定通过加密通道转发的任何 TCP/IP 连接. TCP/IP 转向的应用有, 比如说, 和电子钱包的安全连接, 或者是穿过防火墙等.

服务器认证

自动维护并检查一个身份数据库, 它包含所有(成功)来访的主机的身份数据. 主机密钥存放在用户根目录下的 $HOME/.ssh/known_hosts 文件中. 另外, SSH 自动检查 /etc/ssh/ssh_known_hosts 里面已知的主机. 任何新主机将被自动添加到用户文件中. 如果某个主机的身份发生改变, 就会发出警告, 并且关闭对它的密码认证, 以防止特洛伊木马窃取用户密码. 这个机制的另一个目的是防止中间人攻击, 否则这种攻击可能会绕过加密系统. StrictHostKeyChecking 选项用来防止登录到主机密钥不能识别或发生改变的那些机器.
命令行选项有:
-a
禁止转发认证代理的连接.
-A
允许转发认证代理的连接. 可以在配置文件中对每个主机单独设定这个参数.
代理转发须谨慎. 某些用户能够在远程主机上绕过文件访问权限 (由于代理的 UNIX 域 socket), 他们可以通过转发的连接访问本地代理. 攻击者不可能从代理获得密钥内容, 但是他们能够操作这些密钥, 利用加载到代理上的身份信息通过认证.
-b bind_address
在拥有多个接口或地址别名的机器上, 指定收发接口.
-c blowfish|3des|des
选择加密会话的密码术. 3des 是默认算法. 3des (triple-des) 用三支不同的密钥做加密-解密-加密三次运算, 被认为比较可靠. blowfish 是一种快速的分组加密术(block cipher), 非常安全, 而且速度比 3des 快的多. des 仅支持 客户端, 目的是能够和老式的不支持 3des 的协议第一版互操作. 由于其密码算法上的弱点, 强烈建议避免使用.
-c cipher_spec
另外, 对于协议第二版, 这里可以指定一组用逗号隔开, 按优先顺序排列的密码术. 详见 Ciphers
-e ch|^ch|none
设置 pty 会话的 escape 字符 (默认字符: `~' ) . escape 字符只在行首有效, escape 字符后面跟一个点 (`.' ) 表示结束连接, 跟一个 control-Z 表示挂起连接(suspend), 跟 escape 字符自己表示输出这个字符. 把这个字符设为 ``none'' 则禁止 escape 功能, 使会话完全透明.
-f
要求 在执行命令前退至后台. 它用于当 准备询问口令或密语, 但是用户希望它在后台进行. 该选项隐含了 -选项. 在远端机器上启动 X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令.
-g
允许远端主机连接本地转发的端口.
-i identity_file
指定一个 RSA 或 DSA 认证所需的身份(私钥)文件. 默认文件是协议第一版的 $HOME/.ssh/identity 以及协议第二版的 $HOME/.ssh/id_rsa 和 $HOME/.ssh/id_dsa 文件. 也可以在配置文件中对每个主机单独指定身份文件. 可以同时使用多个 -i 选项 (也可以在配置文件中指定多个身份文件).
-I smartcard_device
指定智能卡(smartcard)设备. 参数是设备文件, 能够用它和智能卡通信, 智能卡里面存储了用户的 RSA 私钥.
-k
禁止转发 Kerberos 门票和 AFS 令牌. 可以在配置文件中对每个主机单独设定这个参数.
-l login_name
指定登录远程主机的用户. 可以在配置文件中对每个主机单独设定这个参数.
-m mac_spec
另外, 对于协议第二版, 这里可以指定一组用逗号隔开, 按优先顺序排列的 MAC(消息验证码)算法 (message authentication code). 详情以 MACs 为关键字查询.
-n
把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据). 在后台运行时一定会用到这个选项. 它的常用技巧是远程运行 X11 程序. 例如, ssh -n shadows.cs.hut.fi emacs 将会在 shadows.cs.hut.fi 上启动 emacs, 同时自动在加密通道中转发 X11 连接. 在后台运行. (但是如果 要求口令或密语, 这种方式就无法工作; 参见 -f 选项.)
-N
不执行远程命令. 用于转发端口. (仅限协议第二版)
-o option
可以在这里给出某些选项, 格式和配置文件中的格式一样. 它用来设置那些没有命令行开关的选项.
-p port
指定远程主机的端口. 可以在配置文件中对每个主机单独设定这个参数.
-q
安静模式. 消除所有的警告和诊断信息.
-s
请求远程系统激活一个子系统. 子系统是 SSH2 协议的一个特性, 能够协助其他应用程序(如 sftp)把SSH用做安全通路. 子系统通过远程命令指定.
-t
强制分配伪终端. 可以在远程机器上执行任何全屏幕(screen-based)程序, 所以非常有用, 例如菜单服务. 并联的 -t 选项强制分配终端, 即使 没有本地终端.
-T
禁止分配伪终端.
-v
冗详模式. 使 打印关于运行情况的调试信息. 在调试连接, 认证和配置问题时非常有用. 并联的 -v 选项能够增加冗详程度. 最多为三个.
-x
禁止 X11 转发.
-X
允许 X11 转发. 可以在配置文件中对每个主机单独设定这个参数.
应该谨慎使用 X11 转发. 如果用户在远程主机上能够绕过文件访问权限 (根据用户的X授权数据库), 他就可以通过转发的连接访问本地 X11 显示器. 攻击者可以据此采取行动, 如监视键盘输入等.
-C
要求进行数据压缩 (包括 stdin, stdout, stderr 以及转发 X11 和 TCP/IP 连接的数据). 压缩算法和 gzip(1) 的一样, 协议第一版中, 压缩级别 ``level'' 用 CompressionLevel 选项控制. 压缩技术在 modem 线路或其他慢速连接上很有用, 但是在高速网络上反而可能降低速度. 可以在配置文件中对每个主机单独设定这个参数. 另见 Compression 选项.
-F configfile
指定一个用户级配置文件. 如果在命令行上指定了配置文件, 系统级配置文件 (/etc/ssh/ssh_config ) 将被忽略. 默认的用户级配置文件是 $HOME/.ssh/config
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port
指定一个本地机器 ``动态的'' 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-1
强制 只使用协议第一版.
-2
强制 只使用协议第二版.
-4
强制 只使用 IPv4 地址.
-6
强制 只使用 IPv6 地址.

配置文件 (CONFIGURATION FILES)

可以从用户级配置文件和系统级配置文件中获取更多的配置数据. 配置文件的格式及其内容参见 ssh_config5.

“环境变量 (ENVIRONMENT)

一般将设置下面的环境变量:
DISPLAY
环境变量 DISPLAY 指出 X11 服务器的位置. 自动设置这个变量, 变量指向 ``hostname:n'' 格式的数据, 其中 hostname 指出运行 shell 的主机, 而 n 是大于等于 1 的整数. 根据这个数据, 用安全通路转发 X11 连接. 用户一般不需要主动设置 DISPLAY 变量, 否则会导致 X11 连接不安全 (而且会导致用户手工复制所需的授权 cookie).
HOME
设置为用户根目录的路径.
LOGNAME
等于 USER 用来兼容使用这个变量的系统.
MAIL
设置为用户邮箱的路径.
PATH
设置为默认的 PATH 如同编译 ssh 时要求的一样.
SSH_ASKPASS
如果 需要一个密语(passphrase), 只要它是终端上启动的, 它会从当前终端上读取. 如果 没有联接终端, 但是设置了 DISPLAY 和 SSH_ASKPASS 变量, 就运行 SSH_ASKPASS 指定的程序, 打开一个 X11 窗口读取密语. 当从 .Xsession 或类似的 script 中调用 时, 这个功能特别有用. (注意, 某些机器上可能需要将输入重定向为 /dev/null 才能工作.)
SSH_AUTH_SOCK
标识某个 UNIX 域 socket 的路径, 用于和代理通信.
SSH_CONNECTION
标识连接的客户端和服务器端. 变量包含四个用空格隔开的字段: 客户端IP地址, 客户端端口号, 服务器IP地址, 服务器端口号.
SSH_ORIGINAL_COMMAND
如果强制执行了某条命令, 该变量就保存了最初的命令行. 可以用它获取初始参数.
SSH_TTY
设置为关联当前 shell 或命令的终端名字(设备的路径). 如果会话没有终端, 就不设置这个变量.
TZ
如果启动后台进程(daemon)时设置了时区, 就设置这个时区变量, 指出现在的时区 (就是说, 后台进程会把这个变量传给新建连接).
USER
设置为登录的用户名.
另外, 如果允许用户改变他们的环境数据, 而且有 $HOME/.ssh/environment 这个文件, 将读取其中数据, 把 ``VARNAME=value'' 这种格式的数据行添加进环境数据区. 另见 sshd_config5 的 PermitUserEnvironment 选项.

文件 (FILES)

$HOME/.ssh/known_hosts
主机密钥的记录, 记录有用户登录上来, 但是没有列在 /etc/ssh/ssh_known_hosts 中的主机. 参见 sshd(8).
$HOME/.ssh/identity, $HOME/.ssh/id_dsa, $HOME/.ssh/id_rsa
包含了用户的身份信息. 它们分别是协议第一版的 RSA, 协议第二版的 DSA, 协议第二版的 RSA. 这些文件存有敏感信息, 只应由该用户读取, 不允许其他用户访问(读/写/执行). 注意, 如果一个私钥文件能够让其他用户访问, 将忽略这个文件. 在生成密钥的时候可以指定一个密语(passphrase), 用这个密语和 3DES 加密文件的敏感部分.
$HOME/.ssh/identity.pub, $HOME/.ssh/id_dsa.pub, $HOME/.ssh/id_rsa.pub
包含认证用的公钥 (以文本格式保存的身份文件的公开部分). 如果用户希望用协议第一版的 RSA 认证登录这些机器, $HOME/.ssh/identity.pub 的内容应该添加到所有机器的 $HOME/.ssh/authorized_keys 中. 如果用户希望用协议第二版的 DSA/RSA 认证登录这些机器, $HOME/.ssh/id_dsa.pub 和 $HOME/.ssh/id_rsa.pub 的内容应该添加到所有机器的 $HOME/.ssh/authorized_keys 中. 这些文件没有敏感数据, 可以(但不是必须)让任何人读取. ssh 绝不会自动访问这些文件, 它们也不是不可或缺; 只是为了用户方便才提供这些文件.
$HOME/.ssh/config
用户级配置文件. ssh_config5 描述了文件格式及其配置选项.
$HOME/.ssh/authorized_keys
存放 RSA/DSA 公钥, 用户通过它登录机器. sshd(8) 手册页描述了这个文件的格式. 最简单的文件格式和 .pub 身份文件一样. 文件内容并非高度敏感, 但是仍然建议仅让此文件的用户读写, 而拒绝其他用户的访问.
/etc/ssh/ssh_known_hosts
已知的主机密钥的系统级列表. 系统管理员应该准备好这个文件, 把所需主机的公钥保存在文件里面. 这个文件应该能够全局读取. 文件中一行一支公钥, 格式是 (字段用空格隔开): 系统名字, 公钥, 可选的注释域. 如果同一个机器使用了多个名字, 所有名字都应该(用逗号隔开)列出来. 文件格式在 sshd(8) 手册页中有描述.
登录的时候, sshd(8) 用规范的系统名字(名字服务器返回的)确认客户机; 其他名字也需要, 因为校验密钥前 不会把用户提供的名字转换为规范名字, 防止能够操作名字服务器的人欺骗主机认证.
/etc/ssh/ssh_config
系统级配置文件. ssh_config5 描述了文件格式和配置选项.
/etc/ssh/ssh_host_key, /etc/ssh/ssh_host_dsa_key, /etc/ssh/ssh_host_rsa_key
这三个文件包含了主机密钥的私有部分, 它们用于 RhostsRSAAuthentication 和 HostbasedAuthentication 如果使用了协议第一版的 RhostsRSAAuthentication 方法, 必须是 setuid root, 因为只有 root 才能读取主机密钥. 而对于协议第二版的 HostbasedAuthentication 方法, 使用 ssh-keysign8 访问主机密钥. 这样消除了验证身份时对 setuid root 的要求. 默认情况下 不是 setuid root.
$HOME/.rhosts
该文件用于 .rhosts 认证, 里面列出允许登录的主机/用户对. (注意 rlogin 和 rsh 也使用这个文件, 导致这个文件的应用变得不安全) 文件中的每一行包括一个主机名字(用名字服务器返回的规范名字), 和主机上的用户名字, 用空格隔开. 某些机器上, 如果用户根目录位于 NFS 分区, 这个文件可能需要全局可读, 因为 sshd(8) 以 root 身份读它. 此外, 该文件必须属于这个用户, 其他人不允许持有写权限. 对大多数机器推荐的访问权限是, 它的用户可以读写, 而不让其他人访问.
注意, 默认情况下会安装 sshd(8) , 因此在允许 .rhosts 认证前, sshd(8) 要求成功进行了 RSA 主机验证. 如果没有 /etc/ssh/ssh_known_hosts 文件存放客户的主机密钥, 密钥可以存放在 $HOME/.ssh/known_hosts 中. 最简单的做法是用 ssh 从服务器回连客户机; 这样会自动把主机密钥添加到 $HOME/.ssh/known_hosts
$HOME/.shosts
这个文件的用法和 .rhosts 完全一样. 它的目的是允许 做 rhosts 认证的同时防止 rlogin 或 rsh(1) 登录.
/etc/hosts.equiv
.rhosts 认证 使用这个文件. 它包含规范的主机名字, 一行一个( sshd(8) 手册页描述了完整的格式). 如果文件中发现了客户机的名字, 而且客户机和服务器的用户名相同, 则自动允许登录. 另外, 一般情况下要求 RSA 主机认证成功. 这个文件只应该让 root 可写.
/etc/ssh/shosts.equiv
这个文件的用法和 /etc/hosts.equiv 完全一样. 用于允许 登录, 但不允许 rsh/rlogin 的时候.
/etc/ssh/sshrc
当用户登录后, 运行 shell (或命令)前, 执行这个文件中的命令. 详见 sshd(8) 手册页.
$HOME/.ssh/rc
当用户登录后, 运行 shell (或命令)前, 执行这个文件中的命令. 详见 sshd(8) 手册页.
$HOME/.ssh/environment
含有关于环境变量的附加定义, 另见前面的 Sx ENVIRONMENT 节.

诊断 (DIAGNOSTICS)

结束时的状态码就是远端命令结束时的返回码, 如果发生了错误就返回255.

作者 (AUTHORS)

OpenSSH 源自最初 Tatu Ylonen 发表的自由 ssh 1.2.12. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo de Raadt 和 Dug Song 消除了许多 BUGS, 增加新的特征, 从而创建了 OpenSSH. Markus Friedl 贡献了对 SSH 协议1.5版和2.0版的支持.

SSH 的详细使用方法

SSH 的详细使用方法如下:
ssh [-l login_name] [hostname | user@hostname] [command] ssh [-afgknqtvxCPX246] [-c blowfish | 3des] [-e escape_char] [-i identity_file] [-l login_name] [-o option] [-p port] [-L port:host:hostport] [-R port:host:hostport] [hostname | user@hostname] [command]
sshd
为执行 ssh 的 daemon,在读者使用 ssh 之前必须去激活 sshd,在此建议把它加在 /etc/init/rc.local 中,在每次开机时激活。
在执行 sshd 之前可以指定它的 port,例如:sshd –p 999
若有安装 SSL,可以指定 SSL 的 port 443,例如:sshd –p 443
这样就可以经过 SSL 及 SSH 双重的保护,但必须去指明使用的 port
ssh –l user –p 443 mouse.oit.edu.tw 才行,若不指明则仍然使用预设的port 22
ssh
选项:
-l login_name
指定登入于远程机器上的使用者,若没加这个选项,而直接打 ssh lost 也是可以的,它是以读者目前的使用者去做登入的动作。 例如: ssh –l shie mouse.oit.edu.tw
-c blowfish|3des
在期间内选择所加密的密码型式。预设是3des,3des(作三次的资料加密) 是用三种不同的密码键作三次的加密-解密-加密。 blowfish 是一个快速区块密码编制器,它比3des更安全以及更快速。
-v
Verbose 模式。使ssh 去印出关于行程的除错讯息,这在连接除错,认 证和设定的问题上有很的帮助。
-V
显示版本。
-a
关闭认证代理联机。
-f
要求ssh 在背景执行命令,假如ssh要询问密码或通行证,但是使用者 想要它在幕后执行就可以用这个方式,最好还是加上-l user 例如在远程场所上激活 X11,有点像是 ssh –f host xterm 。
-e character
设定跳脱字符。
-g
允许远程主机去连接本地指派的 ports。
-i identity_file
选择所读取的 RSA 认证识别的档案。预设是在使用者的家目录 中的 .ssh/identity 。
-n
重导 stdin 到 /dev/null (实际上是避免读取 stdin)。必须当 ssh 在幕后执 行时才使用。常见的招数是使用这选项在远程机器上去执行 X11 的程序 例如,ssh -n shadows.cs.hut.fi emacs &,将在 shadows.cs.hut.fi 上激活 emace,并且 X11 连接将自动地在加密的信道上发送。ssh 程序将把它放 在幕后。(假如ssh需要去询问密码时,这将不会动作)
-p port
连接远程机器上的 port。
-P
使用非特定的 port 去对外联机。如果读者的防火墙不淮许从特定的 port去联机时,就可以使用这个选项。注意这个选项会关掉 RhostsAuthentication 和 RhostsRSAAuthentication。
-q
安静模式。把所有的警告和讯息抑制,只有严重的错误才会被显示。
-t
强制配置 pseudo-tty。这可以在远程机器上去执行任意的 screen-based 程 式,例如操作 menu services。
-C
要求压缩所有资料(包含 stdin, stdout,stderr 和 X11 和 TCP/IP 连接) 压缩演算规则与 gzip 相同,但是压缩的等级不能控制。在调制解调器或 联机速度很慢的地方,压缩是个很好的选择,但如果读者的网络速路很 快的话,速度反而会慢下来。
-L listen-port:host:port
指派本地的 port 到达端机器地址上的 port。
-R listen-port:host:port
指派远程上的 port 到本地地址上的 port。
-2 强制 ssh 去使用协议版本 2。
-4 强制 ssh 去使用 IPv4 地址。
-6 强制 ssh 去使用 IPv6 地址。
scp
使用 scp 在远程机器上 copy 档案
例如:
copy 本地的档案到远程的机器上
scp /etc/lilo.conf k@net67.ee.oit.edu.tw:/home/k
会将本地的 /etc/lilo.conf 这个档案 copy 到 net67.ee.oit.edu.tw,使用者 k 的家目录下。
copy远程机器上的档案到本地来
scp k@net67.ee.oit.edu.tw:/etc/lilo.conf /etc
会将 net67.ee.oitdu.tw 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。
保持从来源 host 档案的属性
scp –p k@net67.ee.tw:/etc/lilo.conf /etc
在此必须注意使用者的权限是否可读取远程上的档案,若想知道更多关于 scp 的使用方法,可去看看 scp 的使用手册。
ssh-keygen
产生公开钥 (pulib key) 和私人钥 (private key),以保障 ssh 联机的安性, 当 ssh 连 shd 服务器,会交换公开钥上,系统会检查 /etc/ssh_know_hosts 内储存的 key,如果找到客户端就用这个 key 产生一个随机产生的session key 传给服务器,两端都用这个 key 来继续完成 ssh 剩下来的阶段。

它会产生 identity.pub、identity 两个档案,私人钥存放于identity,公开钥 存放于 identity.pub 中,接下来使用 scp 将 identity.pub copy 到远程机器的家目录下.ssh下的authorized_keys。 .ssh/authorized_keys(这个 authorized_keys 档案相当于协议的 rhosts 档案), 之后使用者能够不用密码去登入。RSA的认证绝对是比 rhosts 认证更来的安全可靠。
执行:
scp identity.pub k@linux1.ee.oit.edu.tw:.ssh/authorized_keys

若在使用 ssh-keygen 产生钥匙对时没有输入密码,则如上所示不需输入密码即可从 net67.ee.oit.edu.tw 去登入 linux1.ee.oit.edu.tw。在此,这里输入的密码可以跟帐号的密码不同,也可以不输入密码。

2010年11月22日月曜日

mysql安装

1.gcc安装



yum install gcc*
2.ncurses
tar zxvf ncurses-5.7.tar.gz
cd ncurses-5.7
./configure
3.mysql-5.7.tar.gz
tar zxvf mysql-5.1.50.tar.gz
cd mysql-5.1.50
./configure -prefix=/usr/local/mysql
4.
cp my-medium.cnf /etc/my.cnf
cp mysql.server /etc/init.d/mysqld
5.1.gcc安装



yum install gcc*
2.ncurses

tar zxvf ncurses-5.7.tar.gz
cd ncurses-5.7
./configure
3.mysql-5.7.tar.gz
tar zxvf mysql-5.1.50.tar.gz
cd mysql-5.1.50
./configure -prefix=/usr/local/mysql
4.
groupadd mysql
useradd -g mysql mysql
mkdir /usr/local/mysql/var
5.
mysql_install_db -u mysql
6.
/etc/init.d/mysqld start

`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/PACKAGE]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --disable-dependency-tracking  speeds up one-time build
  --enable-dependency-tracking   do not reject slow dependency extractors
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-static[=PKGS]  build static libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --disable-community-features
                          Disable additional features provided by the user
                          community.
  --disable-thread-safe-client
                          Compile the client without threads.
  --enable-assembler      Use assembler versions of some string
                          functions if available.
  --enable-profiling      Build a version with query profiling code (req.
                          community-features)
  --enable-local-infile   Enable LOAD DATA LOCAL INFILE (default: disabled)
  --disable-grant-options Disables the use of --init-file, --skip-grant-tables and --bootstrap options
  --disable-largefile     Omit support for large files

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-charset=CHARSET
                          Default character set, use one of:
                          binary
                          armscii8 ascii big5 cp1250 cp1251 cp1256 cp1257
                          cp850 cp852 cp866 cp932 dec8 eucjpms euckr gb2312 gbk geostd8
                          greek hebrew hp8 keybcs2 koi8r koi8u
                          latin1 latin2 latin5 latin7 macce macroman
                          sjis swe7 tis620 ucs2 ujis utf8
  --with-collation=COLLATION
                          Default collation
  --with-extra-charsets=CHARSET,CHARSET,...
                          Use charsets in addition to default (none, complex,
                          all, or a list selected from the above sets)
  --without-uca           Skip building of the national Unicode collations.

  --with-system-type      Set the system type, like "sun-solaris10"
  --with-machine-type     Set the machine type, like "powerpc"
  --with-darwin-mwcc      Use Metrowerks CodeWarrior wrappers on OS X/Darwin
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-pic              try to use only PIC/non-PIC objects [default=use
                          both]
  --with-tags[=TAGS]      include additional configurations [automatic]
  --with-other-libc=DIR   Link against libc and other standard libraries
                          installed in the specified non-standard location
                          overriding default. Originally added to be able to
                          link against glibc 2.2 without making the user
                          upgrade the standard libc installation.
  --with-server-suffix    Append value to the version string.
  --with-pthread          Force use of pthread library.
  --with-named-thread-libs=ARG
                          Use specified thread libraries instead of
                          those automatically found by configure.
  --with-named-curses-libs=ARG
                          Use specified curses libraries instead of
                          those automatically found by configure.
  --with-unix-socket-path=SOCKET
                          Where to put the unix-domain socket.  SOCKET must be
                          an absolute file name.
  --with-tcp-port=port-number
                          Which port to use for MySQL services (default 3306)
  --with-mysqld-user=username
                          What user the mysqld daemon shall be run as.
  --with-zlib-dir=no|bundled|DIR
                          Provide MySQL with a custom location of compression
                          library. Given DIR, zlib binary is assumed to be in
                          $DIR/lib and header files in $DIR/include.
  --with-libwrap=DIR      Compile in libwrap (tcp_wrappers) support
  --with-pstack           Use the pstack backtrace library
  --with-debug            Add debug code
  --with-debug=full       Add debug code (adds memory checker, very slow)
  --with-error-inject     Enable error injection in MySQL Server
  --with-fast-mutexes     Compile with fast mutexes (default is disabled)
  --with-atomic-ops=rwlocks|smp|up
                          Implement atomic operations using pthread rwlocks or
                          atomic CPU instructions for multi-processor
                          (default) or uniprocessor configuration
  --with-mysqld-ldflags   Extra linking arguments for mysqld
  --with-client-ldflags   Extra linking arguments for clients
  --with-mysqld-libs   Extra libraries to link with for mysqld
  --with-lib-ccflags      Extra CC options for libraries
  --with-low-memory       Try to use less memory to compile to avoid
                          memory limitations.
  --with-comment          Comment about compilation environment.
  --with-big-tables       Support tables with more than 4 G rows even on 32
                          bit platforms
  --with-max-indexes=N    Sets the maximum number of indexes per table,
                          default 64
  --with-ssl=DIR    Include SSL support
  --with-plugins=PLUGIN[[[,PLUGIN..]]]
                          Plugins to include in mysqld. (default is: none)
                          Must be a configuration name or a comma separated
                          list of plugins.
                          Available configurations are: none max max-no-ndb
                          all.
                          Available plugins are: partition daemon_example
                          ftexample archive blackhole csv example federated
                          heap innobase myisam myisammrg ndbcluster.
  --without-plugin-PLUGIN Disable the named plugin from being built.
                          Otherwise, for plugins which are not selected for
                          inclusion in mysqld will be built dynamically (if
                          supported)
  --with-plugin-PLUGIN    Forces the named plugin to be linked into mysqld
                          statically.
  --with-ndb-sci=DIR      Provide MySQL with a custom location of sci library.
                          Given DIR, sci library is assumed to be in $DIR/lib
                          and header files in $DIR/include.

  --with-ndb-test       Include the NDB Cluster ndbapi test programs

  --with-ndb-docs       Include the NDB Cluster ndbapi and mgmapi documentation

  --with-ndb-port       Port for NDB Cluster management server

  --with-ndb-port-base  Base port for NDB Cluster transporters

  --without-ndb-debug   Disable special ndb debug features
  --with-ndb-ccflags=CFLAGS
                          Extra CFLAGS for ndb compile

  --without-ndb-binlog       Disable ndb binlog
  --without-server        Only build the client.
  --with-embedded-server  Build the embedded server (libmysqld).
  --without-query-cache   Do not build query cache.
  --without-geometry      Do not build geometry-related parts.
  --with-embedded-privilege-control
                          Build parts to check user's privileges.
  Only affects embedded library.
  --with-mysqlmanager     Build the mysqlmanager binary: yes/no (default:
                          build if server is built.)
  --without-docs          Skip building of the documentation.
  --without-man          Skip building of the man pages.
  --without-readline      Use system readline instead of bundled copy.
  --without-libedit       Use system libedit instead of bundled copy.

oracle update set select

update t_job_inf set movie_id =
 (select movie_id from t_job_movie where t_job_movie.JOB_MGR_NO = t_job_inf.JOB_MGR_NO )
where t_job_inf.job_mgr_no >= 91000001  and t_job_inf.job_mgr_no <= 91002000



两个表a、b,想使b中的memo字段值等于a表中对应id的name值  
  表a:id,name  
            1       王  
            2       李  
            3       张  
  表b:id,ClientName  
            1        
            2  
            3  
(MS SQL Server)语句:update   b  set   ClientName   =   a.name   from   a,b   where   a.id   =   b.id  
(Oralce)语句:update   b  set   (ClientName)   =  (SELECT name FROM a WHERE b.id = a.id)
update set from 语句格式
当where和set都需要关联一个表进行查询时,整个update执行时,就需要对被关联的表进行两次扫描,显然效率比较低。对于这种情况,Sybase和SQL SERVER的解决办法是使用UPDATE...SET...FROM...WHERE...的语法,实际上就是从源表获取更新数据。
在 SQL 中,表连接(left join、right join、inner join 等)常常用于 select 语句,其实在 SQL 语法中,这些连接也是可以用于 update 和 delete 语句的,在这些语句中使用 join 还常常得到事半功倍的效果。
Update T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo   B ON B.L_ID=A.ProductID
用来同步两个表的数据!
Oralce和DB2都支持的语法:
UPDATE A  SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
MS SQL Server不支持这样的语法,相对应的写法为:
UPDATE A  SET A1 = B1, A2 = B2, A3 = B3  FROM A LEFT JOIN B ON A.ID = B.ID
个人感觉MS SQL Server的Update语法功能更为强大。MS SQL SERVER的写法:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID
在Oracle和DB2中的写法就比较麻烦了,如下:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)