paramiko的安装
安装paramiko有两个先决条件,python和另外一个名为PyCrypto的模块。
PyCrypto安装:
wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
tar -zxvf pycrypto-2.6.tar.gz
cd pycrypto-2.6/
python setup.py build && python setup.py install
测试:python>> import Crypto
编译时报错:error: command 'gcc' failed with exit status 1;这是因为缺少python-dev的软件包,所yum -y install python-devel)
paramiko安装:
wget http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz
tar xvzf paramiko-1.7.7.1.tar.gz
cd paramiko-1.7.7.1/
python setup.py build && python setup.py install
测试:python>> import paramiko
Crypto error: 'module' object has no attribute 'HAVE_DECL_MPZ_POWM_SEC'
找到 /usr/lib/python2.7/site-packages/Crypto/Util/number.py
把if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
注释了
#if _fastmath is not None and not _fastmath.HAVE_DECL_MPZ_POWM_SEC:
import paramiko
#paramiko远程密码的连接
#1.创建一个ssh对象
client=paramiko.SSHClient()
#2.如果之前没有,连接过的ip,会出现选择yes或者no的操作,这里设置自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#3.连接服务器
client.connect(hostname='192.168.1.202',port=22,username='root',password='root')
#4.执行操作
stdin,stdout,stderr=client.exec_command('hostname')
#5.获取命令执行的结果
result=stdout.read().decode('utf-8')
print(result)
#6.关闭连接
client.close()
"""
结果:dchu.oth
"""
#使用sftp上传文件
#1.获取Transport实例
tran=paramiko.Transport('192.168.1.202',22)
#2.Transport连接服务端
tran.connect(username='root',password='root')
#3.获取SFTP实例
sftp=paramiko.SFTPClient.from_transport(tran)
#4.本地文件路径
localpath='test.yml'
#5.远程服务器的文件路径:注:是文件路径
remotepath='/root/hudechao/test.yml'
#6.上传文件,注:内部实际代码为读取本地文件内容,然后将读取内容写入到远程服务器文件
sftp.put(localpath,remotepath)
tran.close()
#使用sftp下载文件
#方式一:获取tran
#1.获取Transport实例
tran=paramiko.Transport('192.168.1.202',22)
#2.Transport连接服务端
tran.connect(username='root',password='root')
#方式二:获取tran
client=paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.202',port=22,username='root',password='root')
tran=client.get_transport()
#3.获取SFTP实例
sftp=paramiko.SFTPClient.from_transport(tran)
#4.本地文件路径
localpath='test_bak.yml'
#5.远程服务器的文件路径:注:是文件路径
remotepath='/root/hudechao/test.yml'
#6.下载文件,注:内部实际代码为读取远程服务器文件内容,然后将读取内容写入到本地文件
sftp.get(remotepath,localpath)
tran.close()
#公钥秘钥文件连接
client=paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#1.设置本地秘钥文件
pkey=paramiko.RSAKey.from_private_key_file(r'C:\\Users\\hudechao\\.ssh\\id_rsa_53')
#2.连接ssh服务器
client.connect(hostname='192.168.1.53',port=22,username='root',pkey=pkey)
stdin,stdout,stderr=client.exec_command('hostname')
result=stdout.read().decode('utf-8')
print(result)
python代码使用本地代理,发送请求:
pip install PySocks
import urllib2
import socket
import socks
# socks5 猴子补丁:"127.0.0.1", 1080 是本地开放的代理IP和端口
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
# 业务代码(完全无感知)
urllib2.urlopen("http://www.somesite.com/")
python代码使用本地代理,连接linux机器:
import socket
import socks
import paramiko
# socks5 猴子补丁:"127.0.0.1", 1080 是本地开放的代理IP和端口
#这种设置代理有个缺陷:讲所有会话都设置了一个默认代理
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
socket.socket = socks.socksocket
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(hostname=hostname,port=port,username=username,pkey=pkey)
#连接后即可执行linux的命令
cmd='hostname'
stdin,stdout,stderr==client.execute_command(cmd)
#不用全局代理,仅仅为该ssh通道设置代理,这样其他会话不会收此代理影响
sock = socks.socksocket()
sock.set_proxy(socks.SOCKS5, "127.0.0.1", 1080)
sock.connect((hostname, int(port)))
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=hostname,port=int(port),username=username,pkey=pkey,sock=sock)