本文主要介绍 paramiko 的概念及其使用 ’ ’ 。
Last Updated: 2022 / 7 / 16
概念
paramiko 是用 python 语言写的一个模块,遵循 SSH2 协议 (底层使用 cryptography ),支持以加密和认证的方式,进行远程服务器的连接。
由于使用的是 python 这样的能够跨平台运行的语言,所以所有 python 支持的平台,如 Linux , Solaris , BSD , MacOS X , Windows 等,paramiko 都可以支持,因此,如果需要使用 SSH 从一个平台连接到另外一个平台,进行一系列的操作时,paramiko 是最佳工具之一。
举个常见的例子,现有这样的需求:需要使用 windows 客户端,远程连接到 Linux 服务器,查看上面的日志状态,大家通常使用的方法会是:
- 用
telnet ; - 用
PUTTY ; - 用
WinSCP ; - 用
XManager 等;
那现在如果需求又增加一条,要从服务器上下载文件,该怎么办?那常用的办法可能会是:
Linux 上安装 FTP 并配置 ;Linux 上安装 Sambe 并配置 ;
大家会发现,常见的解决方法都会需要对远程服务器必要的配置,如果远程服务器只有一两台还好说,如果有N台,还需要逐台进行配置,或者需要使用代码进行以上操作时,上面的办法就不太方便了。
使用 paramiko 可以很好的解决以上问题。比起前面的方法,它仅需要在本地上安装相应的软件(python 以及 PyCrypto ),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助,可以在 Python 代码中直接使用 SSH 协议对远程服务器执行操作,而不是通过 ssh 命令对远程服务器进行操作,比如连接远程服务器、执行命令和上传、下载文件的功能。。
安装
安装 paramiko 有两个先决条件,python 和另外一个名为 PyCrypto 的模块。
通常安装标准的 python 模块,只需要在模块的根目录下运行:
python setup.py build
python setup.py install
或者,
pip install xxx
paramiko 和 PyCrypto 也不例外,唯一麻烦的就是安装 PyCrypto 时,需要 GCC 库编译,如果没有 GCC 库会报错,会导致 PyCrypto 以及 paramiko 无法安装。
windows
以下以32 位的 windows XP 为例,说明 paramiko 的安装过程:
- 安装python,
2.2 以上版本都可以,安装过程略,并假设安装目录是 c:\python ; - 判断本地是否安装了
GCC ,并在 PATH 变量可以找到。 如果没有,可使用 windows 版的 GCC ,即 MinGW ,下载地址为 http://sourceforge.net/projects/mingw/ ,然后运行下载后的 exe 文件进行网络安装,假设目录为 C:\mingw ,在 PATH 中加入 C:\mingw\bin ,并在 c:\python\lib\distutils 下新建一个名称是 distutils.cfg 的文件,填入:
[build]
compiler=mingw32
- 下载
PyCrypto ,地址是 https://www.dlitz.net/software/pycrypto/ 安装PyCrypto的步骤为,解压缩,在 dos 下进入解压缩的目录,运行
C:\python\python.exe setup.py build
C:\python\python.exe setup.py install
测试 paramiko , 运行 python.exe ,在提示符下输入 Import paramiko 。如果没有出现错误提示,说明 paramiko 安装成功
使用
单线程
SSH
连接
SSHClient
client = paramiko.SSHClient.connect(
hostname,
port=SSH_PORT,
username=None,
password=None,
pkey=None,
key_filename=None,
timeout=None,
allow_agent=True,
look_for_keys=True,
compress=False,
sock=None,
gss_auth=False,
gss_kex=False,
gss_deleg_creds=True,
gss_host=None,
banner_timeout=None,
auth_timeout=None,
gss_trust_dns=True,
passphrase=None,
disabled_algorithms=None,
)
Transport
t = paramiko.Transport((“主机”,”端口”))
t.connect(username = “用户名”, password = “口令”)
应对策略
ssh.set_missing_host_key_policy()
设置连接的远程主机没有本地主机密钥或 HostKeys 对象时的策略,目前支持三种:
执行命令
exec_command(
command,
bufsize=-1,
timeout=None,
get_pty=False,
environment=None,
)
示例
参考此处 ’ ’
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.1.1', port=22, username='root', password='123456')
stdin, stdout, stderr = client.exec_command('df -h ')
print(stdout.read().decode('utf-8'))
client.close()
stdin 无法被 read() ,它是 input , 而非 output ,否则将会报出 "File is not open for reading" 。
sftp
参考此处 ’
示例
if __name__ == '__main__':
transport = paramiko.Transport(('10.50.10.150',22))
transport.connect(username='kali',password='kali')
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(r'E:\Users\Desktop\test.txt','/opt/test1.txt')
sftp.get('/opt/test2.txt',r'E:\Users\Desktop\test2.txt')
transport.close()
f’ ‘:格式化 r’ ‘:去除转义 b’ ‘:指定为字节类型 u’ ':指定为Unicode编码
多线程
SSH
import sys
import paramiko
import threading
import os
def remote_comm(host, pwd, command):
'''
创建函数实现远程连接主机、服务器密码以及在远程主机上执行的命令的功能
:param host:
:param pwd:
:param command:
:return:
'''
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=host, username='root', password=pwd)
except:
return
stdin, stdout, stderr = ssh.exec_command(command)
out = stdout.read()
error = stderr.read()
if out:
print('[%s] OUT:\n%s' % (host, out.decode('utf8')))
if error:
print('[%s] ERROR:\n%s' % (host, error.decode('utf8')))
ssh.close()
if __name__ == '__main__':
if len(sys.argv) != 3:
print('Usage: %s ipaddr_file "command"' % sys.argv[0])
exit(1)
if not os.path.isfile(sys.argv[1]):
print('No such file:', sys.argv[1])
exit(2)
fname = sys.argv[1]
command = sys.argv[2]
pwd='Taren1.bgsn'
with open(fname) as fobj:
ips = [line.strip() for line in fobj]
for ip in ips:
t = threading.Thread(target=remote_comm, args=(ip, pwd, command))
t.start()
详情需参考此处
参考链接
|