ssh
简介
SSH(secure shell)是一种网络协议,用于计算机之间的加密登录。SSH有多种实现,Linux系统下使用的一般是OpenSSH。
来自维基百科:
传统的网络服务程序,如rsh、FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
使用形式
ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] [user@]hostname [command]
主要选项说明
ssh(SSH 客户端)是一个程序,用于登录远程主机和用于在远程主机上执行命令,在不安全网络上的两台不信任的主机之间提供了安全加密的通信。X11连接和任意的TCP端口能在安全通道上转发。
如果指定了command,它将在远程主机上执行,而不是进入登录shell。
-1
:强制ssh只尝试版本1的协议。-
-2
:强制ssh只尝试版本2的协议。 -
-4
:强制ssh只使用IPv4地址。 -
-6
:强制ssh只使用IPv6地址。 -
-A
:允许转发认证代理连接。这可以在配置文件里以host为基础指定。 -
-a
:禁止转发认证代理连接。 -
-b bind_address
:在本机上用的bind_address作为连接的源地址。只在系统有不止一个地址时有用。 -
-C
:请求压缩所有的数据(包括stdin,stdout,stderr和用于X11和TCP连接的数据)。压缩算法与gzip使用的一样。 -
-c cipher_spec
:选择加密规格(cipher specification)用于加密会话。可选值有:”3des”, “blowfish”, “des”,默认是”3des”。 -
-D [bind_address:]port
:指定一个本地“动态的”应用级别的端口转发。分配一个socket来监听本地的port端口,可选择绑定到指定的bind_address,当有连接到这个端口时,连接在安全通道上转发,应用程序协议用于决定从远程主机连接到哪里(应用的目标主机)。当前只支持socks4和socks5协议,ssh扮演一个SOCKS服务器。只有root用户才能转发私有端口。动态端口转发也可以在配置文件里指定。 -
-e escape_char
:为会话的pty设置转义字符(默认’~’)。转义字符只有在行的开头时被识别。转义字符后接句点(’.’)关闭连接;后接Ctrl-Z 挂起连接;后接自身发送转义字符一次。设为空(“none”)禁止任何转义,让会话完全透明。 -
-F configfile
:指定一个可选的用户特定的配置文件,默认的用户特定的配置文件是~/.ssh/config
。如果在命令行指定了配置文件,系统范围的配置文件(/etc/ssh/ssh_config
)将被忽略。 -
-f
:请求ssh在命令执行前进入后台。如果ssh需要密码或私钥密码,但用户希望它在后台运行将非常有用。这隐含这-n
。 -
-g
:运行远程主机连接到本地的转发端口。 -
-I pkcs11
:指定PKCS#11共享类库,ssh用于通信的。 -
-i identity_file
:选择一个文件用于读取身份证书(私钥),用于公钥认证。默认的是~/.ssh/identity
用于协议版本1,~/.ssh/id_dsa
,~/.ssh/id_ecdsa
,~/.ssh/id_rsa
用于协议版本2。身份证书文件可以指定在host特定基础上的配置文件里。也可以有多个-i
选项。ssh will also try to load certificate information from the filename obtained by appending-cert.pub
to identity filenames. -
-L [bind_address:]port:host:hostport
:指定本地(客户端)主机给定的端口用于转发到给定的远程侧的主机和端口。分配一个socket用于监听本地侧的port,可选地绑定到指定的bind_address。当有连接到这个端口,连接在安全通道上转发,从远程主机(ssh服务器)连接到host的hostport端口。端口转义也可以在配置文件里指定。 -
-l login_name
:指定用户用于登录到远程主机。可以在主机特定的配置文件里指定。 -
-N
:不执行远程命令。这在只转发端口上有用(只支持协议版本2)。 -
-n
:把stdin重定向自/dev/null
(实际上禁止从stdin读取)当ssh运行在后台时必须使用。 -
-p port
:连接到远程主机的port端口。可以在主机特定的配置文件里指定。 -
-q
:安静模式。导致警告和诊断信息被抑制。 -
-R [bind_address:]port:host:hostport
:指定远程(服务器端,ssh服务器)主机的给定端口用于转发到给定的本地侧的主机和端口。工作机制:在远程主机侧分配一个socket监听port,当有连接到这个端口时,连接在安全通道上转发,连接到本地机器的host和hostport端口。 -
-T
:禁止分配伪tty。 -
-t
:强制分配分配伪tty。这在远程机器上执行任意基于screen的程序时非常有用。 -
-v
:冗长模式,允许ssh输出调试信息。 -
-W host:port
:请求将本地的标准输入和输出在安全通道上转发到host的port。Implies-N, -T, ExitOnForwardFailure
andClearAllForwardings
and works with Protocol version 2 only. -
-X
:允许X11转发。 -
-X
:禁止X11转发。 -
-Y
:允许信任的X11转发。
使用
ssh主要有三类应用:登录、远程操作、端口转发。
登录
ssh coderbee@coderbee.net
:使用coderbee登录coderbee.net主机,如果是第一次登录,ssh客户端显示服务器RSA的指纹,并询问是否继续登录,如果输入yes
则继续登录过程,提示输入密码,密码验证正确后进入登录shell。如:
$ ssh coderbee@coderbee.net
The authenticity of host 'coderbee.net (198.56.238.193)' can't be established.
RSA key fingerprint is 0a:0d:90:e1:28:bd:10:50:04:1d:68:51:ac:09:28:67.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'coderbee.net,198.56.238.193' (RSA) to the list of known hosts.
coderbee@coderbee.net's password:
Welcome to Ubuntu 12.04 LTS (GNU/Linux 2.6.32-042stab076.8 i686)
* Documentation: https://help.ubuntu.com/
Last login: Thu May 30 15:23:43 2013 from 111.148.4.64
coderbee@coderbee:~$
第一次登录之后,ssh会把这个主机作为已知的主机记录在 ~/.ssh/known_hosts
文件里,下次再登录的时候,就不再询问是否继续登录,而是直接进入输入密码的步骤。
如果本地用户名与远程主机用户名一样,可以省略用户名:ssh coderbee.net
。
用命令选项指定用户名:ssh -l coderbee coderbee.net
远程操作
在服务器执行简单的操作:
$ ssh coderbee@coderbee.net 'ls -l'
total 160
drwxr-xr-x 4 coderbee coderbee 4096 May 28 22:05 codebase
-rw-rw-r-- 1 coderbee coderbee 151302 Jun 6 10:35 hotspot-jvm-gc
drwxrwxr-x 2 coderbee coderbee 4096 May 15 10:42 learn
drwxrwxr-x 4 coderbee coderbee 4096 May 31 16:57 soft
$ ssh coderbee@coderbee.net 'rm hotspot-jvm-gc'
$
把本地的文件作为命令在服务器上执行时的标准输入: ssh coderbee@coderbee.net 'cat > ~/.ssh/authorized_keys' < id_rsa.pub
目录拷贝:cd && tar czv src | ssh coderbee@coderbee.net 'tar xz'
注意:复杂的远程命令最好用单引号引起的,比如含有输出重定向符、管道操作符等的。
端口转发
端口转发也称为SSH隧道,隧道是一种把一种网络协议封装进另一种网络协议进行传输的技术。SSH隧道通常会绑定一个本地端口,所有发向这个端口的数据包,都会被加密并透明地传输到远端系统。
端口范围在 1 – 1024 的只能用root用户来转发。
转发有三种类型:本地端口转发、远程端口转发、动态端口转发。
本地端口转发
命令的一般格式:ssh -L listen_port:DST_Host:DST_port user@Tunnel_Host
使用场景:hostA不能访问hostC,但可以访问hostB,而hostB可以访问hostC,所有hostA可以通过hostB来访问hostC,在hostA上执行:ssh -L 8080:hostC:22 root@hostB
,这样访问本地的8080端口就可以访问hostC的22端口。
工作机制:ssh监听本地的 listen_port ,并建立一条ssh通道到 Tunnel_Host ,当有连接连接到本地的listen_port 时,用ssh通道把连接转发到DST_Host:DST_port。所以访问本地的listen_port 就相当于访问了DST_Host:DST_port。
远程端口转发
命令的一般格式:ssh -L listen_port:DST_Host:DST_port user@Tunnel_Host
使用场景:hostA必须借助hostB访问hostC,但是hostB是内网机器,hostA是公网机器,hostB可以访问hostA,但hostA不能访问hostB。这样本地端口转发不能解决问题,需要远程端口转发。
在hostB上执行:ssh -R 8080:hostC:21 hostA
,意思是hostB连接到hostA上,让hostA监听自己的8080端口,将所有连接到hostA的8080连接的数据通过hostB转发到hostC的21端口。
动态端口转发
前面的本地端口转发与远程端口转发都是通过第三方的主机访问一台指定的服务器,但如果需要借助第三方的主机访问任意的服务器,就需要动态端口转发。
动态端口转发也叫SOCKS代理。
命令的一般格式:ssh -D listen_port user@Tunnel_Host
,意思是ssh用一条socket监听本地的listen_port,并建立ssh通道到Tunnel_Host,当有连接连接到listen_port,就通过安全通道转发到Tunnel_Host,Tunnel_Host根据创建连接的应用的协议来访问应用所要访问的服务器,就是说,这一个代理,安全的代理。这是一个最基本的梯子,能用来访问你本机不能访问但Tunnel_Host可以访问的服务。
一般的梯子可以这样建立: ssh -qTfnN -D 8080 root@coderbee.net
,再把浏览器的代理设为127.0.0.1,端口8080就行了。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。