1 paramiko介绍
2 通过用户名密码方式远程执行命令
2.1 用户名密码
2.2 补充:批量执行命令
3 通过用户名密码方式上传下载文件
3.1 上传下载文件
3.2 通过用户名批量上传文件
4 通过公钥私钥远程执行命令
5 通过公钥私钥远程上传下载文件
6 通过私钥字符串远程连接服务器
7 生成公钥私钥并上传
-用于帮助开发者通过代码远程连接服务器,并对服务器进行操作。
pip install paramiko
import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.1.63', port=22, username='root', password='5740##')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -Th')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
print(result.decode('utf-8'))
import paramiko
import sys
def Ssh_exec_linux(ip, port, usernamme, password):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=ip, port=port, username=usernamme, password=password)
except Exception as e:
print("服务器%s连接失败!" % ip)
print(e)
sys.exit(1)
stdin, stdout, stderr = ssh.exec_command('df -Th')
print("服务器%s的磁盘使用率如下:" % ip)
print(stdout.read().decode('utf-8')) # stdout.read()的结果是bytes,需要解码一下
ssh.close()
if __name__ == '__main__':
servers = {
'192.168.200.133': {
'port': '22',
'username': 'root',
'password': '5740##'
},
'192.168.200.134': {
'port': '22',
'username': 'root',
'password': '5740##'
},
'192.168.200.135': {
'port': '22',
'username': 'root',
'password': '5740##'
},
}
for ip, info in servers.items():
Ssh_exec_linux(ip,
info.get('port'),
info.get('username'),
info.get('password'))
import paramiko
def sshFile():
try:
ssh_conn = paramiko.Transport(('192.168.200.133', 22))
ssh_conn.connect(username='root', password='5740##')
# 连接sftp客户端
ftp_client = ssh_conn.open_sftp_client()
# 下载
source_path = "/root/calico.yaml"
destination_path = "/Users/sanpangdan/Desktop/zjz_BBS/calico.yaml" # 指定完整的目标路径,包括文件名
ftp_client.get(source_path, destination_path)
# 上传
source_path = "/Users/sanpangdan/Desktop/zjz_BBS/Thumbs.db"
destination_path = "/root/Thumbs.db" # 指定完整的目标路径,包括文件名
ftp_client.put(source_path, destination_path)
except Exception as e:
print(f"发生错误:{str(e)}")
finally:
if 'ftp_client' in locals():
ftp_client.close()
if 'ssh_conn' in locals():
ssh_conn.close()
if __name__ == '__main__':
sshFile()
import paramiko
import os
def sshPutFile(ip, port, username, password, localfile, remotedir):
try:
# 创建SSH连接
ssh_conn = paramiko.Transport((ip, port))
ssh_conn.connect(username=username, password=password)
# 连接SFTP客户端
ftp_client = ssh_conn.open_sftp_client()
remotedir_file = os.path.join(remotedir, localfile)
# 上传本地文件到远程服务器
ftp_client.put(localfile, remotedir_file)
ssh_conn.close()
except Exception as e:
print(f"上传文件到 {ip} 时发生错误: {str(e)}")
if __name__ == '__main__':
servers = {
'192.168.200.133': {
'port': 22,
'username': 'root',
'password': '5740##',
'localfile': 'pi_put.py',
'remotedir': '/root/'
},
'192.168.200.134': {
'port': 22,
'username': 'root',
'password': '5740##',
'localfile': 'pi_put.py',
'remotedir': '/root/'
},
'192.168.200.135': {
'port': 22,
'username': 'root',
'password': '5740##',
'localfile': 'pi_put.py',
'remotedir': '/root/'
},
}
for ip, info in servers.items():
sshPutFile(
ip=ip,
port=info.get('port'),
username=info.get('username'),
password=info.get('password'),
localfile=info.get('localfile'),
remotedir=info.get('remotedir'))
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.200.132', port=22, username='root', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -Th')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
print(result)
--注:
在 Paramiko 中,pkey 选项用于指定用于身份验证的私钥。具体来说,这个选项允许你提供一个
paramiko.RSAKey 或 paramiko.DSSKey 对象,这些对象表示了你的私钥文件
如果你使用 RSA 密钥作为私钥,你可以按照以下方式设置 pkey 选项:
private_key = paramiko.RSAKey.from_private_key_file('/path/to/private/key')
如果你使用 DSA 密钥,可以这样设置:
private_key = paramiko.DSSKey.from_private_key_file('/path/to/private/key')
在连接服务器时,你可以将 private_key 对象传递给 pkey 参数,
import paramiko
private_key = paramiko.RSAKey.from_private_key_file(r'/root/.ssh/id_rsa')
transport = paramiko.Transport(('192.168.200.132', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/data/123.py', '/root/123.py')
# 将remove_path 下载到本地 local_path
# sftp.get('123.py', '123.py')
transport.close()
# 也可以是存在于数据库中
key = """-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----"""
import paramiko
from io import StringIO
private_key = paramiko.RSAKey(file_obj=StringIO(key))
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.16.85', port=22, username='root', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
print(result)
# 1 生成公钥和私钥s
sh-keygen.exe -m pem
# 2 在当前用户家目录会生成: .ssh/id_rsa.pub .ssh/id_rsa
# 3 把公钥放到服务器
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.16.85
# 4 以后再连接服务器时,不需要在输入密码
ssh root@192.168.16.85