SSH使用总结

来源:互联网 发布:西安百度快照优化 编辑:程序博客网 时间:2024/05/22 10:28

1.SSHSecure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定。SSH是应用层的一个协议。

SSH是client/server的架构,需要有server端才可以哦

比如ssh的服务端程序是sshd, 而对应的客户端就是ssh命令了嘛。


2.ssh相关的配置文件

(1)ssh服务端配置文件是/etc/ssh/sshd_config

(2)ssh客户端配置文件按读取先后顺序有:A)命令行上的选项和参数  B)$HOME/.ssh/config(用户的ssh客户端配置文件) C)/etc/ssh/ssh_config(全局的ssh客户端配置文件,使用于所有用户)

用法举例,我们在使用ssh登陆一台远程主机时,如果不在命令中写明以什么账号登陆远程主机,那么就以本主机上的当前账户来ssh登录远程主机。但是如果我们需要以指定的账号登录远程主机,但不是在ssh命令注明账号(ssh username@hostname),这时我们可以在$HOME/.ssh/config配置user参数来指明默认已什么账号来登录远程主机。如下例子即表示以jianzai账号登录到匹配*test-dev*的主机名的机器。

Host *test-dev*
User jianzai


3.SSH的工作原理

 

SSH的通信监理过程如下:

          a)客户端发送请求,希望连接到服务器

          b)服务器收到请求后,服务器将自己的公钥发送给客户端(这里采用公钥密码体制)

          c)客户端收到服务器的公钥后,在自己的机器上生成一个秘钥,并用服务器的公钥加密后发送给服务器

          d)服务器收到客户端的秘钥后,要求客户端发来用户名和密码

          e)客户端利用自己秘钥去加密自己的用户名和密码发送给服务端(采用的对称密钥密码体制)

           f)服务端收到客户端的用户名和密码后,经过权限体系检验后,确定接受或者拒绝客户端的连接请求

 

4.SSH的优势:

传统的网络服务程序,如ftppoptelnet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。通过使用SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止DNS欺骗和IP欺骗。


5.ssh username@hostname与ssh hostname的区别

ssh username@hostname表示使用username的账户登录到机器hostname上。

ssh hostname时,先会去$HOME/.ssh/config和/etc/ssh/ssh_config配置文件中获取以什么账户登录到hostname上去,如果没有配置,那么尝试用本机的当前的账户登录到远程hostname机器


6. ~/.ssh/authorized_keys和~/.ssh/known_hosts的区别

二者虽然都记录的是其他主机主机的公钥,但是二者有着明显的不同作用。

当主机A想要B主机免密码登录A的话,那么就在A主机的 ~/.ssh/authorized_keys文件中加入B主机的公钥。那么当B主机登录A的时候,就不要输入密码了。也就是建立了B--》A的信任关系。

当主机A登录主机B的时候,A会在~/.ssh/known_hosts找到这个主机的公钥和这次传来的是否一样的。如果不一样,就拒绝登录。如果一样,那么提示输入密码(免密码和这个没有关系喽)。   如果主机B的公钥确实变了,解决方法就是在主机A中删除之前的公钥记录,然后重新登录时在记录到A的~/.ssh/known_hosts文件中。

备注:在使用信任关系登录到目标主机时,目标主机会判断用户HOME目录下的.ssh目录以及.ssh目录中的authorized_keys文件权限,需要满足后面的条件。authorized_keys文件的权限是644以下,最好是600,即防止其他用户修改此文件带来的安全问题。而.ssh目录的权限是755以下,最好是700,防止其他文件来修改.ssh目录中的内容。


7.日常使用ssh中,一些重要的选项

-f   当ssh登录动作,后面带有需要在远程主机上执行的命令时,如果加上-f选项,会将命令直接发到远程主机上执行然后退出远程连接,而不需要等待远程命令执行结束。如果不加-f选项,需要等待远程命令执行完毕后,才可以退出远程连接。

