如何用Python在远程机器上执行Shell命令?

2021年11月16日15:29:19 发表评论 1,310 次浏览

Python如何在远程机器执行Shell命令?本文带你学习如何使用 paramiko 库在 Python 中的远程机器上执行 shell 命令和脚本。

你有没有想过在你的 Linux 机器上以远程方式快速执行某些命令?或者你想在你的服务器中定期执行一些代码行来自动化吗?在本教程中,你将学习如何编写一个简单的 Python 脚本来在你的 Linux 机器上远程执行 shell 命令,下面有详细的Python远程执行Shell命令示例

相关文章: 如何在 Python 中暴力破解 SSH 服务器。

Python如何远程执行Shell命令?我们将使用paramiko库,让我们安装它:

pip3 install paramiko

定义一些连接凭据:

import paramiko

hostname = "192.168.1.101"
username = "test"
password = "abc123"

在上面的代码中,我定义了主机名、用户名和密码,这是我的本地 Linux 机器,你需要根据情况编辑这些变量,或者你可能想像我们一样使用argparse模块进行命令行参数解析通常做这样的任务。

请注意,使用此类凭据连接到 SSH 是不安全的,你可以将 SSH 侦听器守护程序配置为仅接受公共身份验证密钥,而不是使用密码。但是,出于演示目的,我们将使用密码。

执行 Shell 命令

Python远程执行Shell命令示例:现在让我们创建一个你希望在该远程机器上执行的命令列表:

commands = [
    "pwd",
    "id",
    "uname -a",
    "df -h"
]

在这种情况下,只是输出一些有关操作系统的有用信息的简单命令。

Python如何在远程机器执行Shell命令?下面的代码负责启动SSH客户端并连接到服务器:

# initialize the SSH client
client = paramiko.SSHClient()
# add to known hosts
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    client.connect(hostname=hostname, username=username, password=password)
except:
    print("[!] Cannot connect to the SSH Server")
    exit()

现在让我们遍历刚刚定义的命令并一一执行它们:

# execute the commands
for command in commands:
    print("="*50, command, "="*50)
    stdin, stdout, stderr = client.exec_command(command)
    print(stdout.read().decode())
    err = stderr.read().decode()
    if err:
        print(err)

这是我的结果:

================================================== pwd ==================================================
/home/test

================================================== id ==================================================
uid=1000(test) gid=0(root) groups=0(root),27(sudo)

================================================== uname -a ==================================================
Linux rockikz 4.17.0-kali1-amd64 #1 SMP Debian 4.17.8-1kali1 (2018-07-24) x86_64 GNU/Linux

================================================== df -h ==================================================
Filesystem      Size  Used Avail Use% Mounted on
udev            1.9G     0  1.9G   0% /dev
tmpfs           392M  6.2M  386M   2% /run
/dev/sda1       452G  410G   19G  96% /
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
tmpfs           392M   12K  392M   1% /run/user/131
tmpfs           392M     0  392M   0% /run/user/1000

太棒了,这些命令 在我的 Linux 机器上成功执行了!

执行脚本

Python如何远程执行Shell命令?现在你已经知道如何一个一个地执行命令,让我们深入一点并执行整个 shell ( .sh ) 脚本。

考虑这个脚本(名为"script.sh"):

cd Desktop
mkdir test_folder
cd test_folder
echo "$PATH" > path.txt

Python远程执行Shell命令示例:在后SSH连接,而不是为迭代的命令,现在我们看到这个剧本的内容和执行:

# read the BASH script content from the file
bash_script = open("script.sh").read()
# execute the BASH script
stdin, stdout, stderr = client.exec_command(bash_script)
# read the standard output and print it
print(stdout.read().decode())
# print errors if there are any
err = stderr.read().decode()
if err:
    print(err)
# close the connection
client.close()

exec_command()方法使用默认 shell(BASH、SH或任何其他)执行脚本并分别返回标准输入、标准输出和标准错误,如果有,我们将从stdout和stderr读取,然后我们关闭SSH连接。

执行上述代码后,在Desktop中创建了一个新文件test_folder并在其中包含一个包含全局$PATH变量的文本文件:

如何用Python在远程机器上执行Shell命令?

结论

Python如何在远程机器执行Shell命令?如你所见,这对许多场景都很有用,例如,你可能只想通过远程执行 Python 脚本来管理你的服务器,你可以为所欲为!

顺便说一句,如果你想在远程服务器上运行更复杂的作业,你可能需要查看Ansible

Python如何远程执行Shell命令?你还可以使用Fabric库,因为它是一个高级 Python 库,旨在通过 SSH 远程执行 shell 命令,它构建在InvokeParamiko之上。

你可以随意编辑代码,例如,你可能希望使用argparse解析命令行参数。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: