如何使用Python通过SSH执行不同的命令?

如何使用Python通过SSH执行不同的命令?

在服务器上运行一些操作需要使用ssh连接到服务器,但是如果手动执行每个命令,浪费时间和人力成本。这时候,可以使用Python通过SSH执行不同的命令。这篇文章将介绍如何在Python中通过SSH连接到服务器,并执行不同的命令。

阅读更多:Python 教程

安装必要的库

首先,我们需要安装paramiko库,它是一个SSH协议的Python实现。使用pip命令进行安装:

pip install paramiko

SSH连接到服务器

在Python中连接到服务器通常使用paramiko库,下面是一个简单的连接到服务器的示例代码:

import paramiko

# 创建SSH客户端
ssh = paramiko.SSHClient()

# 自动添加主机到已知主机列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname='IP地址', username='用户名', password='密码')

# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')

# 打印结果
for line in stdout.readlines():
    print(line.strip())

# 关闭连接
ssh.close()

首先,我们创建了一个SSH客户端并将主机添加到已知主机列表中。然后将连接到主机,输入用户名和密码进行验证。最后执行了一个简单的命令“ls”来列出目录中的内容,并打印结果。当不需要连接时,我们需要将SSH客户端关闭。

执行多种命令

当我们需要执行多个命令时,将每个命令写在单独的SSH连接中会变得麻烦。我们可以通过在一个连接中执行多个命令来简化代码。下面是一个执行多种命令的示例:

import paramiko

# 创建SSH客户端
ssh = paramiko.SSHClient()

# 自动添加主机到已知主机列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname='IP地址', username='用户名', password='密码')

# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls; pwd; date')

# 打印结果
for line in stdout.readlines():
    print(line.strip())

# 关闭连接
ssh.close()

在这个例子中,我们在执行命令时使用的是一个字符串“ls; pwd; date”,其中分号可以用来分隔每个命令。当命令执行完成时,终端会返回输出结果,我们可以通过循环遍历输出内容,并打印。

使用SSH私钥进行连接

在一些情况下,我们需要使用私钥来连接到服务器而不是使用密码。为此,我们需要为SSH客户端添加私钥。下面是一个使用私钥连接的示例:

import paramiko

# 创建SSH客户端
ssh = paramiko.SSHClient()

# 自动添加主机到已知主机列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 使用密钥连接
ssh.connect(hostname='IP地址', username='用户名', key_filename='/path/to/private_key')

# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls')

# 打印结果
for line in stdout.readlines():
    print(line.strip())

# 关闭连接
ssh.close()

在此示例中,我们使用key_filename参数指定密钥的路径。如果没有指定此参数,paramiko库将依次查找密钥:~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/identity。当找到密钥时,paramiko将在客户端上使用它建立连接。

应对异常

在执行SSH命令时,可能会遇到许多问题,如连接丢失,超时等。在这些情况下,使用try/except语句可以避免程序中断并提示错误的信息。下面是一个处理异常的示例代码:

import paramiko# 创建SSH客户端
ssh = paramiko.SSHClient()

# 自动添加主机到已知主机列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:
    # 连接服务器
    ssh.connect(hostname='IP地址', username='用户名', password='密码')

    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('ls')

    # 打印结果
    for line in stdout.readlines():
        print(line.strip())

    # 关闭连接
    ssh.close()
except Exception as e:
    print('连接出错:', e)

在这个示例中,如果有任何连接问题,异常处理程序将捕获并打印错误消息。

通过SSH传输文件

除了执行命令,我们还可以使用paramiko库在本地和远程主机之间传输文件。下面是一个使用paramiko库传输文件的示例代码:

import paramiko

# 创建SSH客户端
ssh = paramiko.SSHClient()

# 自动添加主机到已知主机列表
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname='IP地址', username='用户名', 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连接
ssh.close()

在此示例中,我们创建了一个SFTP客户端来传输文件。使用put命令将本地文件上传到远程主机,使用get命令从远程主机下载文件到本地。完成所有任务后,我们需要关闭SFTP连接和SSH连接。

结论

使用Python通过SSH连接到服务器,并执行不同的命令,可以帮助我们简化操作过程。使用paramiko库,我们可以轻松地连接到服务器并执行不同的命令,或者在本地和远程主机之间传输文件。在实现代码时,我们需要处理好异常情况,以避免出现意外情况。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程