通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何进行ssh连接

python如何进行ssh连接

Python进行SSH连接可以使用、paramiko库、authentication、channel对象

Paramiko是一个用于在Python中进行SSH连接的第三方库,它实现了SSH2协议,提供了客户端和服务器端的功能。下面我将详细描述如何使用Paramiko库进行SSH连接,并进行一些基本的操作。

一、安装Paramiko库

在进行SSH连接之前,我们需要确保已经安装了Paramiko库。如果尚未安装,可以使用pip进行安装:

pip install paramiko

二、建立SSH连接

要进行SSH连接,首先需要创建一个SSH客户端对象,然后使用该对象连接到远程服务器。连接后,可以执行命令、上传和下载文件等操作。以下是一个示例代码:

import paramiko

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

执行命令

stdin, stdout, stderr = ssh.exec_command('ls -l')

print(stdout.read().decode())

关闭连接

ssh.close()

三、使用密钥进行认证

除了使用用户名和密码进行认证外,还可以使用SSH密钥进行认证。以下是使用私钥文件进行认证的示例:

import paramiko

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

加载私钥文件

private_key = paramiko.RSAKey.from_private_key_file('/path/to/your/private_key')

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', pkey=private_key)

执行命令

stdin, stdout, stderr = ssh.exec_command('ls -l')

print(stdout.read().decode())

关闭连接

ssh.close()

四、传输文件

Paramiko还提供了SFTP功能,可以用于在本地和远程服务器之间传输文件。以下是上传和下载文件的示例:

import paramiko

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

创建SFTP会话

sftp = ssh.open_sftp()

上传文件

sftp.put('/path/to/local/file', '/path/to/remote/file')

下载文件

sftp.get('/path/to/remote/file', '/path/to/local/file')

关闭SFTP会话

sftp.close()

关闭连接

ssh.close()

五、处理命令执行结果

执行命令后,可以通过stdout和stderr对象获取命令的输出结果和错误信息。这些对象提供了多种方法来读取数据,例如read(), readlines()等。以下是一些示例:

import paramiko

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

执行命令

stdin, stdout, stderr = ssh.exec_command('ls -l')

读取命令输出

output = stdout.read().decode()

error = stderr.read().decode()

print("Output:")

print(output)

print("Error:")

print(error)

关闭连接

ssh.close()

六、保持长连接和交互式会话

在某些情况下,你可能需要保持长连接,并与远程服务器进行交互。可以使用Paramiko的Channel对象来实现这一点。以下是一个示例,演示如何创建一个交互式会话:

import paramiko

import time

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

创建一个交互式通道

channel = ssh.invoke_shell()

发送命令

channel.send('ls -l\n')

等待命令执行完成

time.sleep(1)

读取输出

output = channel.recv(1024).decode()

print(output)

关闭通道和连接

channel.close()

ssh.close()

七、处理连接异常和超时

在实际应用中,可能会遇到连接失败、超时等情况。我们可以使用try-except块来捕获这些异常并进行处理。以下是一个示例:

import paramiko

try:

# 创建SSH客户端对象

ssh = paramiko.SSHClient()

# 自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password', timeout=10)

# 执行命令

stdin, stdout, stderr = ssh.exec_command('ls -l')

print(stdout.read().decode())

except paramiko.AuthenticationException:

print("Authentication failed")

except paramiko.SSHException as sshException:

print(f"Unable to establish SSH connection: {sshException}")

except paramiko.BadHostKeyException as badHostKeyException:

print(f"Unable to verify server's host key: {badHostKeyException}")

except Exception as e:

print(f"Operation error: {e}")

finally:

# 关闭连接

ssh.close()

八、使用配置文件管理连接信息

在实际应用中,我们可能需要管理多个服务器的连接信息。可以将这些信息存储在一个配置文件中,并在程序中读取配置文件。以下是一个示例:

配置文件(config.yaml):

servers:

- hostname: your_server_ip

port: 22

username: your_username

password: your_password

读取配置文件并进行SSH连接的代码:

import paramiko

import yaml

读取配置文件

with open('config.yaml', 'r') as file:

config = yaml.safe_load(file)

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

遍历服务器列表并进行连接

for server in config['servers']:

try:

ssh.connect(hostname=server['hostname'], port=server['port'], username=server['username'], password=server['password'])

stdin, stdout, stderr = ssh.exec_command('ls -l')

print(stdout.read().decode())

except Exception as e:

print(f"Failed to connect to {server['hostname']}: {e}")

finally:

ssh.close()

九、优化连接性能

在处理大量服务器或频繁连接的场景中,可以通过以下方式优化连接性能:

  1. 连接池:使用连接池来复用已有的SSH连接,减少连接建立的开销。
  2. 异步操作:使用异步编程模型(如asyncio)来同时处理多个连接,提高并发性能。
  3. 批量操作:在一个连接中执行多个命令,减少连接次数和开销。

连接池示例:

import paramiko

from queue import Queue

class SSHConnectionPool:

def __init__(self, max_size=10):

self.pool = Queue(max_size)

for _ in range(max_size):

self.pool.put(self._create_connection())

def _create_connection(self):

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

return ssh

def get_connection(self):

return self.pool.get()

def release_connection(self, ssh):

self.pool.put(ssh)

使用连接池

pool = SSHConnectionPool(max_size=5)

