从零到一:用 Python 实现 SSH 连接并执行 Shell 命令

343 阅读5分钟

大家好!今天我们要聊一个非常实用的话题——如何用 Python 实现 SSH 连接并执行 Shell 命令。如果你是一个开发者,或者对自动化运维感兴趣,那么这篇文章绝对适合你。我们会从零开始,一步步实现这个功能,顺便还会讲几个笑话,让你在学习的路上不孤单!😄


什么是 Shell 命令?

在开始之前,我们先来聊聊什么是 Shell 命令。Shell 是操作系统的命令行解释器,它允许用户通过输入文本命令与操作系统进行交互。你可以把它想象成一个“翻译官”,负责把人类的指令翻译成计算机能听懂的语言。

举个例子:

  • 你想查看文件内容?输入 cat file.txt
  • 你想列出目录内容?输入 ls
  • 你想删除文件?输入 rm file.txt(小心别删错了,不然可能会哭晕在厕所 😭)。

Shell 命令是系统管理和自动化任务的核心工具。掌握了它,你就掌握了操作系统的“遥控器”!


Python 如何实现 SSH 连接并执行 Shell 命令?

现在,我们进入正题——如何用 Python 实现 SSH 连接并执行 Shell 命令。Python 有一个非常强大的库叫 paramiko,它可以帮助我们轻松实现这个功能。

1. 安装 paramiko

首先,我们需要安装 paramiko。如果你还没有安装,可以通过以下命令安装:

pip install paramiko

安装完成后,我们就可以开始写代码了!


2. Python 实现 SSH 连接并执行 Shell 命令

以下是一个完整的 Python 示例代码,演示如何通过 SSH 连接到远程服务器并执行 Shell 命令:

import paramiko

def ssh_exec_command(hostname, port, username, password, command):
    """
    通过 SSH 连接到远程服务器并执行 Shell 命令
    :param hostname: 服务器地址
    :param port: SSH 端口(默认 22)
    :param username: 用户名
    :param password: 密码
    :param command: 要执行的 Shell 命令
    :return: 命令输出和错误信息
    """
    # 创建 SSH 客户端
    ssh_client = paramiko.SSHClient()

    try:
        # 自动添加主机密钥(第一次连接时)
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        # 连接到服务器
        ssh_client.connect(hostname, port=port, username=username, password=password)

        # 执行命令
        stdin, stdout, stderr = ssh_client.exec_command(command)

        # 获取命令输出和错误信息
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')

        return output, error

    except Exception as e:
        return None, str(e)

    finally:
        # 关闭 SSH 连接
        ssh_client.close()

# 示例:连接到远程服务器并执行命令
if __name__ == "__main__":
    hostname = "your.server.com"  # 服务器地址
    port = 22                     # SSH 端口
    username = "your_username"    # 用户名
    password = "your_password"    # 密码
    command = "ls -l /home"       # 要执行的 Shell 命令

    # 执行命令
    output, error = ssh_exec_command(hostname, port, username, password, command)

    if output:
        print("命令输出:")
        print(output)
    if error:
        print("错误信息:")
        print(error)

3. 代码说明

  1. paramiko.SSHClient

    • 用于创建 SSH 客户端对象。
  2. set_missing_host_key_policy

    • 设置主机密钥策略。AutoAddPolicy 表示自动添加未知主机的密钥(适用于第一次连接)。
  3. connect

    • 连接到远程服务器,需要提供主机地址、端口、用户名和密码。
  4. exec_command

    • 在远程服务器上执行 Shell 命令,返回三个对象:
      • stdin:标准输入(通常不需要)。
      • stdout:标准输出(命令的执行结果)。
      • stderr:标准错误(命令的错误信息)。
  5. readdecode

    • 读取命令的输出和错误信息,并将其解码为字符串。
  6. close

    • 关闭 SSH 连接,释放资源。

4. 示例输出

假设远程服务器的 /home 目录下有以下内容:

drwxr-xr-x 2 user user 4096 Jan  1 00:00 documents
drwxr-xr-x 2 user user 4096 Jan  1 00:00 downloads

运行上述代码后,输出如下:

命令输出:
total 8
drwxr-xr-x 2 user user 4096 Jan  1 00:00 documents
drwxr-xr-x 2 user user 4096 Jan  1 00:00 downloads

5. 使用密钥认证(可选)

如果远程服务器使用 SSH 密钥认证而不是密码,可以使用 paramiko.RSAKey 加载私钥文件:

import paramiko
from paramiko import RSAKey

def ssh_exec_command_with_key(hostname, port, username, key_path, command):
    """
    使用 SSH 密钥连接到远程服务器并执行 Shell 命令
    :param hostname: 服务器地址
    :param port: SSH 端口(默认 22)
    :param username: 用户名
    :param key_path: 私钥文件路径
    :param command: 要执行的 Shell 命令
    :return: 命令输出和错误信息
    """
    ssh_client = paramiko.SSHClient()

    try:
        # 自动添加主机密钥
        ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        # 加载私钥
        private_key = RSAKey.from_private_key_file(key_path)

        # 连接到服务器
        ssh_client.connect(hostname, port=port, username=username, pkey=private_key)

        # 执行命令
        stdin, stdout, stderr = ssh_client.exec_command(command)

        # 获取命令输出和错误信息
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')

        return output, error

    except Exception as e:
        return None, str(e)

    finally:
        # 关闭 SSH 连接
        ssh_client.close()

# 示例:使用密钥连接到远程服务器并执行命令
if __name__ == "__main__":
    hostname = "your.server.com"  # 服务器地址
    port = 22                     # SSH 端口
    username = "your_username"    # 用户名
    key_path = "/path/to/private_key"  # 私钥文件路径
    command = "ls -l /home"       # 要执行的 Shell 命令

    # 执行命令
    output, error = ssh_exec_command_with_key(hostname, port, username, key_path, command)

    if output:
        print("命令输出:")
        print(output)
    if error:
        print("错误信息:")
        print(error)

6. 笑话时间

在学习的过程中,别忘了放松一下!以下是几个程序员专属笑话:

  1. 程序员的第一条戒律

    • 程序员的第一条戒律是:不要谈论代码。第二条戒律是:不要谈论代码。第三条戒律是:如果代码能运行,就不要碰它!😅
  2. 程序员的日常

    • 程序员的生活就是:写代码 -> 发现 Bug -> 修 Bug -> 写代码 -> 发现 Bug -> 修 Bug -> 无限循环。🔄
  3. 程序员的梦想

    • 程序员的梦想是什么?写一段代码,然后让它自己运行,自己去度假!🏖️

7. 总结

通过 paramiko 库,Python 可以轻松实现 SSH 连接并执行远程 Shell 命令。无论是密码认证还是密钥认证,paramiko 都提供了简单易用的接口。

如果你需要更高级的功能(如文件传输、会话保持等),可以进一步探索 paramiko 的文档和示例。

如果你有任何问题,或者想获取完整代码,欢迎在后台私信我!我们下次再见! 😄


问题留给你

  • 你平时用 Shell 命令做什么?
  • 你有没有遇到过因为 Shell 命令写错而引发的“灾难”?
  • 如果你有一个万能 Shell 命令,你最想实现什么功能?

欢迎在评论区分享你的故事!🎉