<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=%E4%B8%80%E4%BA%9B%E4%BD%BF%E7%94%A8_Python_%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E8%84%9A%E6%9C%AC</id>
	<title>一些使用 Python 进行自动化运维的示例脚本 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=%E4%B8%80%E4%BA%9B%E4%BD%BF%E7%94%A8_Python_%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E8%84%9A%E6%9C%AC"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=%E4%B8%80%E4%BA%9B%E4%BD%BF%E7%94%A8_Python_%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E8%84%9A%E6%9C%AC&amp;action=history"/>
	<updated>2026-04-19T09:16:30Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=%E4%B8%80%E4%BA%9B%E4%BD%BF%E7%94%A8_Python_%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E8%84%9A%E6%9C%AC&amp;diff=1177&amp;oldid=prev</id>
		<title>Evan：​/* 远程服务器管理（使用 Paramiko 库） */</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=%E4%B8%80%E4%BA%9B%E4%BD%BF%E7%94%A8_Python_%E8%BF%9B%E8%A1%8C%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E7%9A%84%E7%A4%BA%E4%BE%8B%E8%84%9A%E6%9C%AC&amp;diff=1177&amp;oldid=prev"/>
		<updated>2024-10-19T09:39:04Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;远程服务器管理（使用 Paramiko 库）&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:devops]] [[category:python]] &lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=一、文件备份=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
