SSH使用总结

原创 2013年12月03日 20:28:05

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目录中的内容。

备注:

使用ssh-copy-id命令可以将本地的公钥添加到远程主机的~/.ssh/authorized_keys文件中,从而建立信任关系,而不用手动复制黏贴公钥内容。命令使用举例:
ssh-copy-id -i ~/.ssh/id_dsa.pub 10.16.20.18  #即将本地的公钥拷贝到远程主机10.16.20.18的~/.ssh/authorized_keys文件中

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参数的含义?


版权声明:本文为博主原创文章,未经博主允许不得转载。

SSH框架总结(框架分析+环境搭建+实例源码下载)

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。   集成SS...
  • shan9liang
  • shan9liang
  • 2013年04月25日 10:00
  • 494782

ssh防止挂死的小技巧

1、ssh 使用加-o StrictHostKeyChecking=no参数 可规避这个问题 ssh -l pyncloud 10.137.47.18 ls The authenticity of...
  • mezheng
  • mezheng
  • 2014年05月20日 15:24
  • 3208

ssh StrictHostKeyChecking

SSH客户端的配置文件中有一个选项StrictHostKeyChecking,默认是“ask”,可以把它改为“no”,这样主机密钥就会在连接时自动加入到known_hosts中去。 ssh会把你每个你...
  • aabbcc456aa
  • aabbcc456aa
  • 2014年02月08日 10:53
  • 6167

SSH的Linux使用

只要步骤:1)生成一对key,public key放在服务器上,home/用户名/.ssh/authorized_keys;private key 放在本地连接认证用的2)配置服务器上的/etc/ss...
  • wclin88
  • wclin88
  • 2011年07月22日 11:33
  • 2543

防止ssh命令卡死的方法

有时候我们会写一些脚本,脚本中包含ssh命令,到别的机器上执行一些命令,偶尔会出现ssh命令卡死的情况,用下面这个命令可以防止这种情况出现。 ssh -o ConnectTimeout=3 -o C...
  • u013050697
  • u013050697
  • 2017年06月29日 16:25
  • 554

SSH常用参数

SSH常用参数 ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o S...
  • chenglinhust
  • chenglinhust
  • 2016年08月11日 22:33
  • 1312

SSH总结

一:SSH Struts(表示层) + Spring(业务层) + Hibernate(持久层) Struts是一个表示层的框架,主要作用是界面的展示,接收请求,分发请求。在MVC框架中,Stru...
  • xuewenke
  • xuewenke
  • 2014年03月21日 22:38
  • 680

SSH知识归纳总结(详细)

  • 2017年01月09日 10:02
  • 2.62MB
  • 下载

ssh总结

ssh总结 1. struts 1.1 struts运行机制(原理)及其为什么要使用   struts工作原理 1)客户端发出一个HttpServletRequest请求,到web服务器的s...
  • u013947003
  • u013947003
  • 2014年09月03日 13:31
  • 475

ssh防止连接掉线

TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 有些时候隧道会因为一些原因通信不畅而卡死,例如:由于传输数据量...
  • SUKHOI27SMK
  • SUKHOI27SMK
  • 2015年09月07日 12:35
  • 3461
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SSH使用总结
举报原因:
原因补充:

(最多只允许输入30个字)