0%

ssh命令

ssh程序是SSH Client中的客户程序,下面根据不同应用场景中ssh程序的使用来介绍ssh程序。

一、基本应用场景

在本应用场景中,建立SSH连接,允许进行“用户登录,命令执行等”操作。

1.1、建立ssh连接命令

在本场景中,使用ssh程序建立SSH连接的命令如下:

1
ssh -l dslztx -i ~/.ssh/id_dsa -p 22 192.168.1.5

1.1.1、选项的含义

1、“-i”
指定私钥文件
2、“-p”
指定SSH Server监听端口
3、“-l”
指定SSH连接登录用户
4、“192.168.1.5”
表示SSH Server所在机器的IP地址

1.1.2、ssh_config文件中对应的配置

以上这些参数值可在“ssh_config文件”中配置,配置后内容如下:

1
2
3
4
5
Host RemoteHost #指定配置匹配条件
HostName 192.168.1.5
User dslztx
Port 22
IdentityFile ~/.ssh/id_dsa

现在执行ssh RemoteHost命令,即可达到跟执行原来命令相同的效果。

二、SSH隧道应用场景

在本应用场景中,建立SSH连接,将SSH连接作为隧道。在继续之前,首先进行以下几点说明:

  1. SSH Client端所在的机器称为“本地机器”,SSH Server端所在的机器称为“RemoteHost”
  2. “-l,-i,-p,域名或者ip地址”这些参数的参数值已经在“ssh_config文件”中配置
  3. 根据《SSH协议》,ssh连接必须由SSH Client请求建立,但是一旦得以建立,数据通信请求既可由SSH Client发起,也可由SSH Server发起,即在SSH连接建立后,可由任意端发起数据通信请求

使用SSH隧道的应用具体又可细分为4种形式,下面分别进行介绍。

2.1、SSH Client端设定被监听的应用转发端口——本地转发

2.1.1、建立ssh连接命令

在本场景中,使用ssh程序建立SSH连接的命令如下:

1
ssh -L [bind_address:]port:host:hostport RemoteHost  
2.1.1.1、选项的含义

1、“port”
本地机器的端口号,被监听的应用转发端口
2、“host”
当其值为“localhost”或者“127.0.0.1”时,相当于一个“相对地址”,它的绝对地址是“RemoteHost”;否则,它的绝对地址就是“host”值。(即以“RemoteHost”为参照基准)
3、“hostport”
“host”所表示机器上的端口号
4、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是本地机器,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“本地机器”为参照基准)

2.1.1.2、ssh_config文件中对应的配置

“[bind_address:]port:host:hostport”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“LocalForward”。

2.1.2、原理分析

建立的SSH连接被应用作为隧道,由于SSH Client端设定被监听的应用转发端口,因此应用连接必须由本地机器上的应用程序发起建立,称为本地转发
具体的数据流图如图1所示。

图1

有以下几点需要注意:

  • 执行ssh -L [bind_address:]port:host:hostport RemoteHost建立SSH连接隧道,设置好被监听的转发端口,转发目标地址和端口等参数
  • 应用连接由本地机器上的应用程序发起建立
  • 在应用连接由本地机器上的应用程序发起建立之后:
    当“bind_address”为“127.0.0.1/localhost”,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道5。依此类推

2.2、SSH Server端设定被监听的应用转发端口——远端转发

2.2.1、建立ssh连接命令

在本场景中,使用ssh程序建立SSH连接的命令如下:

1
ssh -R [bind_address:]port:host:hostport RemoteHost  
2.2.1.1、选项的含义

1、“port”
“RemoteHost”上的端口号,被监听的应用转发端口
2、“host”
当“host”值为“localhost”或者“127.0.0.1”时,相当于一个“相对地址”,它的绝对地址是“本地机器”;否则,它的绝对地址就是“host”值(即以本地机器为参照基准)
3、“hostport”
“host”所表示机器上的端口号
4、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是“RemoteHost”,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“RemoteHost”为参照基准)

2.2.1.2、ssh_config文件中对应的配置

“[bind_address:]port:host:hostport”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“RemoteForward”。

2.2.2、原理分析

建立的SSH连接被应用连接作为隧道,由于SSH Server端设定被监听的应用转发端口,因此应用连接由“RemoteHost”上的应用程序发起建立,称为远端转发
(注意,SSH连接隧道由SSH Client发起建立,但是一旦得以建立SSH Client和SSH Server都可在SSH连接隧道上发起数据通信请求。因而“RemoteHost”上的应用程序发起建立应用连接的请求,进而由SSH Server在SSH连接隧道上发起相应的数据通信请求是可行的)
具体的数据流图如图2所示。

图2

有以下几点需要注意:

  • 执行ssh -R [bind_address:]port:host:hostport RemoteHost建立SSH连接隧道,设置好被监听的转发端口,转发目标地址和端口等参数
  • 应用连接由“RemoteHost”上的应用程序发起建立
  • 在应用连接由“RemoteHost”上的应用程序发起建立之后:
    当“bind_address”为“127.0.0.1/localhost”,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“host”为“127.0.0.1/localhost”时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道5。依此类推

2.3、动态转发

2.3.1、建立ssh连接命令

在本场景中,使用ssh程序建立SSH连接的命令如下:

1
ssh -D [bind_address:]port RemoteHost
2.3.1.1、选项含义

