python——ssh

本文介绍了使用Python的paramiko库进行SSH连接,包括执行单条或多条命令的方法,以及如何通过invoke_shell保持shell窗口连接并执行shell脚本,同时讨论了exec_command与invoke_shell的区别。还展示了在invoke_shell中处理FTP传输文件和密码卸载的示例。
部署运行你感兴趣的模型镜像

一、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

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 如何在 VSCode 中通过 SSH 设置 Python 解释器 #### 安装必要的插件 为了能够顺利地通过SSH连接到远程服务器并在其中配置Python解释器,需要先安装Remote - SSH插件以及Python插件。确保这两个插件都已正确安装并启用。 #### 创建SSH连接 点击左侧活动栏中的 Remote Explorer 图标,随后点击顶部的 `+` 号来创建新的SSH会话。此时应当在一个弹出框内输入如下所示的命令: ```bash ssh username@ip -p port ``` 这里的`username`代表远程服务器上的用户名;`ip`则是该服务器的IP地址;而`port`指的是用于建立此链接所使用的端口,默认情况下可以省略此项[^3]。 完成上述操作后按Enter键确认,并指定一个位置存储`.ssh/config`文件以便将来快速访问这些设定好的连接参数。通常建议将其存放在本地计算机用户的主目录下的.ssh子文件夹里。 #### 建立与远程主机的安全通道 当一切就绪之后,可以从列表中挑选之前定义的目标来进行实际连接尝试。一旦选择了对应条目,则会被询问是否要在现有窗口还是新开窗口启动此次会话——任选其一即可继续前进。接下来按照屏幕指示依次做出选择直至最终达成安全登录状态为止。 #### 选取合适的Python环境作为默认解释器 成功登陆至远端机器以后,便可以在资源管理视图里面浏览那些位于那里的项目结构了。与此同时,务必记得前往左边侧边栏寻找名为“Extensions”的部分,激活针对Python的支持特性(如果尚未自动加载的话)。做完这一切准备工作之后,留意观察编辑界面底部的状态栏区域是否存在有关于编程语言的信息显示。如果有,请单击它触发选项菜单,在那里应该能看到一系列可供选用的不同版本号或者是Anaconda之类的虚拟envs实例供君采撷[^1]。 #### 处理可能遇到的问题 倘若发现无法识别任何有效的Python解析引擎存在,那么可能是由于某些原因导致软件内部缓存出现了混乱状况所致。这时不妨考虑采取极端手段彻底清除掉所有相关联的数据记录以求恢复初始纯净态。具体做法为:关闭Visual Studio Code应用程序本身,借助快捷组合键Ctrl + H调用查找替换工具定位到个人资料库路径`\home\user\.config`之下,将整个名为`code`的子目录予以移除处理。这样一来就能重新开始构建正确的设置流程而不受先前残留因素干扰了[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值