首页 > 编程问答 >Wexpect ssh授权脚本

Wexpect ssh授权脚本

时间:2024-07-27 06:04:51浏览次数:7  
标签:python ssh pexpect

所以我有这段代码,它没有输出任何内容,也没有运行脚本

import wexpect
import sys



child = wexpect.spawn("ssh user@ip")
child.logfile = sys.stdout
child.expect("user@ip's password:")
child.logfile = sys.stdout
child.sendline('user_password')
child.logfile = sys.stdout
child.expect('$')
child.logfile = sys.stdout
child.sendline('sudo su')
child.logfile = sys.stdout

我已经尝试了一切,红色了文档,但它仍然无法工作


以下是关于为什么你的 wexpect 脚本无法按预期工作的故障排除步骤和可能的解释:

  1. sudo 提示符的变化:

  2. 问题: sudo 命令通常不会显示 $ 作为其提示符。它更有可能显示 [sudo] password for user: 或类似的内容。你的脚本正在寻找一个 $ 符号,该符号可能永远不会出现,导致它挂起。

  3. 解决方案: child.expect('$') 替换为:

    python child.expect(r"\[sudo\] password for user: ") 这会查找更具体的 sudo 密码提示。

  4. 启用 sudo 密码提示:

  5. 问题: 你的 sudo 配置可能被设置为使用交互式基于 TTY 的提示,而 wexpect 默认情况下无法与之交互。

  6. 解决方案: 在远程服务器上编辑 /etc/sudoers 文件(使用 visudo 命令更安全),并确保目标用户的 sudoers 条目包含 requiretty 选项之前的注释字符 ( # )。这将允许 sudo 在非交互式会话中工作。

    #Defaults requiretty

  7. 密码提示的处理:

  8. 问题: child.sendline('sudo su') 命令本身可能会提示输入密码,而你的脚本当前没有处理这个提示。

  9. 解决方案: sendline('sudo su') 之后添加一个 child.expect() 调用来捕获密码提示,然后发送密码:

    python child.sendline('sudo su') child.expect(r"\[sudo\] password for user: ") child.sendline('user_password')

  10. 时间问题:

  11. 问题: 网络延迟或远程服务器上的高负载可能会导致命令执行和预期输出之间的延迟。

  12. 解决方案: 增加 wexpect 在超时之前的等待时间。你可以使用 child.expect(pattern, timeout=seconds) 为各个 expect 调用或使用 child.settimeout(seconds) 全局设置超时。例如:

    python child.settimeout(10) # 将超时设置为 10 秒

修改后的代码:

import wexpect
import sys

child = wexpect.spawn("ssh user@ip")
child.logfile = sys.stdout
child.expect("user@ip's password:")
child.sendline('user_password')
child.expect(r"[$#] ")  # 匹配 $ 或 # 提示符
child.sendline('sudo su')
child.expect(r"\[sudo\] password for user: ")
child.sendline('user_password') 
child.expect(r"[$#] ") # 匹配 $ 或 # 提示符
# 现在你应该具有 root 权限
child.sendline('your_script.sh') 
# ... rest of your code

其他提示:

  • 调试: 如果问题仍然存在,请在每个步骤添加 print(child.before) 语句,以查看 wexpect 收到的确切输出。这将有助于查明脚本挂起的位置以及预期和实际输出之间的任何差异。
  • 密钥身份验证: 为了提高安全性并避免在脚本中硬编码密码,请考虑为 SSH 连接设置密钥身份验证。
  • 错误处理: 实现错误处理机制以优雅地处理意外情况,例如连接失败或意外提示。

请记住用你的实际用户名、IP 地址、密码和脚本名称替换占位符值。

通过解决这些潜在问题,你应该能够创建一个可靠地通过 SSH 连接到你的服务器、提升权限并执行你的脚本的 wexpect 脚本。

标签:python,ssh,pexpect
From: 78799989

相关文章

  • 使用 Python 打开保存为 Parquet 文件中元数据的 R data.table
    使用R,我创建了一个Parquet文件,其中包含一个data.table作为主要数据,另一个data.table作为元数据。library(data.table)library(arrow)dt=data.table(x=c(1,2,3),y=c("a","b","c"))dt2=data.table(a=22222,b=45555)attr(dt,&......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......
  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......
  • 使用特定的Python版本(MacOS)制作virtualenv
    我安装了brew,python3(默认和最新版本)和pip3,pyenv。TensorFlow现在不支持python3.7,所以我听说我应该制作一个独立运行3.6或更低版本的virtualenv。我安装了python3.6.7bypyenvinstall3.6.7但无法制作virtualenv-p3.6.7(mydir)因为3.6.7不在P......
  • 使用Python去除图像中的线条
    我正在尝试使用Python和cv2、numpy、skimage等从黑白图像中删除“阴影线”(如果图像中存在“阴影线”)。本质上,我的图像可以有1或2条曲线,如下例所示。但每条线都有一条1-5像素外的阴影线,需要删除。我怎样才能在Python中做到这一点?原始......
  • Python 和 OpenCV:如何裁剪半成形边界框
    我有一个为无网格表创建网格线的脚本:脚本之前:脚本之后:是否有一种简单的方法,使用OpenCV来裁剪“脚本之后”图像,使其仅包含四边边界框?示例输出:编辑:我目前正在研究一种解决方案,该解决方案可以找到垂直/水平方向的第一条/最后一条......
  • 使用类型提示将 Python 转换为 Cython
    类型提示现在在Python3.5版本中可用。在规范(PEP484)中,目标(和非目标)被明确暴露:#RationaleandGoals此PEP旨在为类型注释提供标准语法,开放Python代码更容易静态分析和重构、潜在的运行时类型检查以及(也许在某些情况下)利用类型信息生成代码。......
  • 在 Python 类型提示中区分 PySpark 和 Pandas DataFrame (PyCharm)
    在PyCharm中,如果使用apyspark.sql.DataFrame代替pandas.DataFrame,类型提示似乎不会触发警告,反之亦然。例如以下代码根本不会生成任何警告:frompyspark.sqlimportDataFrameasSparkDataFramefrompandasimportDataFrameasPandasDataFramedef......
  • 如何在Python中继承类型提示?
    所以我的问题是,当我有一个A类型的类来做事情并且我使用这些函数作为subclass(B)时,它们仍然是类A的类型,并且不接受我的类B对象作为参数或作为函数签名。我的问题简化了:fromtypingimportTypeVar,Generic,CallableT=TypeVar('T'......