1、“port”
本地机器的端口号,被监听的动态转发端口
2、“bind_address”
表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道。当“bind_address”值为“localhost”或“127.0.0.1”时,相当于一个相对地址,它的绝对地址是本地机器,表示只有来自自身的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值不为“localhost”或者“127.0.0.1”,而为特定的某个域名或者IP地址时,它的绝对地址就是“bind_address”值,表示只有来自“bind_address”地址的对“port”端口的访问才被允许通过SSH隧道;当“bind_address”值为“*”或者为空时,没有所谓的绝对地址,表示来自所有地址的对“port”端口的访问都被允许通过SSH隧道(即以“本地机器”为参照基准)

2.3.1.2、ssh_config文件中对应的配置

“[bind_address:]port”这些参数的参数值可以在“ssh_config文件”中配置,具体配置选项是“DynamicForward”。

2.3.2、原理分析

建立的SSH连接被应用作为隧道,由于SSH Client端设定被监听的应用动态转发端口,因此应用连接必须由本地机器上的应用程序发起建立,但是跟“本地转发”不一样的是,转发目标地址和转发目标端口都根据应用协议动态获得。这被称为动态转发
其实在动态转发的过程中,主要应用的协议是“SOCKS4”或者“SOCKS5”,而不是“SSH”,此时SSH Client和SSH Server的身份分别是SOCKS Client和SOCKS Server。(OpenSSH默认不仅支持实现了SSH协议,还支持实现了SOCKS4和SOCKS5协议)。
具体的数据流图如图3所示。

图3

有以下几点需要注意:

  • 执行ssh -D [bind_address:]port RemoteHost建立SSH连接隧道,设置好被监听的转发端口等参数
  • 应用连接由本地机器上的应用程序发起建立
  • 在应用连接由本地机器上的应用程序发起建立之后:
    当“bind_address”为“127.0.0.1/localhost”,“转发目标地址和目标端口”为http://127.0.0.1/localhost:8080时,数据流通道为:数据通道2——数据通道3——SSH隧道——数据通道5;当“bind_address”为“非‘127.0.0.1/localhost’”的某个特定地址,“转发目标地址和目标端口”为http://www.youtube.com:80时,数据流通道为:数据通道1——数据通道3——SSH隧道——数据通道4。依此类推

2.4、图形界面扩展应用场景

2.4.1、建立ssh连接命令

在本场景中,使用ssh程序建立SSH连接的命令如下:

1
ssh -X RemoteHost  
2.4.1.1、选项含义

1、“-X”
表示允许图形界面扩展

2.4.1.2、ssh_config文件中对应的配置

“-X”允许图形界面扩展,可以在“ssh_config文件”中配置,具体配置选项是“ForwardX11”。

2.4.2、原理分析

建立的SSH连接被应用连接作为隧道,允许打开SSH Server所在机器上的图形界面应用程序并在SSH Client所在机器上显示,本应用场景的另外一个称呼是建立“X11”SSH连接。
在本场景中,X Client和X Server并没有通过X Protocol直接连接传输数据,而是通过SSH连接隧道传输数据,因而也属于SSH隧道应用范畴。
具体的数据流图如图4所示。

图4

有以下几点需要注意:

  • SSH Client开启“-X”选项需要SSH Server的支持,SSH Server可以在“sshd_config文件”中配置是否开启支持“-X”选项。详细内容可参见“man 5 sshd_config”中关于“X11”的内容
  • 执行ssh -X RemoteHost建立“X11”SSH连接隧道
  • 根据“X Window System”的介绍,X Server由“DISPLAY”这个环境变量指定,在建立“X11”SSH连接的过程中,会自动配置“RemoteHost”上的“DISPLAY”环境变量,并最终使得SSH Server被作为一个虚拟的X Server。此时SSH Client被作为一个虚拟的X Client
  • 在“X11”SSH连接建立之后,即SSH连接隧道得以建立,此时由SSH Client发起打开“RemoteHost”上的图形界面应用程序的请求(必须由SSH Client发起,因为SSH Client并没有作为虚拟的X Server),接下来应用程序的图形数据从“RemoteHost”上相应的X Client传递到“RemoteHost”上的SSH Server(虚拟X Server),接着通过SSH隧道传递到本地机器上的SSH Client(虚拟X Client),最后传递给本地机器上的真实X Server。数据流通道为:数据通道2——SSH隧道——数据通道1

三、其他

3.1、打印日志信息

在执行ssh命令的时候,可以加入“-v”选项,“-v”选项表示打印日志信息,这有助于我们进行调试,解决遇到的问题。最多可以加入3个“-v”选项,“-v”选项越多,表示打印的日志信息越详细。

3.2、端口选择原则

不管是在本地转发,远端转发还是动态转发中,被监听的用来转发的端口的端口号必须大于1023(否则需要root权限),并且该端口不被其他程序所占用。

3.3、关于在“本地转发,远端转发,动态转发”中提及到的“[bind_address:]port”的几点注意事项

1、“bind_address”值为“*”或者“为空”中的“为空”,是指这样的形式“:port”,而不是这样的形式“port”
2、在“ssh_config文件”(在远端转发中,相应的是“sshd_config文件”)中可以配置“GatewayPorts”参数值。当该值为“yes”时,“port”等价于“*:port”;当该值为“no”时,“port”等价于“localhost:port”
3、在执行ssh命令时,加入“-g”选项,等价于“*:port”的形式
4、为了更好的可读性和更精准的定义,“bind_address”还是显式配置比较好


参考文献: [1]man ssh [2]http://docstore.mik.ua/orelly/networking_2ndEd/ssh/ch09_03.htm [3]http://blog.csdn.net/dslztx/article/details/46654383
您的支持将鼓励我继续分享!