python——ssh

一、ssh连接、执行命令、打印输出

import paramiko

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

# 自动添加主机名和密钥到本地的known_hosts文件
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接到远程主机
client.connect('远程主机IP', username='用户名', password='密码')

# 执行命令
stdin, stdout, stderr = client.exec_command('要执行的命令')

# 打印命令的输出
print(stdout.read().decode())
# 封装成函数时可以:
# return stdout.read().decode('utf-8', errors='ignore'), stderr.read().decode('utf-8', errors='ignore'), 

注意:

        exec_command每次通过开一个新的Channel来执行传输的命令,因此只能执行一条命令,也就是说第一行执行exec_command("cd xxx"),第二行想在第一行cd的基础上执行exec_command(tar -xzvf xxx)是不行的,因为每次执行完都会回到根目录,所以无法第一次cd切换路径,第二次去该路径进行操作

        解决方法:在exec_command中一次执行多个命令,把要执行的命令之间用 \n 分开,且最后一个命令后不要带\n

import paramiko

# cd到一个目录后进行压缩包解压
stdin, stdout, stderr = client.exec_command("cd /hone/documents\n tar -xzvf abc.tar.gz")

# 如果涉及到入参拼接,\n怎么放
# cd进去,再cd进解压后的文件夹,最后执行安装
file_path = /home/documents
folder= abc
stdin, stdout, stderr = client.exec_command("cd " + file_path + "\n cd " + abc + "\n bash install.sh")

二、如何保持shell窗口一直连接状态

        exec_command每次执行后都会退出当前的shell

        如果想在当前的shell下根据输出提示持续输出(比如密码卸载、ftp传输文件、vim等),此时就需要使用invoke_shell

import paramiko
import time

# 创建连接、添加密钥、远程的操作见上面的介绍,此处省略...
# 封装一个ftp传输文件的函数
def ftp_trans_file():
    ftp_file_path = "/home/user/文件集"
    ftp_file_name = "123.txt"
    ftp_host = 10.xx.xx.xx
    ftp_username = aaa
    ftp_password = 123456

    shell = client.invoke_shell()
    shell.send("cd " + ftp_file_path + "\n ftp\n")  # cd到文件目录下,输入ftp,第一个\n用于连续执行两条命令,第二个\n是用于输入ftp后换行(模拟按下enter键)
    time.sleep(1)
    shell.send("open " + ftp_host + "\n")  # 打开文件传输ip,并按回车
    time.sleep(1)
    shell.send(ftp_username + "\n")  # 输入用户名
    time.sleep(1)
    shell.send(ftp_password + "\n")  # 输入密码
    time.sleep(1)
    shell.send("put " + ftp_file_name + "\n")  # 输入密码
    time.sleep(1)
    data = shell.recv(9999).decode('utf-8')  # 获取传输文件前后所有的提示语
    shell.send('exit\n')  # 退出
    shell.close()  # 关闭
    return data

扩展:

        shell模拟enter键:shell.send("\n")

        shell模拟esc键:shell.sned("\x1b")

三、补充

1、exec_command与invoke_shell的区别

        invoke_shell使用的是SSH shell channel的方式执行,具备持久化能力,类似于MobaXterm,

        shell命令用exec_command

        shell脚本用invoke_shell

2、使用invoke_shell的情况下,获取值,处理后再给值(密码卸载)

        将shell.recv放在中间,上面的shell.recv放在了最后,是接收了所有消息

import paramiko
import time

# 创建连接、添加密钥、远程的操作见上面的介绍,此处省略...
# 封装一个ftp传输文件的函数
def ftp_trans_file():
    shell = client.invoke_shell()
    shell.send("cd /usr/local/bin\n ./unins\n")  # cd到卸载目录下,输入./unins,第一个\n用于连续执行两条命令,第二个\n是用于输入./unins后换行(模拟按下enter键)
    time.sleep(2)
    data = shell.recv(9999).decode('utf-8')  # 获取系统返回的那一行的信息
    text = data.split()[-1]  # 括号内不给值表示默认从空格、换行进行切割
    print(text)  # 获取到了卸载码
    # 以下应该要把卸载码取出后回win上进行生成执行码,然后将执行码继续输入执行卸载,省略...
    shell.send('exit\n')  # 退出
    shell.close()  # 关闭
    return data

`paramiko.SSHClient` 是 Paramiko 库提供的一个用于简化 SSH 协议操作的高级接口。它主要用于远程服务器管理和自动化任务,例如通过 SSH 执行命令、传输文件等。下面是关于 `SSHClient` 的详细介绍及其基本用法: ### 初始化 SSH 客户端 创建一个新的 SSH 客户端实例非常简单: ```python import paramiko ssh_client = paramiko.SSHClient() ``` 这一步骤实际上并没有建立任何网络连接;只是初始化了一个客户端对象供后续配置和使用。 ### 设置主机密钥策略 为了能够自动添加未知主机到本地信任列表中(类似 ssh-keygen),我们需要设置 HostKeys 策略,默认情况下会抛出异常如果遇到新的主机指纹: ```python # 自动接受所有新主机并保存至缓存 ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ``` 这里还可以选择其他的策略比如 `WarningPolicy()` 或者手动验证每个主机键。 ### 连接到远程主机 接下来就是最重要的步骤——连接到目标机器: ```python ssh_client.connect( hostname='example.com', # 主机名或IP地址 port=22, # 默认端口是22 username='your_username', password='your_password' ) ``` 当然也可以利用私钥来进行认证而不是密码: ```python private_key_path = '/path/to/private/key' key = paramiko.RSAKey.from_private_key_file(private_key_path) ssh_client.connect( hostname='example.com', port=22, username='your_username', pkey=key ) ``` ### 发送指令及获取结果 一旦成功建立了连接,就可以开始发送命令并在程序内部捕获输出: ```python stdin, stdout, stderr = ssh_client.exec_command('ls -l') output = stdout.read().decode() print(output) # 显示命令返回的结果 ``` 此外还有专门针对 SFTP 文件系统的 API 可以调用来上传下载文件等内容。 ### 断开连接 最后别忘了断开与远端服务之间的链接以免占用资源: ```python ssh_client.close() ``` 总结来说,`paramiko.SSHClient` 提供了一系列强大功能帮助你在 Python 中便捷地完成基于 SSH 操作的各种需求。无论是批量部署应用还是定期检查系统状态都非常实用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值