python&lt;br /&gt;
复制&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
source_directory = &amp;#039;/path/to/source&amp;#039;&lt;br /&gt;
backup_directory = &amp;#039;/path/to/backup&amp;#039;&lt;br /&gt;
&lt;br /&gt;
timestamp = datetime.datetime.now().strftime(&amp;#039;%Y%m%d%H%M%S&amp;#039;)&lt;br /&gt;
backup_filename = f&amp;#039;backup_{timestamp}.zip&amp;#039;&lt;br /&gt;
&lt;br /&gt;
shutil.make_archive(f&amp;#039;{backup_directory}/{backup_filename}&amp;#039;, &amp;#039;zip&amp;#039;, source_directory)&lt;br /&gt;
&lt;br /&gt;
print(f&amp;#039;Backup completed: {backup_filename}&amp;#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=远程服务器管理（使用 Paramiko 库）=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import paramiko&lt;br /&gt;
&lt;br /&gt;
# 创建 SSH 对象&lt;br /&gt;
ssh = paramiko.SSHClient()&lt;br /&gt;
&lt;br /&gt;
# 允许连接不在 know_hosts 文件中的主机&lt;br /&gt;
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())&lt;br /&gt;
&lt;br /&gt;
# 连接服务器&lt;br /&gt;
ssh.connect(hostname=&amp;#039;remote_server_ip&amp;#039;, port=22, username=&amp;#039;your_username&amp;#039;, password=&amp;#039;your_password&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# 执行命令&lt;br /&gt;
stdin, stdout, stderr = ssh.exec_command(&amp;#039;ls -l&amp;#039;)&lt;br /&gt;
print(stdout.read().decode())&lt;br /&gt;
&lt;br /&gt;
# 关闭连接&lt;br /&gt;
ssh.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#using priky &lt;br /&gt;
➜  py cat pp.py &lt;br /&gt;
import paramiko&lt;br /&gt;
client =  paramiko.SSHClient()&lt;br /&gt;
#client = paramiko.SSHClient()&lt;br /&gt;
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())&lt;br /&gt;
client.connect(&amp;#039;192.168.10.5&amp;#039;,22,username=&amp;#039;evan&amp;#039;, key_filename=&amp;#039;/home/evan/.ssh/id_rsa&amp;#039;)&lt;br /&gt;
stdin, stdout, stderr = client.exec_command(&amp;#039;ls -l&amp;#039;)&lt;br /&gt;
print(stdout.read().decode())&lt;br /&gt;
client.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
➜  py py3 pp.py&lt;br /&gt;
total 24704&lt;br /&gt;
-rw-r--r--  1 evan evan       125 Dec 30  2018 1&lt;br /&gt;
drwxr-xr-x  2 evan evan      4096 Jul  1  2019 11&lt;br /&gt;
-rw-r--r--  1 evan evan      1143 Jan 26  2021 #1.txt#&lt;br /&gt;
-rw-r--r--  1 evan evan      1133 Jan 26  2021 1.txt~&lt;br /&gt;
-rw-r--r--  1 evan evan        84 Feb 13  2019 du&lt;br /&gt;
drwxr-xr-x  3 evan evan      4096 Oct 15  2018 github&lt;br /&gt;
-rwxr-xr-x  1 evan evan  12517376 Aug 28  2023 gost-linux-armv6&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# 上传文件到远程服务器&lt;br /&gt;
import paramiko&lt;br /&gt;
&lt;br /&gt;
def depoly_m(ip):&lt;br /&gt;
    with paramiko.SSHClient() as client:&lt;br /&gt;
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())&lt;br /&gt;
        client.connect(ip,22,username=&amp;#039;evan&amp;#039;, key_filename=&amp;#039;/home/evan/.ssh/id_rsa&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
        stdin, stdout, stderr = client.exec_command(&amp;#039;ls -l&amp;#039;)&lt;br /&gt;
        print(stdout.readlines())&lt;br /&gt;
&lt;br /&gt;
        with client.open_sftp() as sftp:&lt;br /&gt;
            sftp.put(&amp;#039;/home/evan/data/tmp/py/pscp.py&amp;#039;, &amp;#039;/tmp/pscp.py&amp;#039;)&lt;br /&gt;
            # //sftp.chmod(path, mode, *, dir_fd=None, follow_symlinks=True)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with  open(&amp;#039;hosts&amp;#039;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            depoly_m(line.strip())&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== trouble ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
➜  py py3  paramiko.py&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;/home/evan/data/tmp/py/paramiko.py&amp;quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
    import paramiko&lt;br /&gt;
  File &amp;quot;/home/evan/data/tmp/py/paramiko.py&amp;quot;, line 2, in &amp;lt;module&amp;gt;&lt;br /&gt;
    client = paramiko.SSHClient()&lt;br /&gt;
             ^^^^^^^^^^^^^^^^^^&lt;br /&gt;
AttributeError: partially initialized module &amp;#039;paramiko&amp;#039; has no attribute &amp;#039;SSHClient&amp;#039; (most likely due to a circular import)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
哈哈 笑死了 名字问题&lt;br /&gt;
If you have nay file in your local system by the name of &amp;quot;paramiko&amp;quot;. The code is going to import that paramiko instead of the python paramiko. You need to rename the file simply and the error will be gone.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
https://stackoverflow.com/questions/25409977/paramiko-module-object-has-no-attribute-error-sshclient&lt;br /&gt;
&lt;br /&gt;
=监控服务器资源（使用 psutil 库）=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import psutil&lt;br /&gt;
&lt;br /&gt;
# 获取 CPU 使用率&lt;br /&gt;
cpu_percent = psutil.cpu_percent(interval=1)&lt;br /&gt;
print(f&amp;#039;CPU usage: {cpu_percent}%&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# 获取内存使用情况&lt;br /&gt;
memory = psutil.virtual_memory()&lt;br /&gt;
print(f&amp;#039;Memory usage: {memory.used / memory.total * 100}%&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# 获取磁盘空间&lt;br /&gt;
disk = psutil.disk_usage(&amp;#039;/&amp;#039;)&lt;br /&gt;
print(f&amp;#039;Disk usage: {disk.used / disk.total * 100}%&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=自动部署应用（假设使用 Flask 应用） =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import shutil&lt;br /&gt;
&lt;br /&gt;
# 源应用目录&lt;br /&gt;
app_source_directory = &amp;#039;/path/to/app_source&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# 目标服务器目录&lt;br /&gt;
server_directory = &amp;#039;/path/to/server&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# 复制应用文件到服务器目录&lt;br /&gt;
shutil.copytree(app_source_directory, f&amp;#039;{server_directory}/app&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# 在服务器上安装依赖&lt;br /&gt;
os.system(f&amp;#039;cd {server_directory}/app &amp;amp;&amp;amp; pip install -r requirements.txt&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
# 启动应用&lt;br /&gt;
os.system(f&amp;#039;cd {server_directory}/app &amp;amp;&amp;amp; python app.py &amp;amp;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=批量文件重命名 =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
directory = &amp;#039;/path/to/directory&amp;#039;&lt;br /&gt;
&lt;br /&gt;
for filename in os.listdir(directory):&lt;br /&gt;
    if filename.startswith(&amp;#039;old_prefix_&amp;#039;):&lt;br /&gt;
        new_filename = filename.replace(&amp;#039;old_prefix_&amp;#039;, &amp;#039;new_prefix_&amp;#039;)&lt;br /&gt;
        os.rename(os.path.join(directory, filename), os.path.join(directory, new_filename))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=1. 远程服务器登录和命令执行 (使用 Paramiko) =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paramiko 是一个用于通过 SSH 协议与远程服务器进行交互的库。&lt;br /&gt;
import paramiko&lt;br /&gt;
&lt;br /&gt;
def execute_remote_command(hostname, username, password, command):&lt;br /&gt;
    try:&lt;br /&gt;
        # 创建 SSH 客户端&lt;br /&gt;
        ssh = paramiko.SSHClient()&lt;br /&gt;
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())&lt;br /&gt;
        &lt;br /&gt;
        # 连接到远程主机&lt;br /&gt;
        ssh.connect(hostname, username=username, password=password)&lt;br /&gt;
        &lt;br /&gt;
        # 执行命令&lt;br /&gt;
        stdin, stdout, stderr = ssh.exec_command(command)&lt;br /&gt;
        print(f&amp;quot;Output: {stdout.read().decode()}&amp;quot;)&lt;br /&gt;
        print(f&amp;quot;Error: {stderr.read().decode()}&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        ssh.close()&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(f&amp;quot;An error occurred: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
execute_remote_command(&amp;#039;192.168.1.100&amp;#039;, &amp;#039;admin&amp;#039;, &amp;#039;password123&amp;#039;, &amp;#039;ls -l&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=2. 监控磁盘空间 (使用 psutil 库)=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
psutil 是一个跨平台库，用于系统和进程监控，特别适用于磁盘、CPU、内存等资源的监控。&lt;br /&gt;
import psutil&lt;br /&gt;
&lt;br /&gt;
def check_disk_usage(threshold=80):&lt;br /&gt;
    disk_usage = psutil.disk_usage(&amp;#039;/&amp;#039;)&lt;br /&gt;
    usage_percent = disk_usage.percent&lt;br /&gt;
    if usage_percent &amp;gt; threshold:&lt;br /&gt;
        print(f&amp;quot;警告：磁盘使用率已达到 {usage_percent}%&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(f&amp;quot;磁盘使用正常：使用率为 {usage_percent}%&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
check_disk_usage()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
= 3. 自动化日志轮替=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
此脚本可以自动将日志文件备份并清空原文件，用于日志轮替的简单管理。&lt;br /&gt;
import os&lt;br /&gt;
import shutil&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
def rotate_logs(log_file):&lt;br /&gt;
    if os.path.exists(log_file):&lt;br /&gt;
        # 生成备份文件名&lt;br /&gt;
        backup_file = log_file + &amp;#039;.&amp;#039; + time.strftime(&amp;#039;%Y%m%d%H%M%S&amp;#039;) + &amp;#039;.bak&amp;#039;&lt;br /&gt;
        shutil.copy(log_file, backup_file)&lt;br /&gt;
        &lt;br /&gt;
        # 清空原日志文件&lt;br /&gt;
        open(log_file, &amp;#039;w&amp;#039;).close()&lt;br /&gt;
        print(f&amp;quot;日志文件已备份至 {backup_file}，并已清空原文件。&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;日志文件不存在！&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
rotate_logs(&amp;#039;/var/log/my_app.log&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 网络监控：检测主机是否在线 (使用 ping)=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
这个脚本用来检测一系列主机是否在线，并记录结果。&lt;br /&gt;
import os&lt;br /&gt;
&lt;br /&gt;
def ping_host(hostname):&lt;br /&gt;
    response = os.system(f&amp;quot;ping -c 1 {hostname}&amp;quot;)&lt;br /&gt;
    if response == 0:&lt;br /&gt;
        print(f&amp;quot;{hostname} is up&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(f&amp;quot;{hostname} is down&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
hosts = [&amp;#039;192.168.1.1&amp;#039;, &amp;#039;192.168.1.2&amp;#039;, &amp;#039;google.com&amp;#039;]&lt;br /&gt;
for host in hosts:&lt;br /&gt;
    ping_host(host)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=5. 自动化备份数据库 (MySQL) =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import os&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
def backup_mysql_db(user, password, db_name, backup_dir):&lt;br /&gt;
    if not os.path.exists(backup_dir):&lt;br /&gt;
        os.makedirs(backup_dir)&lt;br /&gt;
&lt;br /&gt;
    backup_file = os.path.join(backup_dir, f&amp;quot;{db_name}_{time.strftime(&amp;#039;%Y%m%d%H%M%S&amp;#039;)}.sql&amp;quot;)&lt;br /&gt;
    dump_command = f&amp;quot;mysqldump -u {user} -p{password} {db_name} &amp;gt; {backup_file}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    os.system(dump_command)&lt;br /&gt;
    print(f&amp;quot;数据库备份完成：{backup_file}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
backup_mysql_db(&amp;#039;root&amp;#039;, &amp;#039;password123&amp;#039;, &amp;#039;my_database&amp;#039;, &amp;#039;/backup&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=6. 重启服务 (使用 subprocess 库) =&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import subprocess&lt;br /&gt;
&lt;br /&gt;
def restart_service(service_name):&lt;br /&gt;
    try:&lt;br /&gt;
        subprocess.run([&amp;#039;systemctl&amp;#039;, &amp;#039;restart&amp;#039;, service_name], check=True)&lt;br /&gt;
        print(f&amp;quot;{service_name} 服务已重启&amp;quot;)&lt;br /&gt;
    except subprocess.CalledProcessError as e:&lt;br /&gt;
        print(f&amp;quot;重启 {service_name} 失败: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
restart_service(&amp;#039;nginx&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 7. 自动化服务器健康检查=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
这个脚本综合了 CPU 使用率、内存使用情况和磁盘使用情况，检查服务器的健康状态。&lt;br /&gt;
import psutil&lt;br /&gt;
&lt;br /&gt;
def check_system_health(cpu_threshold=85, memory_threshold=80, disk_threshold=80):&lt;br /&gt;
    # 检查 CPU 使用率&lt;br /&gt;
    cpu_usage = psutil.cpu_percent(interval=1)&lt;br /&gt;
    if cpu_usage &amp;gt; cpu_threshold:&lt;br /&gt;
        print(f&amp;quot;CPU 使用率过高：{cpu_usage}%&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    # 检查内存使用情况&lt;br /&gt;
    memory_info = psutil.virtual_memory()&lt;br /&gt;
    if memory_info.percent &amp;gt; memory_threshold:&lt;br /&gt;
        print(f&amp;quot;内存使用率过高：{memory_info.percent}%&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    # 检查磁盘使用情况&lt;br /&gt;
    disk_info = psutil.disk_usage(&amp;#039;/&amp;#039;)&lt;br /&gt;
    if disk_info.percent &amp;gt; disk_threshold:&lt;br /&gt;
        print(f&amp;quot;磁盘使用率过高：{disk_info.percent}%&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    if cpu_usage &amp;lt;= cpu_threshold and memory_info.percent &amp;lt;= memory_threshold and disk_info.percent &amp;lt;= disk_threshold:&lt;br /&gt;
        print(&amp;quot;系统状态正常&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 示例调用&lt;br /&gt;
check_system_health()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
分享一些使用 Python 进行系统配置管理的示例脚本&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>