-n  同-f选项

-o  可以加上一些ssh的选项,其实就是ssh客户端配置文件($HOME/.ssh/config或/etc/ssh/ssh_config)中的一些信息。

               (1)-o StrictHostKeyChecking=yes|no|ask

                  StrictHostKeyChecking有两种功能,一是是否会自动地将远程主机的公钥记录到known_hosts中,二是当远程主机的公钥变化了,是否允许本地主机进行登录。当StrictHostKeyChecking=no时,表示在连接远程主机时,会主动把对方的公钥加到known_hosts中,而不会提示用户是否要记录这样的信息,且当远程主机的公钥变化了,仍然会连接上,不会出现因为公钥不对连接失败。例如,ssh -o StrictHostKeyChecking=no root@10.10.10.1

            (2)-o BatchMode=yes|no

             当BatchMode=yes时,表示将不会显示交互式口令输入,而是直接失败,从而避免批处理的时候卡住。当BatchMode=no时,将会提示用户输入密码。

            (3)-o ConnectTimeout=5

             表示ssh连接的超时时间,单位是秒。

-v 可以在屏幕上打印ssh客户端连接远程主机的过程,可用于debug ssh连接失败的原因。

-V 显示ssh的版本信息。


8.利用ssh工具在远程主机上执行命令

ssh hostname "command"
利用上面的命令,可以不需要登录到远程主机hostname的情况下,在远程主机hostname上执行command命令。


如下几个有意思的用法:

ssh hostname "bash "
通过上面的命令可以在本机上获取到远程主机的bash,然后可以输入一些command,与远程主机进行交互。

ssh hostname "bash -s " < scriptname
将本机上scriptname脚本文件内容通过标准输入重定向到远程主机上执行。这种用法实现了在远程主机上执行本地脚本文件。

9.使用ssh不需要交互式的输入密码的三种解决方案

使用ssh时,需要交互式的在文字界面上输入密码,但是有时我们不方便交互式的输入,例如用shell脚本中使用ssh的时候。为此有三种解决方案应对这样的操作场景,

(1)建立信任关系,ssh免密码登陆

(2)使用sshpass工具,可以从参数、环境变量、文件等获取密码,不需要再交互式的输入密码了,用法举例如下:

sshpass -p 123456 ssh root@remotehostname 'ls -l'   其中-p参数指定的是账户的密码

备注:sshpass工具是专门服务ssh的,让不用交互式的输入密码就可以登录机器的非常好用的工具。

(3)编写expect脚本

expect是一种能够按照脚本内容里面设定的方式与交互式程序进行“会话”的程序。根据脚本内容,expect可以知道程序会提示或反馈什么内容以及 什么是正确的应答。它是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。 shell脚本功能很强大,但是不能实现有交互功能的多机器之前的操作,例如ssh和ftp,而expect可以帮助我们来实现。

首先在机器上需要安装expect工具,然后编写expect的脚本script,例子如下:

#!/usr/bin/expect -f set ip [lindex $argv 0 ]     //接收第一个参数,并设置IP set password [lindex $argv 1 ]   //接收第二个参数,并设置密码 set timeout 10                   //设置超时时间 spawn ssh root@$ip       //发送ssh命令 expect {                 //返回信息匹配 "*yes/no" { send "yes\r"; exp_continue}  //如果上一条命令执行的结果中含有*yes/no的字符串,那么输入yes并继续 "*password:" { send "$password\r" }      //如果上一条命令执行的结果中含有*password的字符串,那么发送password变量作为密码 } interact          //交互模式,用户会停留在远程服务器上面.

备注,expect的脚本的亮点是可以再脚本中实现交互式的操作,所以的应用场景不只是ssh免密码这一个场景中

参考资料于:

http://blog.sina.com.cn/s/blog_4d3559c70101c0sv.html


10.其实,sftp和scp命令用的就是ssh的通道啦


11.ssh -t参数的含义?


原创粉丝点击