一、SSH简介
SSH(Secure Shell)属于在传输层上运行的用户层协议,相对于Telnet来说具有更高的安全性。SSH是专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
二、SSH远程连接
SSH远程连接有两种方式,一种是通过用户名和密码直接登录,另一种则是用过密钥登录。
1、用户名和密码登录
老王要在自己的主机登录老张的电脑,他可以通过运行以下代码来实现
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 跳过了远程连接中选择‘是’的环节,
ssh.connect('IP', 22, '用户名', '密码')
stdin, stdout, stderr = ssh.exec_command('df') print stdout.read()
在这里要用到paramiko模块,这是一个第三方模块,要自自己导入(要想使用paramiko模块,还要先导入pycrypto模块才能用)。
查看并启动ssh服务
service ssh status
添加用户:useradd -d /home/zet zet
passwd zet
赋予ssh权限
vi /etc/ssh/sshd_config
添加
AllowUsers:zet
2、密钥登录
老王要在自己的主机登录老张的电脑,老王用命令ssh.keygen -t rsa生成公钥和私钥,他将自己的公钥发给老张,使用ssh-copy-id -i ~/ssh/id_rsa.pub laozhang@IP命令
然后运行以下代码来实现
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('IP', 22, '用户名', key)
stdin, stdout, stderr = ssh.exec_command('df') print stdout.read()
关于密钥登录,每个人都有一个公钥,一个私钥,公钥是给别人的,私钥是自己留着,只有自己的私钥能解开自己公钥加密的文件。
老王有一个机密文件要发给老张,就要先下载老张的公钥进行加密,这样老张就能用自己私钥解开这份机密文件,获得内容。
如果老张要确认是否是老王本人给他的机密文件,就去下载一个老王的公钥,随机写一些字符,用老王的公钥加密,发给老王,老王解密之后发回给老张,如果老张收到的解密后的字母和自己发出去的一样,对方就是老王无疑了。
三、使用SSH连接服务器
客户端代码:
#-*- coding:utf8 -*-
import threading
import paramiko
import subprocess
def ssh_command(ip, user, passwd, command, port = 22):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #设置自动添加和保存目标ssh服务器的ssh密钥
client.connect(ip, port, username=user, password=passwd) #连接