SSH下know_hosts的作用(转)

原文地址:http://blog.csdn.net/yasaken/article/details/7348441 

在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that the RSA host key has just been changed.The fingerprint for the RSA key sent by the remote host is36:68:a6:e6:43:34:6b:82:d7:f4:df:1f:c2:e7:37:cc.Please contact your system administrator.Add correct host key in /u/xlian008/.ssh/known_hosts to get rid of this message.Offending key in /u/xlian008/.ssh/known_hosts:2RSA host key for 135.1.35.130 has changed and you have requested strict checking.Host key verification failed. 


比较奇怪,于是研究了一下。 
ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。我在上面列出的情况,就是这种情况。 

原因:一台主机上有多个Linux系统,会经常切换,那么这些系统使用同一ip,登录过一次后就会把ssh信息记录在本地的~/.ssh/known_hsots文件中,切换该系统后再用ssh访问这台主机就会出现冲突警告,需要手动删除修改known_hsots里面的内容。 

有以下两个解决方案: 
1. 手动删除修改known_hsots里面的内容; 
2. 修改配置文件“~/.ssh/config”,加上这两行,重启服务器。 
   StrictHostKeyChecking no 
   UserKnownHostsFile /dev/null 

优缺点: 
1. 需要每次手动删除文件内容,一些自动化脚本的无法运行(在SSH登陆时失败),但是安全性高; 
2. SSH登陆时会忽略known_hsots的访问,但是安全性低;
Paramiko 是一个用 Python 编写的模块,它提供了对 SSHv2 协议的支持。可以用来在服务器上执行命令、文件传输等操作。使用 Paramiko 执行 SSH 命令通常包括以下几个步骤: 1. 安装 Paramiko 模块:可以通过 pip 工具来安装 Paramiko,使用命令 `pip install paramiko`。 2. 创建 SSH 对象:使用 Paramiko 的 `SSHClient` 对象创建一个 SSH 客户端,并连接到目标服务器。 3. 自动接受主机密钥:为了避免每次连接时都手动确认服务器的密钥,可以设置自动接受。 4. 执行命令:使用 `exec_command` 方法在服务器上执行命令,并获取命令执行的输出。 下面是一个简单的示例代码,展示如何使用 Paramiko 连接到 SSH 服务器并执行命令: ```python import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器,需要提供hostname, port(默认是22), username, password ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password') # 执行命令 stdin, stdout, stderr = ssh.exec_command('ls -l') # 获取命令结果 for line in stdout: print(line.strip('\n')) # 关闭连接 ssh.close() ``` 在使用 Paramiko 执行 SSH 命令时,请确保正确处理了异常和错误,比如网络问题、认证失败等,并且在生产环境中建议不要直接使用密码,而是使用密钥认证的方式来提高安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值