ssh = pool.get_connection()

stdin, stdout, stderr = ssh.exec_command('ls -l')

print(stdout.read().decode())

pool.release_connection(ssh)

异步操作示例:

import paramiko

import asyncio

async def ssh_command(hostname, port, username, password, command):

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname=hostname, port=port, username=username, password=password)

stdin, stdout, stderr = ssh.exec_command(command)

result = stdout.read().decode()

ssh.close()

return result

async def main():

tasks = [

ssh_command('your_server_ip1', 22, 'your_username', 'your_password', 'ls -l'),

ssh_command('your_server_ip2', 22, 'your_username', 'your_password', 'ls -l')

]

results = await asyncio.gather(*tasks)

for result in results:

print(result)

asyncio.run(main())

十、使用Paramiko代理和跳板机

在某些网络环境中,可能需要通过跳板机(bastion host)进行SSH连接。Paramiko提供了代理功能,可以实现通过跳板机进行连接。以下是一个示例:

import paramiko

配置跳板机连接

bastion_host = 'bastion_host_ip'

bastion_username = 'bastion_username'

bastion_password = 'bastion_password'

配置目标服务器连接

target_host = 'target_host_ip'

target_username = 'target_username'

target_password = 'target_password'

连接跳板机

bastion = paramiko.SSHClient()

bastion.set_missing_host_key_policy(paramiko.AutoAddPolicy())

bastion.connect(hostname=bastion_host, username=bastion_username, password=bastion_password)

创建跳板机到目标服务器的通道

bastion_transport = bastion.get_transport()

dest_addr = (target_host, 22)

local_addr = ('127.0.0.1', 22)

bastion_channel = bastion_transport.open_channel("direct-tcpip", dest_addr, local_addr)

通过跳板机连接目标服务器

target = paramiko.SSHClient()

target.set_missing_host_key_policy(paramiko.AutoAddPolicy())

target.connect(hostname=target_host, username=target_username, password=target_password, sock=bastion_channel)

执行命令

stdin, stdout, stderr = target.exec_command('ls -l')

print(stdout.read().decode())

关闭连接

target.close()

bastion.close()

十一、使用Paramiko进行端口转发

Paramiko还支持端口转发,可以将本地端口转发到远程服务器,或者将远程端口转发到本地。以下是一个示例:

import paramiko

配置远程服务器连接

hostname = 'your_server_ip'

port = 22

username = 'your_username'

password = 'your_password'

连接远程服务器

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname=hostname, port=port, username=username, password=password)

设置本地端口转发到远程服务器

local_port = 8080

remote_host = 'remote_host_ip'

remote_port = 80

transport = ssh.get_transport()

transport.request_port_forward('127.0.0.1', local_port, remote_host, remote_port)

保持连接

try:

while True:

pass

except KeyboardInterrupt:

transport.cancel_port_forward('127.0.0.1', local_port)

ssh.close()

十二、使用Paramiko执行复杂命令和脚本

在实际应用中,可能需要在远程服务器上执行复杂的命令和脚本。可以将命令和脚本作为字符串传递给exec_command方法,并通过stdin传递输入参数。以下是一个示例:

import paramiko

创建SSH客户端对象

ssh = paramiko.SSHClient()

自动添加策略,用于将服务器的主机密钥添加到本地的known_hosts文件中

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

连接到远程服务器

ssh.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')

执行复杂命令和脚本

script = '''

#!/bin/bash

echo "Hello, World!"

uptime

df -h

'''

stdin, stdout, stderr = ssh.exec_command('bash -s', get_pty=True)

stdin.write(script)

stdin.channel.shutdown_write()

读取输出

output = stdout.read().decode()

error = stderr.read().decode()

print("Output:")

print(output)

print("Error:")

print(error)

关闭连接

ssh.close()

总结

本文介绍了如何使用Python和Paramiko库进行SSH连接,包括基本的连接操作、使用密钥认证、传输文件、处理命令输出、保持长连接、处理异常、使用配置文件、优化连接性能、通过跳板机连接、端口转发以及执行复杂命令和脚本。通过这些内容,你可以在Python中轻松实现SSH连接和远程操作,提高自动化运维和管理的效率。

相关问答FAQs:

如何使用Python库实现SSH连接?
要在Python中实现SSH连接,可以使用paramiko库。这个库提供了一个简单的接口来处理SSH连接。首先,您需要安装该库,可以通过pip install paramiko进行安装。创建SSH客户端对象后,可以使用connect()方法连接到远程服务器,提供必要的认证信息,如主机名、用户名和密码或私钥。

Python SSH连接的安全性如何保障?
在使用Python进行SSH连接时,确保安全性是非常重要的。建议使用密钥对进行身份验证,而不是明文密码。这种方法不仅更安全,而且可以避免密码泄露的风险。此外,您还可以在连接时验证服务器的公钥,以确保您连接的是预期的主机。

如何处理Python中的SSH连接异常?
在进行SSH连接时,可能会遇到一些异常情况,例如网络问题或身份验证失败。可以使用try...except语句来捕获这些异常,并进行适当的处理。例如,可以捕获paramiko.AuthenticationException以处理身份验证失败的问题,或者捕获paramiko.SSHException处理其他可能的SSH相关错误。这样可以确保程序在出现问题时不会崩溃,并可以输出友好的错误信息。

相关文章